C#Modbus Tcp通讯,读取无线网关流量数据,断网自动重连

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

测试成功,正常运行

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sam*青华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值