Modbus协议
Modbus RTU
引用
https://blog.csdn.net/m0_74762280/article/details/129052728
地址码
0为广播;主站不占与地址;串口模式地址位:0-247;248-255为保留地址
功能码
寄存器种类 | 寄存器地址 | 读写状态 | 位操作字操作 | 适用功能码 |
---|---|---|---|---|
线圈寄存器 | 00001-09999 | 读/写 | 位 | 01H(读线圈寄存器)05H(写单个线圈寄存器) 0FH(写多个线圈寄存器) |
离散输入寄存器 | 10001-19999 | 只读 | 位 | 02H |
保持寄存器 | 40001-49999 | 读/写 | 字 | 03H(读保持寄存器) 06H(写单个保持寄存器) 10H(写多个保持寄存器) |
输入寄存器 | 30001-39999 | 只读 | 字 | 04H |
报告slave ID | 11H | |||
错误检测 | 80H | |||
异步事件报告 | 14H |
每种功能码的举例
报文举例
线圈寄存器
写单个线圈、多个线圈的功能码是不一样的;读单个线圈、多个线圈的指令是一样的
写单个线圈寄存器
写线圈的发送和返回报文都是一样的
Send:FF 05 00 01 FF 00 C8 24
Rece:FF 05 00 01 FF 00 C8 24
解析发送报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 05 | 功能码; |
2-3 | 00 01 | 起始线圈的地址; 对应的实际地址:00002 |
4-5 | FF 00 | |
6-7 | C8 24 | CRC校验;循环冗余校验 |
解析接收报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 05 | 功能码; |
2-3 | 00 01 | 起始线圈的地址; 对应的实际地址:00002 |
4-5 | FF 00 | |
6-7 | C8 24 | CRC校验;循环冗余校验 |
读保持寄存器
写单个寄存器、多个寄存器的功能码是不一样的;读单个寄存器、多个寄存器的指令是一样的
Send:FF 03 00 10 00 0D 90 14
Rece:FF 03 1A 00 00 01 00 01 00 00 00 F2 03 00 00 F8 2A 00 00 38 CD FF FF 70 17 00 00 XX XX
解析发送报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 03 | 功能码; |
2-3 | 00 01 | 起始寄存器的地址; 对应的实际地址:40002 |
4-5 | 00 0D | 要读取的寄存器的数量 |
6-7 | 90 14 | CRC校验;循环冗余校验 |
解析接收报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 03 | 功能码; |
2 | 1A | 被读取的Data的字节数(因为一个寄存器是两个字节,0D×2=1A) |
3-26 | ... | Data;个数跟上面的数相同 |
27-28 | CC 94 | CRC校验;循环冗余校验 |
写多个保持寄存器
Send:FF 10 02 00 00 01 02 20 00 CC 94
Rece:FF 10 02 00 00 01 15 AF
解析发送报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 10 | 功能码; |
2-3 | 02 00 | 起始寄存器的地址; 对应的实际地址:40513(40001+200H) |
4-5 | 00 01 | 要写入的寄存器的数量(因为一个寄存器是两个字节,01×2=02) |
6 | 02 | 要写入的Data的字节数 |
7-8 | 02 00 | Data |
9-10 | CC 94 | CRC校验;循环冗余校验 |
解析接受报文
序号 | 报文 | 描述 |
---|---|---|
0 | FF | 地址位;0为广播,串口模式地址位:0-255 |
1 | 10 | 功能码; |
2-3 | 02 00 | 起始寄存器的地址; |
4-5 | 02 00 | Data |
6-7 | CC 94 | CRC校验;循环冗余校验 |
Modbus TCP
Modbus TCP报文的格式主要包括TCP/IP头部和Modbus应用数据两部分。TCP/IP头部用于在网络层传输数据,确保数据包能够准确到达目标主机和端口,而Modbus应用数据则包含了Modbus协议特定的指令和数据。
Modbus TCP报文的Modbus应用数据部分(除去TCP/IP头部)一般结构如下:
MBAP(Modbus Application Protocol Header)头:
Transaction Identifier (TransID):4字节,用于识别请求与响应的关联性,客户端在发出请求时生成,服务器会在响应中复用这个ID。
Protocol Identifier (ProtoID):2字节,常设置为00 00,代表Modbus协议。
Length:2字节,表示紧随其后的PDU(Protocol Data Unit)的长度(以字节计)。
Unit Identifier (UnitID):1字节,类似于Modbus RTU中的设备地址,用于指定接收报文的设备。
PDU(Protocol Data Unit):
- 功能码(Function Code):1字节,定义了Modbus操作的类型,如读取线圈、寄存器等。
- 数据区(Data Field):长度可变,根据功能码的不同,包含相应的信息,比如寄存器地址、寄存器数量、读取或写入的数据等。
举例说明:
一个Modbus TCP报文请求读取保持寄存器的实例可能如下所示(十六进制表示,已省略IP和TCP头部):
请求报文:
00 00 00 00 00 06 01 03 00 00 00 01
解析请求报文
报文 | 描述 |
---|---|
00 00 00 00 | TransID |
00 00 | ProtoID |
00 06 | Length(表示PDU长度为6字节) |
01 | UnitID |
03 | Function Code(读取保持寄存器) |
00 00 00 01 | Data Field(表示从地址0开始读取1个保持寄存器) |
响应报文:
00 00 00 00 00 0A 01 03 02 04 00 01 FF 00
解析请求报文
报文 | 描述 |
---|---|
00 00 00 00 | TransID |
00 00 | ProtoID |
00 0A | Length(表示PDU长度为10字节) |
01 | UnitID |
03 | Function Code (读取保持寄存器) |
02 04 00 01 FF 00 | Data Field(表示返回了2个寄存器的数据,每个寄存器占用2字节,这里是地址0的寄存器值为0x0001,下一个寄存器值为0xFF00) |
请注意,上述例子简化了网络传输过程中的实际报文结构,真实的Modbus TCP报文会嵌套在TCP/IP报文内部,在网络上传输时还会带有源IP地址、目标IP地址、源端口号、目标端口号等TCP/IP头部信息。