using NModbus; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace GummingControl { public class DTM { private static ModbusFactory modbusFactory; private static IModbusMaster master; private static string IP = "192.168.1.5"; private static int Port = 502; public static void CreateLink() { if (!Global.IsRelease) { return; } //实际不起作用CancellationTokenSource cancellation = new CancellationTokenSource(); //cancellation.CancelAfter(TimeSpan.FromSeconds(1)); bool WaitDone = false; bool AnyError = false; bool IsExecuteDone = false; Thread tr1 = new Thread(new ThreadStart((Action)(() => { try { IsExecuteDone = false; //初始化modbusmaster modbusFactory = new ModbusFactory(); //在本地测试 所以使用回环地址,modbus协议规定端口号 502 var client = new TcpClient(); client.SendTimeout = 1000; client.ReceiveTimeout = 1000; client.Connect(IP, Port); master = modbusFactory.CreateMaster(client); //设置读取超时时间 master.Transport.ReadTimeout = 1000; master.Transport.Retries = 1; master.Transport.WriteTimeout = 1000; IsExecuteDone = true; } catch { AnyError = true; } WaitDone = true; }))); tr1.IsBackground = true; tr1.Start(); //timeout check thread Thread tr2 = new Thread(new ThreadStart((Action)(() => { try { Thread.Sleep(2000); if (!IsExecuteDone) { AnyError = true; tr1.Abort(); WaitDone = true; } } catch { } }))); tr2.IsBackground = true; tr2.Start(); while (!WaitDone) { Thread.Sleep(50); } if (AnyError) { Global.DTMWaitError = true; } } /// /// /// /// 0 /// 0 /// 0 /// public static ushort[] Read(byte slaveAddress, ushort startAddress, ushort numberOfPoints) { if (!Global.IsRelease) { return new ushort[] { (ushort)new Random().Next(800), (ushort)new Random().Next(200), 250, 310, 400, 330, 650, 210 }; } try { ushort[] registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints); return registerBuffer; } catch { //尝试两次重连 Thread.Sleep(100); CreateLink(); ushort[] registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints); return registerBuffer; } } /// /// /// /// 0 /// 0 /// 0 /// public static void Write(byte slaveAddress, ushort startAddress, ushort value) { if (!Global.IsRelease) { return; } try { master.WriteSingleRegister(slaveAddress, startAddress, value); } catch { //尝试两次重连 Thread.Sleep(100); CreateLink(); master.WriteSingleRegister(slaveAddress, startAddress, value); } } } }