modbus协议和示例

ModBus RTU 协议

功能码不同,读写数据格式不同,具体的格式建议参考下面的实例。

所有功能码如下:

功能码作用长度
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从机,观察通信过程。

读取多个线圈0x01

下图中是设置完毕之后的通信情况。从站内持有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)
010100 0000 0ABC 0D

从机回复

从站地址(8bit)功能码 (8bit)字节计数(8bit)数据CRC(16bit)
01010202 2220 9D

可以看出,对于线圈数据,modubus将这些1bit数据放到了字节中传输。达不到8倍数的要填充0。下面是填充过的从机数据,其中第二、第六、第十个数据为1,其余为0,转换为16进制就是0x02 22。modubus先发的低字节
0000 0010 0010 0010

写入单个线圈0x05

注意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)
010500 00FF 008C 3A

主机发送0

从站地址(8bit)功能码 (8bit)起始地址(16bit)数据(16bit)CRC(16bit)
010500 0000 00CD CA

从机回复数据与主机发送相同

写入多个线圈0x0F

在这里插入图片描述
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)
010F00 0000 0301020E 96

从机回复

从站地址(8bit)功能码 (8bit)起始地址(16bit)线圈个数(16bit)CRC(16bit)
010F00 0000 0315 CA

读取离散量0x02

离散量是只读的1位数据
在这里插入图片描述
0011-Txd : 01 02 00 00 00 0A F8 0D
0011-Rxd : 01 02 02 82 01 18 D8
主机发送

从站地址(8bit)功能码 (8bit)起始地址(16bit)离散量个数(16bit)CRC(16bit)
010200 0000 0AF8 0D

从机回复

从站地址(8bit)功能码 (8bit)字节计数(8bit)数据CRC(16bit)
01020282 0118 D8

0000 0001 1000 0010
前6bit填充0, 先发送低字节0x82,再发送高字节0x01

读取保持寄存器0x03

寄存器都是16位的数据,占用两个字节
在这里插入图片描述
0021-Txd : 01 03 00 00 00 0A C5 CD
0021-Rxd : 01 03 14 00 01 00 02 00 03 00 04 00 04 00 05 00 06 00 06 00 07 00 08 06 19

主机发送

从站地址(8bit)功能码 (8bit)起始地址(16bit)保持寄存器个数(16bit)CRC(16bit)
010300 0000 0AC5 CD

从机回复

从站地址(8bit)功能码 (8bit)字节计数(8bit)数据CRC(16bit)
01031400 01 00 02 00 03 00 04 00 04 00 05 00 06 00 06 00 07 00 0806 19

写入单个保持寄存器0x06

在这里插入图片描述
0085-Txd : 01 06 00 02 00 1B 68 01
0085-Rxd : 01 06 00 02 00 1B 68 01

主机发送

从站地址(8bit)功能码 (8bit)起始地址(16bit)数据(16bit)CRC(16bit)
010600 0200 1B68 01

从机回复数据与主机发送相同

写入多个保持寄存器0x10

在这里插入图片描述
0189-Txd : 01 10 00 00 00 0A 14 00 00 00 04 00 00 00 05 00 00 00 08 00 00 00 06 00 00 00 09 11 FC
0189-Rxd : 01 10 00 00 00 0A 40 0E

主机发送

从站地址(8bit)功能码 (8bit)起始地址(16bit)保持寄存器个数(16bit)字节计数(8bit)数据CRC(16bit)
011000 0000 0A1400 00 00 04 00 00 00 05 00 00 00 08 00 00 00 06 00 00 00 0911 FC

从机回复

从站地址(8bit)功能码 (8bit)起始地址(16bit)保持寄存器个数(16bit)CRC(16bit)
011000 0000 0A40 0E

读取多个输入寄存器0x04

在这里插入图片描述
0200-Txd : 01 04 00 00 00 0A 70 0D
0199-Rxd : 01 04 14 00 00 00 02 00 08 00 06 00 22 00 00 00 05 00 00 00 07 00 06 F1 9A

主机发送

从站地址(8bit)功能码 (8bit)起始地址(16bit)输入寄存器数量(16bit)CRC(16bit)
010400 0000 0A70 0D

从机回复

从站地址(8bit)功能码 (8bit)字节计数(8bit)数据CRC(16bit)
01041400 00 00 02 00 08 00 06 00 22 00 00 00 05 00 00 00 07 00 06F1 9A

挖坑:

1, FreeModbus协议移植
2, 源码分析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝地亚狂想曲

送我一瓶农夫山泉?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值