Modbus RTU协议格式概览
Markdown
1+---------------+--------------+--------------+-------------------+------------------+
2| 设备地址 | 功能码 | 数据段 | CRC校验码(低字节)| CRC校验码(高字节)|
3| (1字节) | (1字节) | 变长 | (1字节) | (1字节) |
4+---------------+--------------+--------------+-------------------+------------------+
Modbus标准功能码列表
- 0x01:读线圈状态
- 0x02:读离散输入状态
- 0x03:读保持寄存器
- 0x04:读输入寄存器
- 0x05:写单个线圈
- 0x06:写单个保持寄存器
- 0x07:读异常状态寄存器
- 0x08:诊断功能(设备特定)
- 0x0F:写多个线圈
- 0x10:写多个保持寄存器
- 0x11:报告从设备标识符(非标准,使用有限)
- 0x14:读文件记录(替换0x0B)
- 0x15:写文件记录(替换0x0C)
- 0x16:Mask写多个保持寄存器(仅限Modbus TCP)
注意:0x00和0x7F的功能码通常保留不使用。0x80至0xFF的功能码范围通常被设备制造商用来定义自定义扩展功能。
功能码03(读保持寄存器)和06(写单个保持寄存器)的示例
-
功能码03(读保持寄存器):
Markdown1报文: 0x01 0x03 0x00 0x01 0x00 0x02 CRC低字节 CRC高字节 2解释:设备地址为0x01,请求读取从地址0x0001开始的两个保持寄存器的值。 3注:CRC校验码在此处省略,实际应用中需要根据报文内容计算得出。
-
功能码06(写单个保持寄存器):
Markdown1报文: 0x01 0x06 0x00 0x01 0x12 0x34 CRC低字节 CRC高字节 2解释:设备地址为0x01,请求向地址为0x0001的保持寄存器写入值0x1234。 3注:这里的CRC校验码也是示例,实际使用中需计算真实CRC值。
注意事项
- CRC校验:Modbus RTU协议要求每个报文的最后两位是CRC校验码,通过CRC-16算法计算得出。
- 数据传输:主设备发起通信,从设备响应。报文中的设备地址确保了正确的设备接收和响应命令。
- 写操作:功能码06用于写入单个保持寄存器,批量写操作应使用功能码10(写多个保持寄存器)。
- 错误检查:如果接收到的消息中有错误(如CRC校验失败、地址不符等),从设备不会执行操作,并返回错误响应。
扩展指令
- 非标准扩展功能码:功能码范围0x80至0xFF通常用于制造商定义的扩展功能,它们不属于Modbus官方规范,但可以在特定设备或系统中实现特殊的控制或数据交换功能。