NuGet引用EasyModbusTCP安装包
窗体实例化、ModbusClient实例化
//窗体加载,设置listview列的宽度
public void Form1_Load1(object sender, EventArgs e)
{
this.lst_Recv.Columns[1].Width = this.lst_Recv.ClientSize.Width - this.lst_Recv.Columns[0].Width;
}
public string jsss;
public string jsll;
public string zsss;
public string zsll;
bool status;
//ModbusTCP 实例化
ModbusClient mc1 = new ModbusClient("192.168.1.195", 502);
ModbusClient mc2 = new ModbusClient("192.168.1.196", 502);
按钮事件,开启线程
//启动通讯按钮事件,开启线程
public void btn_qd_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(Roll));
th.IsBackground = true;
th.Start();
this.timer1.Start();
}
private void Roll()
{
try
{
mc1.Connect();
mc2.Connect();
if (mc1.Connected && mc2.Connected)
{
status = true;
AddLog("流量计已成功连接!");
}
}
catch (Exception)
{
status = false;
AddLog("流量计通讯断开!");
mc1.Disconnect();
mc2.Disconnect();
mc1.ConnectionTimeout = 5000;
mc2.ConnectionTimeout = 5000;
mc1.NumberOfRetries = 3;
mc2.NumberOfRetries = 3;
}
//循环读取数据
if (status)
{
try
{
while (true)
{
//原水流量计
int[] data1 = mc1.ReadHoldingRegisters(256, 4);
tb1_jsss.Text = data1[0].ToString();
byte[] c1 = BitConverter.GetBytes(data1[3]);
//字节数组高低转换
int a1 = c1[0] * 65535 + data1[2] + 22;
tb2_jjlj.Text = a1.ToString();
//中水流量计
int[] data2 = mc2.ReadHoldingRegisters(512, 4);
tb3_zsss.Text = data2[0].ToString();
byte[] c2 = BitConverter.GetBytes(data2[3]);
//字节数组高低转换
int a2 = c2[0] * 65535 + data2[2] + 1;
tb4_zsll.Text = a2.ToString();
Thread.Sleep(10000);
}
}
catch (Exception)
{
status = false;
AddLog("读取失败,通信中断!!");
mc1.Disconnect();
mc2.Disconnect();
}
}
}
C#现场与2台流量计通过无线网桥同时通信,连接不稳定,总是报"通讯失败"错误,代码中增加自动重连功能,成功解决。
//定时器事件中,自动重连
public void timer1_Tick(object sender, EventArgs e)
{
lb_time.Text = DateTime.Now.ToString("F");
LampColor1();
//断网自动重连
if (!mc1.Connected || !mc2.Connected)
{
AddLog("流量计自动重连!");
Thread th = new Thread(new ThreadStart(Roll));
//th.Abort();
th.IsBackground = true;
th.Start();
}
}
ListView消息方法
#region 接收信息的方法体
private string CurrentTime
{
get { return DateTime.Now.ToString("MM-dd HH:mm"); }
}
private void AddLog(string info)
{
if (!this.lst_Recv.InvokeRequired) //如果不是跨线程的
{
ListViewItem lst = new ListViewItem(CurrentTime);
lst.SubItems.Add(info);
lst_Recv.Items.Insert(lst_Recv.Items.Count, lst);
//如果ListView内容多于5行,自动清屏
if(lst_Recv.Items.Count>5)
{
lst_Recv.Items.Clear();
}
}
else //如果是跨线程
{
Invoke(new Action(() =>
{
ListViewItem lst = new ListViewItem(CurrentTime);
lst.SubItems.Add(info);
lst_Recv.Items.Insert(lst_Recv.Items.Count, lst);
if (lst_Recv.Items.Count > 5)
{
lst_Recv.Items.Clear();
}
}));
}
}
#endregion
测试成功,正常运行