Modbus协议是一只应用层报文传输协议,有RTU、ASCII、TCP/IP三种报文类型,使用串口传输时,有两种模式RTU和ASCII模式。ASCII模式采用是LRC校验,RTU模式采用16位的CRC校验,使用TCP/IP网络传输时,则不需要这种校验。
区号 | 名称 | 读写 | 范围 |
0区 | 输出线圈 | 可读可写 | 00001-09999 |
1区 | 输入线圈 | 只读 | 10001-19999 |
3区 | 输入寄存器 | 只读 | 30001-39999 |
4区 | 保存寄存器 | 可读可写 | 40001-49999 |
功能码 | 名称 | modbus设备寄存器地址 | 位操作/字操作 | 操作数量 |
01H | 读取输出线圈(读取) | 00001-09999 | 位操作 | 单个或多个 |
02H | 读取输入线圈(读取) | 10001-19999 | 位操作 | 单个或多个 |
03H | 读取保持寄存器(读取) | 40001-49999 | 字操作 | 单个或多个 |
04H | 读取 输入寄存器(读取) | 30001-39999 | 字操作 | 单个或多个 |
05H | 预置单线圈(写入) | 00001-09999 | 位操作 | 单个线圈 |
06H | 预置单寄存器(写入) | 40001-49999 | 字操作 | 单个寄存器 |
0FH | 预置多线圈(写入) | 00001-09999 | 位操作 | 多个线圈 |
10H | 预置多寄存器(写入) | 40001-49999 | 字操作 | 多个寄存器 |
在modbus标准中,RTU是必须要求的,ASCII是可选项,即一个Modbus设备可以只支持RTU模式或兼容RTU和ASCII两种模式,不能只支持ASCII模式。在发送报文时,一帧结束后,必须要有3.5个字符周期的是间隔时间(4.01ms),否则会出现粘包的情况。
串行通讯的报文格式
从站地址 | 功能码 | 数据 | CRC/LRC |
1 Byte | 1 Byte | N Byte | 2 Byte |
读取输出线圈(01H)
报文格式例子:
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高) | 数量(低) | 校验 |
0x01 | 0x01 | 0x00 | 0x00 | 0x00 | 0x1B | XXXX |
报文解析的意思是从站号为1的设备中读取00001-00027的线圈状态值(0x1B=27),功能码0x01表示读取的是0区的输出线圈状态值。
返回的报文格式
从站地址 | 功能码 | 字节计算 | 字节1 | 字节2 | 字节3 | 字节4 | 校验 |
0x01 | 0x01 | 0x04 | 0xCD | 0x6B | 0xB2 | 0x05 | XXXX |
读取返回的状态值为 CD 6B B2 05
报文的意思就是从1号从站设备返回输出线圈00001-00027的状态值,bit位被置1,表示该输出线圈为ON
0xCD=1100 1101 对应00001-00008 0x6B=0110 1011对应的是00009-00016
0xB2=1011 0010 对应的是00017-00024 0x05=0000 0101对应的是00025-00027
其他功能的读取,同上述功能码的读取报文,返回报文类似