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 | 
串口调试软件截图

Modsim截图

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 
说明写入成功。
串口调试软件截图

ModSim截图

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)对从站保持寄存器做写入操作可见:

原本从站的保持寄存器0位的值为2,使用串口调试软件发送上文数值

可以看到返回
01 06 00 00 00 01 48 0A
这就代表从站收到并响应,此时再看ModSim,

可以看到地址为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 
软件截图

反馈内容分析
| 字段 | 地址 | 功能码 | 起始地址 | 寄存器数量 | 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 
软件截图

ModSim截图

可以看到ModSim的21号线圈是0,因为报文里定义了只写21个线圈。
反馈内容分析
| 字段 | 地址 | 功能码 | 起始地址 | 寄存器数量 | CRC校验 | 
|---|---|---|---|---|---|
| 值 | 01 | 0F | 00 00 | 00 15 | 94 04 | 
| 含义 | 从站1 | 写入多个线圈 | 从线圈0开始 | 写入16+5=21个线圈的数据 | CRC校验 | 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号