(三)ModbusRTU协议使用说明
一、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
原文链接:https://www.cnblogs.com/wenhao-Web/archive/2020/05/31/12997333.html
以上是 (三)ModbusRTU协议使用说明 的全部内容, 来源链接: utcz.com/z/516969.html