110,567
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Windows.Forms;
using Modbus.Device;
using System.IO.Ports;
using MySql.Data.MySqlClient;
namespace Modbus72
{
public partial class MainForm : Form
{
private static IModbusMaster master;
private static SerialPort port;
//写线圈或写寄存器数组
private bool[] coilsBuffer;
private ushort[] registerBuffer;
//参数(分别为站号,起始地址,长度)
private byte slaveAddress;
private ushort startAddress;
private ushort startAddress1;
private ushort numberOfPoints;
private ushort numberOfPoints1;
//串口参数 串口名 波特率 校验 数据位 停止位
private string portName;
private int baudRate;
private Parity parity;
private int dataBits;
private StopBits stopBits;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
timer1.Interval = 3000;
btnstart.Enabled = true;
btnstop.Enabled = false;
}
private SerialPort InitSerialPortParameter()
{
if (cbxcom.SelectedIndex < 0)
{
MessageBox.Show("请选择串口号");
return null;
}
else
{
portName = cbxcom.SelectedItem.ToString();
baudRate = 19200;
parity = Parity.Even;
dataBits = 8;
stopBits = StopBits.One;
port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
return port;
}
}
private void btnread_Click(object sender, EventArgs e)
{
try
{
//初始化串口参数
InitSerialPortParameter();
master = ModbusSerialMaster.CreateRtu(port);
ExecuteFunction();
}
catch (Exception)
{
MessageBox.Show("初始化异常");
}
}
private void ExecuteFunction()
{
slaveAddress = byte.Parse("1");
string today = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
String connetStr = "server=10.10.20.5;port=3309;user=root;password=rootqsr; database=db_qualitymanager;";
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
//每次操作是要开启串口 操作完成后需要关闭串口
//目的是为了slave更换连接是不报错
if (port.IsOpen == false)
{
port.Open();
}
startAddress = ushort.Parse("0");
numberOfPoints = ushort.Parse("20");
//读取线圈
coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);
for (int i = 0; i < coilsBuffer.Length; i++)
{
bool m = coilsBuffer[i];//线圈状态
if (m == true)
{
//读取寄存器
int j = i * 4 + 6;
startAddress1 = ushort.Parse(j + "");
numberOfPoints1 = ushort.Parse("3");
registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress1, numberOfPoints1);
string x = registerBuffer[0] + "";
string y = registerBuffer[2] + "";
if (x == "0")
{
continue;
}
else
{
if (i < 10)
{
#region
string dpr = "z_0" + i;
conn.Open();
string sql = string.Format("insert into " + dpr + "(vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改寄存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
#endregion
}
else
{
#region
string dpr = "z_" + i;
conn.Open();
string sql = string.Format("insert into " + dpr + " (vultime,opetime,prdate) values ('{0}','{1}','{2}')", x, y, today);
MySqlCommand cmd = new MySqlCommand(sql, conn);
cmd.ExecuteNonQuery();
conn.Close();
//修改寄存器
string s = j + "";
startAddress = ushort.Parse(s);
string[] strarr = { "0" };
registerBuffer[0] = ushort.Parse(strarr[0]);
master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
#endregion
}
}
}
//SetMsg(coilsBuffer[i] + " ");
}
//SetMsg("\r\n");
port.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void SetMsg(string msg)
{
showdetail.Invoke(new Action(() => { showdetail.AppendText(msg); }));
}
private void btnclear_Click(object sender, EventArgs e)
{
showdetail.Clear();
}
private void btnstart_Click(object sender, EventArgs e)
{
timer1.Start();
btnstart.Enabled = false;
btnstop.Enabled = true;
}
private void btnstop_Click(object sender, EventArgs e)
{
timer1.Stop();
btnstart.Enabled = true;
btnstop.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
btnread.PerformClick();
}
}
}