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头部信息。

posted @ 2024-03-22 14:48  回首起了风沙  Views(33)  Comments(0Edit  收藏  举报