Modbus-RTU报文结构及常用功能码详解

Modbus-RTU报文结构及常用功能码

Modbus是一种串行通讯协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的。现在的Modbus协议已经成为工业控制领域通信协议的业界标准,是工业电子设备间常用的通讯协议。

Modbus协议能够成为工业控制领域应用最广泛的协议,它具备了以下几个特点:

  • 开放性架构:Modbus协议完全公开且无版权限制,企业可自由修改适配设备,降低开发成本。施耐德电气公开协议后,全球200余家企业推出兼容硬件;
  • 跨平台兼容:支持RS-485、RS-232、以太网等多种物理层接口,覆盖从串行通信到TCP/IP网络的场景;
  • 协议简单稳定:固定数据帧格式(地址+功能码+数据+校验)和主从通信模式,确保实时性及可靠性;

Modbus RTU协议

1. Modbus RTU协议的基本概念

Modbus RTU模式是二进制模式,数据流以字节为单位传输,每个字节的高位首先发送。传输数据时,使用了差错检测机制,以确保数据的完整性。通常RTU模式通过RS-485总线进行通讯,因为它能够支持多个设备(最多247个设备)并且支持长距离传输。

2. Modbus RTU通信的帧结构

用途 长度 描述
设备地址 1byte 从机有唯一的地址,范围1-247.地址0是广播地址,从机不会应答
功能码 1byte 主机要求从机执行的操作类型
数据 可变(0-252byte) 包含了命令的具体参数,格式和长度却决于功能码
CRC校验 2byte 检查数据在传输过程中是否有错误

3. Modbus RTU协议中的功能码

常用功能码表格

功能码 名称 操作数据类型 作用
0x01 读线圈(Read Coils) 位 取得一组逻辑线圈的当前状态(ON/OFF)
0x02 读离散输入寄存器(Read Discrete Inputs) 位 取得一组开关输入的当前状态(ON/OFF)
0x03 读保持寄存器(Read Holding Registers) 整型、浮点型、字符型 在一个或多个保持寄存器中取得当前的二进制值
0x04 读输入寄存器(Read Input Registers) 整型、浮点型 在一个或多个输入寄存器中取得当前的二进制值
0x05 写单个线圈寄存器 (Write Single Coil) 位 强置一个逻辑线圈的通断状态
0x06 写单个保持寄存器(Write Single Register) 整型、浮点型、字符型 把具体二进制值装入一个保持寄存器
0x0F 写多个线圈寄存器(Write Multiple Coils) 位 强置一串连续逻辑线圈的通断
0x10 写多个保持寄存器(Write Multiple Registers) 整型、浮点型、字符型 把具体的二进制值装入一串连续的保持寄存器

1.功能码 0x01-读线圈(Read Coils)

  • 作用:读从机线圈寄存器,位操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x01 0x00 0x17 0x00 0x08 0x8D 0xC8
js 复制代码
Tx:01 01 00 17 00 08 8D C8
  • 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
从机地址 功能码 返回字节数 data CRC H CRC L
0x01 0x01 0x01 0x17 0x11 0x86
js 复制代码
Rx:01 01 01 17 11 86

2.功能码 0x02-读离散输入寄存器(Read Discrete Inputs)

  • 作用:读从机离散输入寄存器,位操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x02 0x00 0x17 0x00 0x08 0xC9 0xC8
js 复制代码
Tx:01 02 00 17 00 08 C9 C8
  • 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
从机地址 功能码 返回字节数 data CRC H CRC L
0x01 0x02 0x01 0x17 0xE1 0x86
js 复制代码
Rx:01 02 01 17 E1 86

3.功能码 0x03-读保持寄存器(Read Holding Inputs)

  • 作用:读从机保持寄存器,字节操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x03 0x00 0x17 0x00 0x01 0x34 0x0E
js 复制代码
Tx:01 03 00 17 00 01 34 0E
  • 响应:返回数据;
从机地址 功能码 返回字节数 data1H data1L CRC H CRC L
0x01 0x03 0x02 0x17 0x01 0x76 0x74
js 复制代码
Rx:01 03 02 17 01 76 74

4.功能码 0x04-读输入寄存器(Read Input Inputs)

  • 作用:读从机输入寄存器,字节操作,可读单个或多个;
  • 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) CRC H CRC L
0x01 0x04 0x00 0x17 0x00 0x01 0x81 0xCE
js 复制代码
Tx:01 04 00 17 00 01 81 CE
  • 响应:返回数据;
从机地址 功能码 返回字节数 data1H data1L CRC H CRC L
0x01 0x04 0x02 0x17 0x01 0x77 0x00
js 复制代码
Rx:01 04 02 17 01 77 00

5.功能码 0x05-写单个线圈寄存器(Write Single Coil)

  • 作用:写单个线圈,位操作,只能写一个,写0xFF00表示线圈为ON,写0x0000表示线圈为OFF
  • 发送指令:从机地址:0x01,设置线圈0x0017为ON。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) DATAH DATAL CRC H CRC L
0x01 0x05 0x00 0x17 0xFF 0x00 0x3C 0x3E
js 复制代码
Tx:01 05 00 17 FF 00 3C 3E
  • 响应:同发送数据;

6.功能码 0x06-写单个保持寄存器(Write Single Register)

  • 作用:写单个保持寄存器,字节操作,只能写一个,
  • 发送指令:从机地址:0x01,设置线圈0x0017为0x2193。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) DATAH DATAL CRC H CRC L
0x01 0x06 0x00 0x17 0x21 0x93 0x61 0xF3
js 复制代码
Tx:01 06 00 17 21 93 61 F3
  • 响应:同发送数据;

7.功能码 0x0F-写多个线圈(Write Multiple Coils)

  • 作用:写多个线圈寄存器,数据区的位0表示OFF,位1表示ON;
  • 发送指令:从机地址:0x01,线圈地址0x0012,写5个线圈。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 DATAH DATAL CRC H CRC L
0x01 0x0F 0x00 0x12 0x00 0x05 0x01 0x00 0x13 0x54 0x93
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 54 93
  • 响应:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 CRC H CRC L
0x01 0x0F 0x00 0x12 0x00 0x05 0x01 0xCC 0xD7
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 CC D7

8.功能码 0x10-写多个保持寄存器(Write Multiple Registers)

  • 作用:写多个保持寄存器,字节操作,可写多个;
  • 发送指令:从机地址:0x01,寄存器地址0x0012,写2个寄存器4个字节数据。发送命令如下:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 DATA1H DATA1L DATA2H DATA2L CRC H CRC L
0x01 0x10 0x00 0x12 0x00 0x02 0x04 0x00 0x13 0x00 0x11 0x42 0xB3
js 复制代码
Tx:01 0F 00 12 00 05 01 00 13 00 11 42 B3
  • 响应:
从机地址 功能码 寄存器起始地址(高8位) 寄存器起始地址(低8位) 寄存器数量(高8位) 寄存器数量(低8位) 字节数 CRC H CRC L
0x01 0x10 0x00 0x12 0x00 0x02 0x04 0x0C 0x8B
js 复制代码
Tx:01 0F 00 12 00 02 04 0C 8B 

结语

Modbus RTU协议是工业控制系统中一种非常常见的通信协议,以其简单、可靠和高效的特点被广泛应用于各类设备的串行通信中。它适合小型到中型的系统,尤其在现场设备、PLC和传感器之间的通信中发挥着重要作用。然而,由于没有内建的安全机制,在使用时需要确保网络和通信的安全性。


推荐工具


关注我,获取更多有用的知识和工具

相关推荐
yangjj20054 天前
手写 Modbus 上位机我踩过的 7 个工业级坑
modbus·温度监测·上位机开发
dalong105 天前
WPF:Modbus 状态监控
wpf·modbus
AlanBruce11 天前
摩尔信使MThings EdgeWeb使用指南
上位机·plc·modbus·mthings·摩尔信使
AlanBruce11 天前
摩尔信使MThings逻辑控制各组件使用指南
自动化·上位机·modbus·mthings·摩尔信使
AlanBruce11 天前
摩尔信使MThings DL/T 698.45数据配置使用指南
上位机·plc·modbus·mthings·摩尔信使
AlanBruce11 天前
摩尔信使MThings CJ/T 188数据配置使用指南
自动化·modbus·摩尔信使
合天网安实验室15 天前
Modbus协议及其取证的学习笔记
ctf·modbus·通信协议·取证
2601_9623818615 天前
Modbus地址40001就是0x0000?我干了8年,发现80%工程师都搞错
错误·modbus·工程师·地址·工业协议
仰科网关22 天前
采集opc da 服务器数据 转 EthernetIP项目案例
网关·modbus·协议转换·规约转换器
@嵌入式扫地僧22 天前
RK2108 实现 Modbus 异常流量 100μs 级检测全流程
tcp·modbus·嵌入式ai·边缘ai·tcn-tiny