ModbusClass.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using LogClass;
  2. using NModbus;
  3. using System;
  4. using System.Net.Sockets;
  5. namespace CCDCount.DLL.Tools
  6. {
  7. public class ModbusTcpClient
  8. {
  9. private TcpClient _tcpClient;
  10. private IModbusMaster _modbusMaster;
  11. public bool IsTcpClientConnected()
  12. {
  13. if (_tcpClient == null || _tcpClient.Client == null)
  14. return false;
  15. try
  16. {
  17. Socket socket = _tcpClient.Client;
  18. bool isReadable = socket.Poll(0, SelectMode.SelectRead);
  19. bool hasNoData = (socket.Available == 0);
  20. // 可读且无数据 = 连接已断开
  21. return !(isReadable && hasNoData);
  22. }
  23. catch (SocketException) { return false; }
  24. catch (ObjectDisposedException) { return false; }
  25. }
  26. /// <summary>
  27. /// 连接 Modbus TCP 服务器
  28. /// </summary>
  29. /// <param name="ipAddress"></param>
  30. /// <param name="port"></param>
  31. /// <returns></returns>
  32. public bool Connect(string ipAddress, int port = 502)
  33. {
  34. try
  35. {
  36. _tcpClient = new TcpClient(ipAddress, port)
  37. {
  38. SendTimeout = 2000,
  39. ReceiveTimeout = 2000
  40. };
  41. // 使用 ModbusFactory 创建 Master(新版本 API)
  42. var factory = new ModbusFactory();
  43. _modbusMaster = factory.CreateMaster(_tcpClient);
  44. return true;
  45. }
  46. catch (Exception ex)
  47. {
  48. Console.WriteLine($"连接失败: {ex.Message}");
  49. return false;
  50. }
  51. }
  52. /// <summary>
  53. /// 断开连接
  54. /// </summary>
  55. public void Disconnect()
  56. {
  57. _modbusMaster?.Dispose();
  58. _tcpClient?.Close();
  59. }
  60. /// <summary>
  61. /// 读取线圈(功能码01)
  62. /// </summary>
  63. /// <param name="slaveId"></param>
  64. /// <param name="startAddress"></param>
  65. /// <param name="numRegisters"></param>
  66. /// <returns></returns>
  67. /// <exception cref="InvalidOperationException"></exception>
  68. public bool[] ReadCoilsRegister(byte slaveId, ushort startAddress, ushort numRegisters)
  69. {
  70. if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
  71. try
  72. {
  73. return _modbusMaster.ReadCoils(slaveId, startAddress, numRegisters);
  74. }
  75. catch (Exception ex)
  76. {
  77. Console.WriteLine($"读取线圈失败: {ex.Message}");
  78. FaultLog.RecordErrorMessage($"MainThreadClass-ReadCoilsRegister-ReadCoilsRegister failed:{ex.Message}");
  79. return null;
  80. }
  81. }
  82. /// <summary>
  83. /// 读取保持寄存器(功能码03)
  84. /// </summary>
  85. /// <param name="slaveId"></param>
  86. /// <param name="startAddress"></param>
  87. /// <param name="numRegisters"></param>
  88. /// <returns></returns>
  89. /// <exception cref="InvalidOperationException"></exception>
  90. public ushort[] ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort numRegisters)
  91. {
  92. if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
  93. try
  94. {
  95. return _modbusMaster.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
  96. }
  97. catch (Exception ex)
  98. {
  99. Console.WriteLine($"读取保持寄存器失败: {ex.Message}");
  100. FaultLog.RecordErrorMessage($"MainThreadClass-ReadHoldingRegisters-ReadHoldingRegisters failed:{ex.Message}");
  101. return null;
  102. }
  103. }
  104. /// <summary>
  105. /// 写入线圈(功能码05)
  106. /// </summary>
  107. /// <param name="slaveId"></param>
  108. /// <param name="CoilsAddress"></param>
  109. /// <param name="values"></param>
  110. /// <exception cref="InvalidOperationException"></exception>
  111. public void WriteCoilsRegister(byte slaveId, ushort CoilsAddress, bool values)
  112. {
  113. if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
  114. try
  115. {
  116. _modbusMaster.WriteSingleCoil(slaveId, CoilsAddress, values);
  117. }
  118. catch (Exception ex)
  119. {
  120. Console.WriteLine($"写入线圈失败: {ex.Message}");
  121. FaultLog.RecordErrorMessage($"MainThreadClass-WriteCoilsRegister-WriteCoilsRegister failed:{ex.Message}");
  122. }
  123. }
  124. /// <summary>
  125. /// 写入单个寄存器(功能码06)
  126. /// </summary>
  127. /// <param name="slaveId"></param>
  128. /// <param name="registerAddress"></param>
  129. /// <param name="value"></param>
  130. /// <exception cref="InvalidOperationException"></exception>
  131. public void WriteSingleRegister(byte slaveId, ushort registerAddress, ushort value)
  132. {
  133. if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
  134. try
  135. {
  136. _modbusMaster.WriteSingleRegister(slaveId, registerAddress, value);
  137. }
  138. catch (Exception ex)
  139. {
  140. Console.WriteLine($"写入单个寄存器失败: {ex.Message}");
  141. FaultLog.RecordErrorMessage($"MainThreadClass-WriteSingleRegister-WriteSingleRegister failed:{ex.Message}");
  142. }
  143. }
  144. /// <summary>
  145. /// 写入多个寄存器(功能码16)
  146. /// </summary>
  147. /// <param name="slaveId"></param>
  148. /// <param name="startAddress"></param>
  149. /// <param name="values"></param>
  150. /// <exception cref="InvalidOperationException"></exception>
  151. public void WriteMultipleRegisters(byte slaveId, ushort startAddress, ushort[] values)
  152. {
  153. if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
  154. try
  155. {
  156. _modbusMaster.WriteMultipleRegisters(slaveId, startAddress, values);
  157. }
  158. catch (Exception ex)
  159. {
  160. Console.WriteLine($"写入多个寄存器失败: {ex.Message}");
  161. FaultLog.RecordErrorMessage($"MainThreadClass-WriteMultipleRegisters-WriteMultipleRegisters failed:{ex.Message}");
  162. }
  163. }
  164. }
  165. }