Protocol

  1. Read Coils (FC1)
  2. Read Discrete Inputs (FC2)
  3. Read Holding Registers (FC3)
  4. Read Input Registers (FC4)
  5. Write Single Coil (FC5)
  6. Write Single Register (FC6)
  7. Write Multiple Coils (FC15)
  8. Write Multiple Registers (FC16)
  9. Read/Write Multiple Registers (FC23)

TCP/IP Modbus Channel配置表

网关SN channelType config 网关名称 轮询间隔 connectTimeout 是否启用 连接状态 备注 Datetime
ModbusTCP_33333FF TCP
RTU
TCPRelay
一楼水机网关 5s 0: Offline
1: Online
ModbusTCP_RREE889 二楼水机网关 5s

网关SN自动生成,也可以收入输入。 对于TCP/IP Modbus协议只需要输入IP、Port;

读写配置

ConfigID 网关SN ConfigName DO/DI/AO/AI ChannelType TID 传输标识符 PID 协议标识符 子站地址(单元标识符) 起始地址 数据
类型
读取多少路数据 字节顺序
Tag前缀
DO:RW
DI: R
AO:RW
AI:R
TCP
RTU
TCPRelay
默认0 默认0 默认0 16进制 Boolean
UInt6
Int16
UInt32
Int32
Float32
Hex(32)
N/A
AB
BA
ABCD
BADC
CDBA
DCBA

12928033-97701dc0579cc137.webp.jpg
v2-77a328030cfadae1cf165bf44bdc6963_720w.jpg
Modbus 协议数据格式
微信图片_20220505101836.jpg
微信图片_20220505101917.png

点位表

点位ID ConfigID 网关SN 起始地址 DI/DO/AI/AO modbus数据类型 modbus Tag 第几路数据
SN993333 33333FF 0
VF888888 33333FF 1

逻辑关系

  1. 创建TCP/IP 驱动,输入网关IP,Port,自动生成网关SN或者可输入,网关名称。
  2. 网关建立成功后,配置读写对应的协议内容:寄存器类型、起始地址、读取多少路等;
  3. 读写协议定义成功后,为每路创建一个点位;
  4. 驱动点位表中的别名,点位名称,点位类型,点位单位,点位精度 可由用户自由输入 ```csharp bool[] ReadCoils(byte slaveAddress, ushort startAddress, ushort numberOfPoints); Task ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); bool[] ReadInputs(byte slaveAddress, ushort startAddress, ushort numberOfPoints); Task ReadInputsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints); ushort[] ReadInputRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints); void WriteSingleCoil(byte slaveAddress, ushort coilAddress, bool value); void WriteSingleRegister(byte slaveAddress, ushort registerAddress, ushort value); void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data); void WriteMultipleCoils(byte slaveAddress, ushort startAddress, bool[] data); ushort[] ReadWriteMultipleRegisters(byte slaveAddress,
    1. ushort startReadAddress,
    2. ushort numberOfPointsToRead,
    3. ushort startWriteAddress,
    4. ushort[] writeData);
  1. ```c
  2. float getFloat(quint16 value1, quint16 value2)
  3. {
  4. float fTemp;
  5. uint *pTemp=(uint *)&fTemp;
  6. unsigned int chTemp[4];//a,b,c,d
  7. chTemp[0]=value1&0xff;
  8. chTemp[1]=(value1>>8)&0xff;
  9. chTemp[2]=value2&0xff;
  10. chTemp[3]=(value2>>8)&0xff;
  11. //这是ABCD
  12. *pTemp=((chTemp[1]<<24)&0xff000000)|((chTemp[0]<<16)&0xff0000)|((chTemp[3]<<8)&0xff00)|(chTemp[2]&0xff);
  13. //这是CDAB
  14. //*pTemp=((chTemp[3]<<24)&0xff000000)|((chTemp[2]<<16)&0xff0000)|((chTemp[1]<<8)&0xff00)|(chTemp[0]&0xff);
  15. //这是BADC
  16. //*pTemp=((chTemp[0]<<24)&0xff000000)|((chTemp[1]<<16)&0xff0000)|((chTemp[2]<<8)&0xff00)|(chTemp[3]&0xff);
  17. //这是DCBA
  18. //*pTemp=((chTemp[2]<<24)&0xff000000)|((chTemp[3]<<16)&0xff0000)|((chTemp[0]<<8)&0xff00)|(chTemp[1]&0xff);
  19. return fTemp;
  20. }
  1. namespace Modbus.Device
  2. {
  3. using System;
  4. using System.Threading.Tasks;
  5. using IO;
  6. /// <summary>
  7. /// Modbus master device.
  8. /// </summary>
  9. public interface IModbusMaster : IDisposable
  10. {
  11. /// <summary>
  12. /// Transport used by this master.
  13. /// </summary>
  14. ModbusTransport Transport { get; }
  15. /// <summary>
  16. /// Reads from 1 to 2000 contiguous coils status.
  17. /// </summary>
  18. /// <param name="slaveAddress">Address of device to read values from.</param>
  19. /// <param name="startAddress">Address to begin reading.</param>
  20. /// <param name="numberOfPoints">Number of coils to read.</param>
  21. /// <returns>Coils status.</returns>
  22. bool[] ReadCoils(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  23. /// <summary>
  24. /// Asynchronously reads from 1 to 2000 contiguous coils status.
  25. /// </summary>
  26. /// <param name="slaveAddress">Address of device to read values from.</param>
  27. /// <param name="startAddress">Address to begin reading.</param>
  28. /// <param name="numberOfPoints">Number of coils to read.</param>
  29. /// <returns>A task that represents the asynchronous read operation.</returns>
  30. Task<bool[]> ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  31. /// <summary>
  32. /// Reads from 1 to 2000 contiguous discrete input status.
  33. /// </summary>
  34. /// <param name="slaveAddress">Address of device to read values from.</param>
  35. /// <param name="startAddress">Address to begin reading.</param>
  36. /// <param name="numberOfPoints">Number of discrete inputs to read.</param>
  37. /// <returns>Discrete inputs status.</returns>
  38. bool[] ReadInputs(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  39. /// <summary>
  40. /// Asynchronously reads from 1 to 2000 contiguous discrete input status.
  41. /// </summary>
  42. /// <param name="slaveAddress">Address of device to read values from.</param>
  43. /// <param name="startAddress">Address to begin reading.</param>
  44. /// <param name="numberOfPoints">Number of discrete inputs to read.</param>
  45. /// <returns>A task that represents the asynchronous read operation.</returns>
  46. Task<bool[]> ReadInputsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  47. /// <summary>
  48. /// Reads contiguous block of holding registers.
  49. /// </summary>
  50. /// <param name="slaveAddress">Address of device to read values from.</param>
  51. /// <param name="startAddress">Address to begin reading.</param>
  52. /// <param name="numberOfPoints">Number of holding registers to read.</param>
  53. /// <returns>Holding registers status.</returns>
  54. ushort[] ReadHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  55. /// <summary>
  56. /// Asynchronously reads contiguous block of holding registers.
  57. /// </summary>
  58. /// <param name="slaveAddress">Address of device to read values from.</param>
  59. /// <param name="startAddress">Address to begin reading.</param>
  60. /// <param name="numberOfPoints">Number of holding registers to read.</param>
  61. /// <returns>A task that represents the asynchronous read operation.</returns>
  62. Task<ushort[]> ReadHoldingRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  63. /// <summary>
  64. /// Reads contiguous block of input registers.
  65. /// </summary>
  66. /// <param name="slaveAddress">Address of device to read values from.</param>
  67. /// <param name="startAddress">Address to begin reading.</param>
  68. /// <param name="numberOfPoints">Number of holding registers to read.</param>
  69. /// <returns>Input registers status.</returns>
  70. ushort[] ReadInputRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  71. /// <summary>
  72. /// Asynchronously reads contiguous block of input registers.
  73. /// </summary>
  74. /// <param name="slaveAddress">Address of device to read values from.</param>
  75. /// <param name="startAddress">Address to begin reading.</param>
  76. /// <param name="numberOfPoints">Number of holding registers to read.</param>
  77. /// <returns>A task that represents the asynchronous read operation.</returns>
  78. Task<ushort[]> ReadInputRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints);
  79. /// <summary>
  80. /// Writes a single coil value.
  81. /// </summary>
  82. /// <param name="slaveAddress">Address of the device to write to.</param>
  83. /// <param name="coilAddress">Address to write value to.</param>
  84. /// <param name="value">Value to write.</param>
  85. void WriteSingleCoil(byte slaveAddress, ushort coilAddress, bool value);
  86. /// <summary>
  87. /// Asynchronously writes a single coil value.
  88. /// </summary>
  89. /// <param name="slaveAddress">Address of the device to write to.</param>
  90. /// <param name="coilAddress">Address to write value to.</param>
  91. /// <param name="value">Value to write.</param>
  92. /// <returns>A task that represents the asynchronous write operation.</returns>
  93. Task WriteSingleCoilAsync(byte slaveAddress, ushort coilAddress, bool value);
  94. /// <summary>
  95. /// Writes a single holding register.
  96. /// </summary>
  97. /// <param name="slaveAddress">Address of the device to write to.</param>
  98. /// <param name="registerAddress">Address to write.</param>
  99. /// <param name="value">Value to write.</param>
  100. void WriteSingleRegister(byte slaveAddress, ushort registerAddress, ushort value);
  101. /// <summary>
  102. /// Asynchronously writes a single holding register.
  103. /// </summary>
  104. /// <param name="slaveAddress">Address of the device to write to.</param>
  105. /// <param name="registerAddress">Address to write.</param>
  106. /// <param name="value">Value to write.</param>
  107. /// <returns>A task that represents the asynchronous write operation.</returns>
  108. Task WriteSingleRegisterAsync(byte slaveAddress, ushort registerAddress, ushort value);
  109. /// <summary>
  110. /// Writes a block of 1 to 123 contiguous registers.
  111. /// </summary>
  112. /// <param name="slaveAddress">Address of the device to write to.</param>
  113. /// <param name="startAddress">Address to begin writing values.</param>
  114. /// <param name="data">Values to write.</param>
  115. void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data);
  116. /// <summary>
  117. /// Asynchronously writes a block of 1 to 123 contiguous registers.
  118. /// </summary>
  119. /// <param name="slaveAddress">Address of the device to write to.</param>
  120. /// <param name="startAddress">Address to begin writing values.</param>
  121. /// <param name="data">Values to write.</param>
  122. /// <returns>A task that represents the asynchronous write operation.</returns>
  123. Task WriteMultipleRegistersAsync(byte slaveAddress, ushort startAddress, ushort[] data);
  124. /// <summary>
  125. /// Writes a sequence of coils.
  126. /// </summary>
  127. /// <param name="slaveAddress">Address of the device to write to.</param>
  128. /// <param name="startAddress">Address to begin writing values.</param>
  129. /// <param name="data">Values to write.</param>
  130. void WriteMultipleCoils(byte slaveAddress, ushort startAddress, bool[] data);
  131. /// <summary>
  132. /// Asynchronously writes a sequence of coils.
  133. /// </summary>
  134. /// <param name="slaveAddress">Address of the device to write to.</param>
  135. /// <param name="startAddress">Address to begin writing values.</param>
  136. /// <param name="data">Values to write.</param>
  137. /// <returns>A task that represents the asynchronous write operation.</returns>
  138. Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] data);
  139. /// <summary>
  140. /// Performs a combination of one read operation and one write operation in a single Modbus transaction.
  141. /// The write operation is performed before the read.
  142. /// </summary>
  143. /// <param name="slaveAddress">Address of device to read values from.</param>
  144. /// <param name="startReadAddress">Address to begin reading (Holding registers are addressed starting at 0).</param>
  145. /// <param name="numberOfPointsToRead">Number of registers to read.</param>
  146. /// <param name="startWriteAddress">Address to begin writing (Holding registers are addressed starting at 0).</param>
  147. /// <param name="writeData">Register values to write.</param>
  148. ushort[] ReadWriteMultipleRegisters(
  149. byte slaveAddress,
  150. ushort startReadAddress,
  151. ushort numberOfPointsToRead,
  152. ushort startWriteAddress,
  153. ushort[] writeData);
  154. /// <summary>
  155. /// Asynchronously performs a combination of one read operation and one write operation in a single Modbus transaction.
  156. /// The write operation is performed before the read.
  157. /// </summary>
  158. /// <param name="slaveAddress">Address of device to read values from.</param>
  159. /// <param name="startReadAddress">Address to begin reading (Holding registers are addressed starting at 0).</param>
  160. /// <param name="numberOfPointsToRead">Number of registers to read.</param>
  161. /// <param name="startWriteAddress">Address to begin writing (Holding registers are addressed starting at 0).</param>
  162. /// <param name="writeData">Register values to write.</param>
  163. /// <returns>A task that represents the asynchronous operation</returns>
  164. Task<ushort[]> ReadWriteMultipleRegistersAsync(
  165. byte slaveAddress,
  166. ushort startReadAddress,
  167. ushort numberOfPointsToRead,
  168. ushort startWriteAddress,
  169. ushort[] writeData);
  170. }
  171. }