MODBUS TCP协议实例数据帧详细分析

MODBUS TCP协议实例数据帧详细分析

  • 1.简介
  • 2.ModbusTCP数据帧
    • 2.1.报文头MBAP
    • 2.2.帧结构PDU
  • 3.ADU详细结构
    • 3.1. 0x01:读线圈
    • 3.2. 0x02:读离散量输入
    • 3.3. 0x03:读保持寄存器
    • 3.4. 0x04:读输入寄存器
    • 3.5. 0x05:写单个线圈
    • 3.6. 0x06:写单个保持寄存器
    • 3.7. 0x0F:写多个线圈
    • 3.8. 0x10:写多个保持寄存器

1.简介

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

2.ModbusTCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU,如下图所示。
MODBUS TCP协议实例数据帧详细分析_第1张图片

2.1.报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

事务处理标识 协议标识 长度 单元标识符
2字节 2字节 2字节 1字节
内容 含义
事务处理标识 可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文
协议标识符 00 00 表示Modbus TCP协议
长度 表示接下来的数据长度,单位为字节。
单元标识符 可以理解为设备地址

2.2.帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。

对象 含义
线圈 PLC的输出位,开关量,在Modbus中可读可写
离散量 PLC的输入位,开关量,在Modbus中只读
输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写
根据对象的不同,Modbus的功能码有:
功能码 含义
0x01 读线圈
0x02 读离散量输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器
说明更详细的表如下表所示
功能码 中文含义解析
0x01 读线圈状态
0x02 读离散量输入状态
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器

3.ADU详细结构

3.1. 0x01:读线圈

在从站中读连续线圈状态,ON=1,OFF=0。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 线圈数据长度 数据
7字节 1字节 1字节 线圈数据长度个字节

注意:线圈数据长度=1+线圈数/8

如:在从站0x01中,读取开始地址为0x0000的线圈数据,读0x0008位。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L
00 01 00 00 00 06 01 01 00 00 00 08

如:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF。

  • 响应:

| MBAP | 功能码 | 线圈数据长度 | 数据 |
|–|–|–|–|–|–|
| 00 01 00 00 00 04 01 | 01 | 01 | 01 |

3.2. 0x02:读离散量输入

在从站中读连续离散量输入状态,ON=1,OFF=0。

  • 请求:
MBAP 功能码 起始地址H 起始地址L 离散量输入数量H 离散量输入数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 离散量输入数据长度 数据
7字节 1字节 1字节 离散量输入数据长度个字节

注意:离散量输入数据长度=1+离散量输入/8

如:在从站0x01中,读取开始地址为0x0000的线圈数据,读0x0008位。

  • 请求:

| MBAP | 功能码 | 起始地址H | 起始地址L | 离散量输入数量H | 离散量输入数量L
|–|–|–|–|–|–|–|–|
|00 01 00 00 00 06 01 | 02 |00 | 00 | 00 | 08 |

如:在从站0x01中,读取开始地址为0x0000的离散量输入数据,读0x008位

  • 响应:
MBAP 功能码 离散量输入数据长度 数据
00 01 00 00 00 04 01 02 01 01

3.3. 0x03:读保持寄存器

在从站中读连续保持寄存器的值

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 数据长度 数据
7字节 1字节 1字节 数据长度个字节

注意:保持寄存器数据长度=保持寄存器数*2

如:在从站0x01中,读取开始地址为0x0000的保持寄存器数据,读0x003个

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
00 01 00 00 00 06 01 03 00 00 00 03
如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。
  • 响应:
MBAP 功能码 数据长度 数据
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

3.4. 0x04:读输入寄存器

在从站中读连续输入寄存器的值

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 数据长度 数据
7字节 1字节 1字节 数据长度个字节

注意:输入寄存器数据长度=输入寄存器数*2

如:在从站0x01中,读取开始地址为0x0000的输入寄存器数据,读0x003个

  • 请求:
MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L
00 01 00 00 00 06 01 04 00 00 00 03
如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。
  • 响应:

|MBAP| 功能码 | 数据长度 | 数据 |
|–|–|–|–|–|–|
| 00 01 00 00 00 09 01 | 04 | 06 | 00 21 00 00 00 00 |

3.5. 0x05:写单个线圈

将从站中的一个线圈输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

  • 请求:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
7字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将地址为0x0000的线圈设置为ON

  • 请求:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
00 01 00 00 00 06 01 05 00 00 FF 00
  • 响应:
MBAP 功能码 线圈地址H 线圈地址L 输出值H 输出值L
00 01 00 00 00 06 01 05 00 00 FF 00

3.6. 0x06:写单个保持寄存器

将从站中的一个保持寄存器设置

  • 请求:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
7字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
7字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将地址为0x0000的保持寄存器设置为0x000A。

  • 请求:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
00 01 00 00 00 06 01 06 00 00 00 0A
  • 响应:
MBAP 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L
00 01 00 00 00 06 01 06 00 00 00 0A

3.7. 0x0F:写多个线圈

将从站中的多个线圈输出写成ON或OFF,线圈输出值每1位“1”请求输出为ON,“0”请求输出为OFF

  • 请求:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值
7字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
注意:线圈输出字节长度=1+线圈数/8
  • 响应:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L
7字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,将以地址0x0000开始连续的4个线圈设置为ON

  • 请求:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值
00 01 00 00 00 08 01 0F 00 00 00 04 01 0F
  • 响应:
MBAP 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L
00 01 00 00 00 06 01 0F 00 00 00 04

3.8. 0x10:写多个保持寄存器

写从站中的多个连续的寄存器。

  • 请求:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据
7字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
注意:寄存器数据字节长度=寄存器数量×2
  • 响应:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L
7字节 1字节 1字节 1字节 1字节 1字节
如:在从站0x01中,向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F。
  • 请求:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
  • 响应:
MBAP 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L
00 01 00 00 00 06 01 10 00 00 00 01

你可能感兴趣的:(MODBUS协议数据帧详解,tcp/ip,网络协议,网络)