一、Modbus TCP协议构成
Modbus TCP通信协议主要包括三个部分:报文头(MBAP)、功能码和数据。Modbus TCP/IP协议的最大数据帧为260个字节。
二、MBAP报文头构成
MBAP报文头占7个字节,具体构成如下:
- 事务处理标识符(Transaction Identifier):2个字节,为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文。
- 协议标识符(Protocol Identifier):2个字节,表示该条指令遵循Modbus TCP协议,一般都为00 00。
- 长度(Length):2个字节,表示后面数据的长度,有几个字节,高字节在前。
- 单元标识符(Unit Identifier):1个字节,设备地址,可以用于局域网里面的具体地址。如果目标机器有固定IP,这个地址可能不起作用,通常写成00。
三、功能代码
功能代码占1个字节,主机给从机发送Modbus协议时,从机根据功能码的不同完成不同的操作。功能代码基于四种不同的寄存器类型(离散量输入、线圈、输入寄存器、保持寄存器)可以分为8种主要的功能代码,包括:
- 01H:读线圈状态
- 02H:读离散量输入线圈
- 03H:读保持寄存器
- 04H:读输入寄存器
- 05H:写单个线圈
- 06H:写单个保持寄存器
(注:以上仅为部分功能代码示例,还有其他功能代码用于不同的操作)
四、数据区
数据区位于功能码之后,其长度和内容取决于功能码和具体的操作。例如,在读取多个线圈的请求报文中,数据区可能包含起始地址和读取的线圈数量;在响应报文中,数据区则包含实际读取的线圈状态值。
五、示例报文
以下是两个示例报文,用于说明Modbus TCP报文的格式:
读取多个线圈的请求报文:
00 01 00 00 00 06 FF 01 00 01 00 10
其中:
- 00 01:事务处理标识符
- 00 00:协议标识符
- 00 06:长度,表示后面有6个字节的数据
- FF:单元标识符,设备地址
- 01:功能码,读取多个线圈
- 00 01:起始地址
- 00 10:读取的线圈数量(16个)
读取多个保持寄存器的响应报文:
00 01 00 00 00 07 01 03 04 00 22 00 00
其中:
- 00 01 00 00 00 07:与请求报文中的前6个字节相同,表示事务处理、协议和长度信息
- 01:单元标识符
- 03:功能码,读取多个保持寄存器
- 04:后面数据位的长度,表示有4个字节的数据
- 00 22 00 00:实际读取的保持寄存器值(示例数据)
通过以上讲解和示例,希望能够清晰地展示Modbus TCP报文的结构和组成。
标签:00,01,字节,报文,TCP,Modbus,寄存器 From: https://blog.csdn.net/qq_46994975/article/details/139278392