1, Modbus地址区的0x、1x、3x、4x各代表什么?如何区分和应用?
地址区 | 名词 | 读/写 | 地址范围 | 别称 | 可用功能码 |
0x | 线圈状态/离散量输出(coil status) | 可读/可写 | 00001~09999 | 对应PLC: DO | 01、05、15 |
1x | 离散量输入(inputs status ) | 只读 | 10001~19999 | 对应PLC: DI | 02 |
3x | 输入寄存器(input registers) | 只读 | 30001~39999 | 对应PLC: AI | 04 |
4x | 保持寄存器(holding registers) | 可读/可写 | 40001~49999 | 对应PLC: AO | 03、06、16 |
解释:0x、1x、 3x、4x各是一片数据区,它是5位十进制地址(16bit),是Modbus协议规定的地址范围,各类地址是互相对应的,但在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。有些资料就以其第一个数字区分各类地址。这些只是modbus协议规定的地址范围区, 并不参与实际协议数据传输。而其中功能码是真实参与协议传输的。如要操作0x地址数据区,就只能用规定的功能码01、05,而不能用其他功能码。所以,从各类地址的前缀就能知道它的数据区及功能码,反之亦然。
2, 功能码:
功能码(16进制) | 功能 | 位/字操作 | 操作数量 | 访问类型 |
0x01 | 读线圈状态 | 位操作 | 单个或多个 | 单bit访问 |
0x02 | 读离散输入状态 | 位操作 | 单个或多个 | |
0x05 | 写单个线圈 | 位操作 | 单个 | |
0x0F | 写多个线圈 | 位操作 | 多个 | |
0x03 | 读保持寄存器 |