协议
主机读写
从站地址(8bit) | 功能码 (8bit) | 起始地址(16bit) | 数量(16bit) | CRC(16bit) |
---|
从机对主机读取的回复
从站地址(8bit) | 功能码 (8bit) | 字节计数(8bit) | 数据(n*8bit) | CRC(16bit) |
---|
从机对主机写入的回复
从站地址(8bit) | 功能码 (8bit) | 起始地址(16bit) | 数量(16bit) | CRC(16bit) |
---|
所有功能码如下:
功能码 | 作用 | 长度 |
---|---|---|
0x01 | 读线圈寄存器 | 1bit |
0x02 | 读离散输入寄存器 | 1bit |
0x03 | 读保持寄存器 | 16bit |
0x04 | 读输入寄存器 | 16bit |
0x05 | 写单个线圈寄存器 | 1bit |
0x06 | 写单个保持寄存器 | 16bit |
0x0f | 写多个线圈寄存器 | 1bit |
0x10 | 写多个保持寄存器 | 16bit |
地址划分如下(5bit):
名称 | 读写 | 地址范围 |
---|---|---|
线圈 | 可读可写布尔量(1bit) | 00001-09999 |
离散量输入 | 只读布尔量(1bit) | 10001-19999 |
输入寄存器 | 只读寄存器(16bit) | 30001-39999 |
保持寄存器 | 可读可写寄存器(16bit) | 40001-49999 |
测试
从以下网站获取modubus模拟设备https://www.modbus.cn/25794.html
从以下网站获取UART虚拟设备https://www.hhdsoftware.com/virtual-serial-port-tools
我们将会使用virtual-serial-port-tools创建两个虚拟的连接起来的设备,在这两个设备上分别建立一个虚拟ModBUS主机,ModBUS从机,观察通信过程。
读取多个线圈
下图中是设置完毕之后的通信情况。从站内持有10个线圈,其中第二,第六,第十个数据为1,其余为0。
0982-Txd : 01 01 00 00 00 0A BC 0D
0982-Rxd : 01 01 02 22 02 20 9D
主机发送
从站地址(8bit) | 功能码 (8bit) | 起始地址(16bit) | 数量 | CRC(16bit) |
---|---|---|---|---|
01 | 01 | 00 00 | 00 0A | BC 0D |
从机回复
从站地址(8bit) | 功能码 (8bit) | 字节计数(8bit) | 数据 | CRC(16bit) |
---|---|---|---|---|
01 | 01 | 02 | 02 22 | 20 9D |
可以看出,对于线圈数据,modubus将这些1bit数据放到了字节中传输。达不到8倍数的要填充0。下面是填充过的从机数据,其中第二、第六、第十个数据为1,其余为0,转换为16进制就是0x02 22。modubus先发的低字节
0000 0010 0010 0010
写入单个线圈
注意1,0在下面的表现形式
1103-Txd : 01 05 00 00 FF 00 8C 3A
1103-Rxd : 01 05 00 00 FF 00 8C 3A
1104-Txd : 01 05 00 00 00 00 CD CA
1104-Rxd : 01 05 00 00 00 00 CD CA
主机发送1
从站地址(8bit) | 功能码 (8bit) | 地址(16bit) | 数据(16bit) | CRC(16bit) |
---|---|---|---|---|
01 | 05 | 00 00 | FF 00 | 8C 3A |
主机发送0
从站地址(8bit) | 功能码 (8bit) | 地址(16bit) | 数据(16bit) | CRC(16bit) |
---|---|---|---|---|
01 | 05 | 00 00 | 00 00 | CD CA |
从机回复数据与主机相同
写入多个线圈
1459-Txd : 01 0F 00 00 00 03 01 02 0E 96
1459-Rxd : 01 0F 00 00 00 03 15 CA
主机发送
从站地址(8bit) | 功能码 (8bit) | 地址(16bit) | 线圈个数(16bit) | 字节计数(8bit) | 数据 | CRC(16bit) |
---|---|---|---|---|---|---|
01 | 0F | 00 00 | 00 03 | 01 | 02 | 0E 96 |
从机回复
从站地址(8bit) | 功能码 (8bit) | 地址(16bit) | 线圈个数(16bit) | CRC(16bit) |
---|---|---|---|---|
01 | 0F | 00 00 | 00 03 | 15 CA |
后续大家自己测试