Modbus协议(二)

03ModbusRTU读保持寄存器(多个字)

ModbusRTU协议按照下列模式发送报文

地址 功能码 起始地址高位 起始地址低位 读取寄存器数量高位 读取寄存器数量低位 CRC16 校验码
0x01 0x03 0x00 0x00 0x00 0x06 0xC5 0xC8
从站1 读保持寄存器 从寄存器0开始 读取6个 CRC16校验

发送

010300000006C5C8

收到反馈

01 03 0C 00 01 00 02 00 03 00 2C 02 2B 00 00 5D 9A 

反馈分析

字段 地址 功能码 接下来的数据部分字节数 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8 字节9 字节10 字节11 字节12 CRC校验16
01 03 0C 00 01 00 02 00 03 00 2C 02 2B 00 00 5D 9A
含义 从站1 读保持寄存器 后续数据有0C:12个字节 0001:1 0002:2 0003:3 002C:32+12=44 022B:16 * 16 * 2+16 * 2+11=555 0000:0 CRC16校验

那对应的保持寄存器的值分别就是

寄存器地址 0 1 2 3 4 5
1 2 3 44 555 0

串口调试软件截图
image

Modsim截图
image

04Modbus读取输入寄存器

与03保持寄存器相同

05Modbus写单个线圈

ModbusRTU协议按照下列模式发送报文

地址 功能码 起始地址高位 起始地址低位 写入值 CRC16 校验码
0x01 0x05 0x00 0x00 0xFF 0x00 0x8C 0x3A
从站1 写单个线圈 线圈地址0 写入TRUE CRC16校验

发送

01050000FF008C3A

收到反馈

01 05 00 00 FF 00 8C 3A 

说明写入成功。
串口调试软件截图
image

ModSim截图
image

06ModbusRTU写单个保持寄存器

ModbusRTU协议按照下列模式发送报文

地址 功能码 起始地址高位 起始地址低位 写入值高位 写入值数量低位 CRC16 校验码
0x01 0x06 0x00 0x00 0x00 0x01 0x48 0x0A
从站1 写入单个保持寄存器 寄存器地址0 写入1 CRC16 校验码

表格中的就是,对从站地址为1的设备的地址为0的保持寄存器(功能码06)写入1,发送的代码为:

0x01 0x06 0x00 0x00 0x00 0x01 0x48 0x0A

0x前缀代表是十六进制数,使用串口调试软件发送,勾选HEX发送, 则在发送窗口把0X去掉,直接发送对应数值。

01 06 00 00 00 01 48 0A

使用ModSim作为ModbusRTU从站(server),使用串口调试软件作为主站(client)对从站保持寄存器做写入操作可见:
image
原本从站的保持寄存器0位的值为2,使用串口调试软件发送上文数值
image
可以看到返回

01 06 00 00 00 01 48 0A

这就代表从站收到并响应,此时再看ModSim,
image
可以看到地址为1的寄存器值变为了1.

10写多个保持寄存器

ModbusRTU协议按照下列模式发送报文

地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 字节数 数据域 CRC16 校验码
0x01 0x10 0x00 0x00 0x00 0x02 0x04 0x00 0x06 0x0A 0x16 0x94 0xC0
从站1 写入多个保持寄存器 寄存器起始地址为0 写入2个寄存器 数据域总字节数(寄存器数量2:22=4字节) 0006 0A16:6 16 * 16 * 10+1 * 16 + 6 = 2582 CRC16 校验码

使用串口调试软件发送

0110000000020400060A1694C0

收到反馈

01 10 00 00 00 02 41 C8 

软件截图
image

反馈内容分析

字段 地址 功能码 起始地址 寄存器数量 CRC校验
01 10 00 00 00 02 41 C8
含义 从站1 写入多个保持寄存器 从寄存器0开始 写入2个寄存器数据 CRC校验

0F写多个线圈

ModbusRTU协议按照下列模式发送报文

地址 功能码 起始地址高位 起始地址低位 线圈数量高位 线圈数量低位 字节数 数据域 CRC16 校验码
0x01 0x0F 0x00 0x00 0x00 0x15 0x03 0x55 0x8E 0x38 0x19 0xD7
从站1 写入多个线圈 线圈起始地址为0 15:16+5=21 写入21个寄存器 数据域总字节数(线圈数量/8:21/8=>3字节) 55 8E 38: 0101 0101, 1000 1110, 0011 1000 =>0011 1000 1000 1110 0101 0101 CRC16 校验码

对应置ON的线圈

线圈编号 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ON/OFF 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1

需凑满字节数,所以发送的线圈数量是8的整数倍。从左到右,字节数由低到高,但字节内部对应线圈(位)号则左高右低。另,由于前面线圈数确定是21,所以是从0-20,等下可以注意ModSim的21号线圈的数值有没有写入。

使用串口调试软件发送

010F0000001503558E3819D7

收到反馈

01 0F 00 00 00 15 94 04 

软件截图
image

ModSim截图
image
可以看到ModSim的21号线圈是0,因为报文里定义了只写21个线圈。

反馈内容分析

字段 地址 功能码 起始地址 寄存器数量 CRC校验
01 0F 00 00 00 15 94 04
含义 从站1 写入多个线圈 从线圈0开始 写入16+5=21个线圈的数据 CRC校验
posted @ 2025-07-22 10:50  科里布  阅读(92)  评论(0)    收藏  举报