Modbus 是一种广泛使用的通信协议,特别是在工业自动化和控制系统中。Modbus 支持多种通信方式,其中包括串行通信(如 RS-232 和 RS-485)。在串行链路上,Modbus 通信采用特定的报文格式。
Modbus 串行链路的通用报文格式
Modbus 串行报文由以下几个部分组成:
地址域(Slave Address):
1 字节:表示从站设备的地址。有效范围通常是 1 到 247(0 表示广播,248-255 保留)。
功能码(Function Code):
1 字节:指示请求的操作类型,例如读取或写入数据。常见的功能码包括:
0x01:读取线圈状态
0x02:读取离散输入状态
0x03:读取保持寄存器
0x04:读取输入寄存器
0x05:写单个线圈
0x06:写单个寄存器
0x0F:写多个线圈
0x10:写多个寄存器
数据域(Data):
可变长度:根据功能码的不同,数据域的内容和长度也不同。通常包括要读取或写入的寄存器地址、数量、值等信息。
错误检查(Error Check):
2 字节:用于数据完整性的校验,通常使用 CRC(循环冗余校验)来检测传输错误。
示例报文格式
假设我们要读取从站地址为 1 的设备的保持寄存器,报文格式如下:
+----------------+--------------+----------------+----------------+-----------------+
| Slave Address | Function Code| Data | Error Check |
| 1 byte | 1 byte | (N bytes) | 2 bytes |
+----------------+--------------+----------------+-----------------+
示例报文:
从站地址:0x01
功能码:0x03(读取保持寄存器)
数据:
起始寄存器地址:0x0000(0 字节表示)
寄存器数量:0x0002(读取 2 个寄存器)
CRC:计算得出的 CRC 值
最终的报文可能如下(假设 CRC 为 0xA1B2):
| 0x01 | 0x03 | 0x00 | 0x00 | 0x00 | 0x02 | 0xA1 | 0xB2 |