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

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

  • 1.简介
  • 2.ModbusRTU数据帧
    • 2.1.地址域
    • 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.ModbusRTU数据帧

2.1.地址域

  • Modbus地址规则
    Modbus寻址空间有256个不同地址。
0 1~247 248~255
广播地址 子节点单独地址 保留
  • 在 Modbus 串行链路,地址域只含有子节点地址

合法的子节点地址为十进制 0–247。每个子设备被赋予1–247 范围中的地址。主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答。

2.2.帧结构PDU

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

对象 含义
线圈 PLC的输出位,开关量,在Modbus中可读可写
离散量 PLC的输入位,开关量,在Modbus中只读
输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写

根据对象的不同,Modbus的功能码有:

功能码 含义
0x01 读线圈
0x02 读离散量输入
0x03 读保持寄存器
0x04 读输入寄存器
0x05 写单个线圈
0x06 写单个保持寄存器
0x0F 写多个线圈
0x10 写多个保持寄存器

说明更详细的表如下表所示

功能码 中文含义解析 英文含义解析 位/字操作 操作数量
0x01 读线圈状态 READ COIL STATUS 位操作 单个或多个
0x02 读离散量输入状态 READ INPUT STATUS 位操作 单个或多个
0x03 读保持寄存器 READ HOLDING REGISTER 字操作 单个或多个
0x04 读输入寄存器 READ INPUT REGISTER 字操作 单个或多个
0x05 写单个线圈 WRITE SINGLE COIL 位操作 单个
0x06 写单个保持寄存器 WRITE SINGLE REGISTER 字操作 单个
0x0F 写多个线圈 WRITE MULTIPLE COIL 位操作 多个
0x10 写多个保持寄存器 WRITE MULTIPLE REGISTER 字操作 多个

3.ADU详细结构

3.1. 0x01:读线圈

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
从机地址 功能码 线圈数据长度 数据 CRC校验H CRC校验L
1字节 1字节 1字节 线圈数据长度个字节 1字节 1字节

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

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 线圈数量H 线圈数量L CRC校验H CRC校验L
01 01 00 00 00 08 3D CC

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

  • 响应:
从机地址 功能码 线圈数据长度 数据 CRC校验H CRC校验L
01 01 01 01 90 48

3.2. 0x02:读离散量输入

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

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

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

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 离散量输入数量H 离散量输入数量L CRC校验H CRC校验L
01 02 00 00 00 08 79 CC

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

  • 响应:
从机地址 功能码 离散量输入数据长度 数据 CRC校验H CRC校验L
01 02 01 01 60 48

3.3. 0x03:读保持寄存器

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
从机地址 功能码 数据长度 数据 CRC校验H CRC校验L
1字节 1字节 1字节 数据长度个字节 1字节 1字节

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

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L CRC校验H CRC校验L
01 03 00 00 00 03 05 CB

如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。

  • 响应:
从机地址 功能码 数据长度 数据 CRC校验H CRC校验L
01 03 06 00 21 00 00 00 00 9D 72

3.4. 0x04:读输入寄存器

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
从机地址 功能码 数据长度 数据 CRC校验H CRC校验L
1字节 1字节 1字节 数据长度个字节 1字节 1字节

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

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

  • 请求:
从机地址 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L CRC校验H CRC校验L
01 04 00 00 00 03 B0 0B

如:数据长度为0x06个字节,第1个寄存器的数据为0x21,其余为0x00。

  • 响应:
从机地址 功能码 数据长度 数据 CRC校验H CRC校验L
01 04 06 00 21 00 00 00 00 DC 94

3.5. 0x05:写单个线圈

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

  • 请求:
从机地址 功能码 线圈地址H 线圈地址L 输出值H 输出值L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
从机地址 功能码 线圈地址H 线圈地址L 输出值H 输出值L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

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

  • 请求:
从机地址 功能码 线圈地址H 线圈地址L 输出值H 输出值L CRC校验H CRC校验L
01 05 00 00 FF 00 8C 3A
  • 响应:
从机地址 功能码 线圈地址H 线圈地址L 输出值H 输出值L CRC校验H CRC校验L
01 05 00 00 FF 00 8C 3A

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

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

  • 请求:
从机地址 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节
  • 响应:
从机地址 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

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

  • 请求:
从机地址 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L CRC校验H CRC校验L
01 06 00 00 00 0A 09 CD
  • 响应:
从机地址 功能码 保持寄存器地址H 保持寄存器地址L 设置值H 设置值L CRC校验H CRC校验L
01 06 00 00 00 0A 09 CD

3.7. 0x0F:写多个线圈

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

  • 请求:
从机地址 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值 CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

注意:线圈输出字节长度=1+线圈数/8

  • 响应:
从机地址 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

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

  • 请求:
从机地址 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L 线圈输出字节长度 线圈输出值 CRC校验H CRC校验L
01 0F 00 00 00 04 01 0F 7E 92
  • 响应:
从机地址 功能码 线圈起始地址H 线圈起始地址L 线圈数H 线圈数L CRC校验H CRC校验L
01 0F 00 00 00 04 54 08

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

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

  • 请求:
从机地址 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据 CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

注意:寄存器数据字节长度=寄存器数量×2

  • 响应:
从机地址 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L CRC校验H CRC校验L
1字节 1字节 1字节 1字节 1字节 1字节 1字节 1字节

如:在从站0x01中,向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F。

  • 请求:
从机地址 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L 寄存器数据字节长度 寄存器数据 CRC校验H CRC校验L
01 10 00 00 00 01 02 00 0F E6 54
  • 响应:
从机地址 功能码 寄存器起始地址H 寄存器起始地址L 寄存器数H 寄存器数L CRC校验H CRC校验L
01 10 00 00 00 01 01 C9

你可能感兴趣的:(MODBUS协议数据帧详解,单片机,stm32,物联网,mcu,51单片机)