(三)Modbus RTU协议使用说明
一、Modbus RTU数据帧说明
由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在 RTU 模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作 t3.5。
整个报文帧必须以连续的字符流发送。如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。
二、MODBUS指令说明
1、读线圈寄存器01H
1) 描述:
读MODBUS从机线圈寄存器当前状态。
2) 查询:
例如从机地址为0x11,线圈寄存器的起始地址为0x0013,结束地址为0x0037。该次查询总共访问(0x0037-0x0013 + 1)37个线圈寄存器。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 01 |
寄存器起始地址高字节(1个字节) | 00 |
寄存器起始地址低字节(1个字节) | 13 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 25 |
CRC校验高字节(1个字节) | 0E |
CRC校验低字节(1个字节) | 84 |
3) 响应
响应负载中的各线圈状态与数据内容每位相对应。1代表ON,0代表OFF。若返回的线圈数不为8的倍数,则在最后数据字节未尾使用0代替。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 01 |
返回字节数(1个字节) | 05 |
数据1(线圈0x001A - 线圈0x0013)(1个字节) | CD |
数据2(线圈0x0022 - 线圈0x001B)(1个字节) | 6B |
数据3(线圈0x002A - 线圈0x0023)(1个字节) | B2 |
数据4(线圈0x0032 - 线圈0x002B)(1个字节) | 0E |
数据5(线圈0x0037 - 线圈0x0033)(1个字节) | 1B |
CRC校验高字节(1个字节) | 45 |
CRC校验低字节(1个字节) | E6 |
线圈0x0013到线圈0x001A的状态为0xCD,二进制值为11001101,该字节的最高字节为线圈0x001A,最低字节为线圈0x0013。线圈0x001A到线圈0x0013的状态分别为ON-ON-OFF-OFF-ON-ON-OFF-ON。
0x001A | 0x0019 | 0x0018 | 0x0017 | 0x0016 | 0x0015 | 0x0014 | 0x0013 |
ON | ON | OFF | OFF | ON | ON | OFF | ON |
最后一个数据字节中,线圈0x0033到线圈0x0037状态为0x1B(二进制00011011),线圈0x0037是左数第4位,线圈0x0033为该字节的最低字节,线圈0x0037至线圈0x0033的状态分别为ON-ON-OFF-ON-ON,剩余3位使用0填充。
0x003A | 0x0039 | 0x0038 | 0x0037 | 0x0036 | 0x0035 | 0x0034 | 0x0033 |
填充 | 填充 | 填充 | ON | ON | OFF | ON | ON |
2、读离散输入寄存器 02H
1) 说明
读离散输入寄存器状态。
2) 查询
从机地址为0x11。离散输入寄存器的起始地址为0x00C4,结束寄存器地址为0x00D9。总共访问(0x00D9-0x00C4+1)22个离散输入寄存器。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 02 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | C4 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 16 |
CRC校验高字节(1个字节) | BA |
CRC校验低字节(1个字节) | A9 |
3) 响应
响应各离散输入寄存器状态,分别对应数据区中的每位值,1 代表ON;0 代表OFF。第一个数据字节的LSB(最低字节)为查询的寻址地址,其他输入口按顺序在该字节中由低字节向高字节排列,直到填充满8位。下一个字节中的8个输入位也是从低字节到高字节排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位至该字节的最高位使用0填充。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 02 |
返回字节数(1个字节) | 03 |
数据1(0x00CB - 0x00C4)(1个字节) | AC |
数据1(0x00D3 - 0x00CC)(1个字节) | DB |
数据1(0x00D9 - 0x00D4)(1个字节) | 35 |
CRC校验高字节(1个字节) | 20 |
CRC校验低字节(1个字节) | 18 |
离散输入寄存器0x00D4到0x00D9的状态为0x35 (二进制00110101)。输入寄存器0x00D9为左数第3位,输入寄存器0x00D4为最低位,输入寄存器0x00D9到0x00D4的状态分别为ON-ON-OFF-ON-OFF-ON。0x00DB寄存器和0x00DA寄存器被0填充。
0x00CB | 0x00CA | 0x00C9 | 0x00C8 | 0x00C7 | 0x00C6 | 0x00C5 | 0x00C4 |
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
0x00D3 | 0x00D2 | 0x00D1 | 0x00D0 | 0x00CF | 0x00CE | 0x00CD | 0x00CC |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
0x00DB | 0x00DA | 0x00D9 | 0x00D8 | 0x00D7 | 0x00D6 | 0x00D5 | 0x00D4 |
填充 | 填充 | 1 | 1 | 0 | 1 | 0 | 1 |
3、读保持寄存器 03H
1) 说明
读保持寄存器。可读取单个或多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器的起始地址为0x006B,结束地址为0x006D。该次查询总共访问(0x006D-0x006B+1)3个保持寄存器。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 03 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | 6B |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 03 |
CRC高字节(1个字节) | 76 |
CRC低字节(1个字节) | 87 |
3) 响应
保持寄存器的长度为2个字节。对于单个保持寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。保持寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 03 |
字节数(1个字节) | 06 |
数据1高字节(0x006B)(1个字节) | 00 |
数据1低字节(0x006B)(1个字节) | 6B |
数据2高字节(0x006C)(1个字节) | 00 |
数据2低字节(0x006C)(1个字节) | 13 |
数据3高字节(0x006D)(1个字节) | 00 |
数据3低字节(0x006D)(1个字节) | 00 |
CRC高字节(1个字节) | 38 |
CRC低字节(1个字节) | B9 |
0x006B 高字节 |
0x006B 低字节 |
0x006C 高字节 |
0x006C 低字节 |
0x006D 高字节 |
0x006D 低字节 |
00 | 6B | 00 | 13 | 00 | 00 |
4、读输入寄存器 04H
1) 说明
读输入寄存器命令。该命令支持单个寄存器访问也支持多个寄存器访问。
2) 查询
从机地址为0x11。输入寄存器的起始地址为0x0008,寄存器的结束地址为0x0009。本次访问访问2个读入寄存器。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 04 |
寄存器起始地址高字节(1个字节) | 00 |
寄存器起始地址低字节(1个字节) | 08 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 02 |
CRC高字节(1个字节) | F2 |
CRC低字节(1个字节) | 99 |
3) 响应
输入寄存器长度为2个字节。对于单个输入寄存器而言,寄存器高字节数据先被传输,低字节数据后被传输。输入寄存器之间,低地址寄存器先被传输,高地址寄存器后被传输。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 04 |
字节数(1个字节) | 04 |
数据1高字节(0x0008)(1个字节) | 00 |
数据1低字节(0x0008)(1个字节) | 0A |
数据2高字节(0x0009)(1个字节) | 00 |
数据2低字节(0x0009)(1个字节) | 0B |
CRC高字节(1个字节) | 8B |
CRC低字节(1个字节) | 80 |
0x0008 高字节 |
0x0008 低字节 |
0x0009 高字节 |
0x0009 低字节 |
0x00 | 0x0A | 0x00 | 0x0B |
5、写单个线圈寄存器 05H
1) 说明
写单个线圈寄存器。0xFF00值请求线圈处于ON状态,0x0000值请求线圈处于OFF状态。0x05指令设置单个线圈的状态,0x15指令可以设置多个线圈的状态,两个指令虽然都设定线圈的ON/OFF状态,但是ON/OFF的表达方式却不同。
2) 查询
从机地址为0x11,线圈寄存器的地址为0x00AC。使0x00AC线圈处于ON状态,即数据内容为0xFF00。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 05 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | AC |
数据1高字节(1个字节) | FF |
数据1低字节(1个字节) | 00 |
CRC校验高字节(1个字节) | 4E |
CRC校验低字节(1个字节) | 8B |
3) 响应
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 05 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | AC |
寄存器1高字节(1个字节) | FF |
寄存器1低字节(1个字节) | 00 |
CRC校验高字节(1个字节) | 4E |
CRC校验低字节(1个字节) | 8B |
6、写单个保持寄存器 06H
1) 说明
写保持寄存器。注意0x06指令只能操作单个保持寄存器,0x16指令可以设置单个或多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器地址为0x0001。寄存器内容为0x0003。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 06 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | 01 |
数据1高字节(1个字节) | 00 |
数据1低字节(1个字节) | 01 |
CRC校验高字节(1个字节) | 9A |
CRC校验低字节(1个字节) | 9B |
3) 响应
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 06 |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | 01 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 01 |
CRC校验高字节(1个字节) | 1B |
CRC校验低字节(1个字节) | 5A |
7、写多个线圈寄存器 0FH
1) 说明
写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。
2) 查询
从机地址为0x11,线圈寄存器的起始地址为0x0013,线圈寄存器的结束地址为0x001C。总共访问(0x001C-0x0013+1)10个寄存器。寄存器内容如下表所示。
0x001A | 0x0019 | 0x0018 | 0x0017 | 0x0016 | 0x0015 | 0x0014 | 0x0013 |
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0x0022 | 0x0021 | 0x0020 | 0x001F | 0x001E | 0x001D | 0x001C | 0x001B |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
传输的第一个字节0xCD对应线圈为0x0013到0x001A,LSB(最低位)对应线圈0x0013,传输第二个字节为 0x01,对应的线圈为0x001B到0x001C,LSB对应线圈0x001C,其余未使用位使用0填充。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 0F |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | 13 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 0A |
字节数(1个字节) | 02 |
数据1(0x0013 - 0x001A)(1个字节) | CD |
数据2(0x001B - 0x001C)(1个字节) | 01 |
CRC校验高字节(1个字节) | BF |
CRC校验低字节(1个字节) | 0B |
3) 响应
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 0F |
寄存器地址高字节(1个字节) | 00 |
寄存器地址低字节(1个字节) | 13 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 0A |
字节数(1个字节) | 02 |
CRC校验高字节(1个字节) | 99 |
CRC校验低字节(1个字节) | 1B |
8、写多个保持寄存器10H
1) 说明
写多个保持寄存器。
2) 查询
从机地址为0x11。保持寄存器的起始地址为0x0001,寄存器的结束地址为0x0002。总共访问(0x0002-0x0001+1)2个寄存器。保持寄存器0x0001的内容为0x000A,保持寄存器0x0002的内容为0x0102。
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 10 |
寄存器起始地址高字节(1个字节) | 00 |
寄存器起始地址低字节(1个字节) | 01 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 02 |
字节数(1个字节) | 04 |
数据1高字节(1个字节) | 00 |
数据1低字节(1个字节) | 0A |
数据2高字节(1个字节) | 01 |
数据2低字节(1个字节) | 02 |
CRC校验高字节(1个字节) | C6 |
CRC校验低字节(1个字节) | F0 |
地址 |
0x0001 高字节 |
0x0001 低字节 |
0x0002 高字节 |
0x0002 低字节 |
数值 | 0x00 | 0x0A | 0x01 | 0x02 |
3) 响应
Hex | |
从机地址(1个字节) | 11 |
功能码(1个字节) | 10 |
寄存器起始地址高字节(1个字节) | 00 |
寄存器起始地址低字节(1个字节) | 01 |
寄存器数量高字节(1个字节) | 00 |
寄存器数量低字节(1个字节) | 02 |
CRC校验高字节(1个字节) | 12 |
CRC校验低字节(1个字节) | 98 |