C# Nmodbus通讯断线重连(记录) 您所在的位置:网站首页 plc通信connect C# Nmodbus通讯断线重连(记录)

C# Nmodbus通讯断线重连(记录)

2023-05-07 05:59| 来源: 网络整理| 查看: 265

库文件 using NModbus;

通讯用变量  public  bool isConnect { get; set; }

                    public IModbusMaster? master { get; set; }

                    public TcpClient? tcpClient { get; set; }       

                    public ModbusFactory factory { get; set; }

创建通讯连接方法

public  void Connect(string IP, int Port)

        {

            try

            {

                tcpClient = new TcpClient(IP, Port);     //建立TCP连接

                master = factory.CreateMaster(tcpClient);//创建master

                isConnect = true;                        //创建成功时标志位设为 true;

            }

            catch

            {

                isConnect = false;                       //创建失败时标志位设为 flase

                tcpClient?.Close();                      //关闭TCP连接

            }

        }

创建读取数据方法

public  void HD_Read()

        {

            if (master != null)    

            {

                try

                {

                    ushort[] a = master.ReadHoldingRegisters(1, 0, 1);  //modbus通讯函数

                 //因为之后该函数是在其他线程上调用,所以在UI线程上更新控件时需要使用委托

                    this.Dispatcher.Invoke(new Action(() => { this.textBlock1.Text = a[0].ToString(); }));

                }

                catch

                {

                   isConnect = false; //通讯失败时标志位设为 flase

            }

        }

创建通讯读取方法(在窗体构造函数内调用)

public void PLC_Reads()

        {

            factory = new ModbusFactory();    //创建实例

            Task.Run(() => {                   //通讯线程开启

               while (true)                   //循环

               {

                   if(!isConnect) { Connect("192.168.1.99", 520);Task.Delay(1000);} //如果通讯未连接,则执行通讯连接

                   else { HD_Read(); Task.Delay(100); }             //如果通讯已连接,则执行数据读取

                  Try    //UI界面显示通讯是否已连接  (try..catch..避免界面关闭时,Invoke报错)

                    {

                        this.Dispatcher.Invoke(() => { this.textBlock.Text = isConnect ? "设备已连接" : "设备已断开"; });  }

                    catch

                    {

                    }         

               }

             });

        }

 

调用

public MainWindow()

        {

            InitializeComponent();

            PLC_Reads();

        }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有