C# Nmodbus通讯断线重连(记录) | 您所在的位置:网站首页 › plc通信connect › C# Nmodbus通讯断线重连(记录) |
库文件 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 实验室设备网 版权所有 |