Modbus RTUdatamessage结构详解

freefree技术Resources

这篇内容可直接阅读,适合用于基础学习和Search引流。

Modbus RTUdatamessage结构详解缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 什么是Modbus RTU协议?
  2. 2. Modbus RTU代表什么?
  3. 3. Modbus RTU如何工作?
  4. 4. 什么是Modbus RTU主站?
  5. 5. 什么是Modbus RTU从站?
  6. 6. 帧结构
  7. 7. function code0x03(读)
  8. 8. function code0x06(写)
  9. 9. 01H-读Coil status
  10. 10. 02H-读离散input state
  11. 11. 03H-读保持register
  12. 12. 04H-读输入register
  13. 13. 05H-写单个线圈
  14. 14. 06H-写单个保持register
  15. 15. 0F-写多个线圈
  16. 16. 10H-写多个保持register

什么是Modbus RTU协议?

Modbus RTU协议是一种允许可编程逻辑控制器(PLC)和计算机之间进行data交换的通信方式。 电子设备可以使用Modbus协议通过串行线路交换信息。

它已被广泛接受并广泛用于 建筑管理system 的建设 (BMS) 和Automationsystem(IAS)。 它的易用性,可靠性以及它是开源的,并且可以在任何设备或应用程序中free使用。

该协议由Modicon®于1979年开发和发布,用于其可编程逻辑控制器。 它使用主/从架构构建,并支持使用RS232 / RS485 / RS422协议的串行设备。 Modbus通常用于多个仪器和控制设备将信号传输到中央控制器或system以收集和分析data的情况。 Automation和监督控制和Data Acquisition (SCADA) system通常采用Modbus协议。

Modbus RTU代表什么?

Modbus RTU(远程终端单元)是原始Modbus规范中定义的两种传输模式之一。 这两种模式是Modbus RTU和ASCII,它们都设计用于支持RS232,RS485和RS422协议的串行设备。 Modbus RTU的一个显着特点是它使用binaryCoding和强大的CRCError检查。 Modbus RTU是Modbus协议的实现,最常用于工业应用和自动化生产设施。

Modbus RTU如何工作?

Modbus协议基本上是一个处理来自电子设备的Request和Response的system。 主/从体系结构与主设备Request一起使用,这些Request由从设备Response。

什么是Modbus RTU主站?

Modbus RTU主站是从connect的从站设备Request信息的中央设备。 自动化生产system中的中央控制器可以扮演Modbus RTU主站的角色。 Modbus实现有一个主服务器。 主设备从从设备获取信息,也可以写入从设备的register。

什么是Modbus RTU从站?

Modbus RTU从站是Response主设备Requestequipment。 它无法启动信息传输,并且在Response主服务器发出的Request之前处于保持模式。

Modbus协议的核心是被称为的组件 协议data单元 (PDU). PDU由Function代码和data组成,无论使用何种Modbus传输模式,都可以一致地构建。 Function代码指定主站Request的data。

在Modbus RTU传输模式中,附加信息包裹在PDU周围以创建完整的应用data单元(ADU)。 在信号流中和Function代码之前,在Modbus RTU模式下,send1byte的从ID以识别应满足Request的从设备。 附加到PDU的是2byteCRC,确保send和receive正确quantity的byte。

Modbus设备支持四个data表,用于促进设备之间的通信。 它们是离散输入,离散输出(线圈),输入register和保持register。 register执行不同的Function,并不是每A device都包含在内。 在某些情况下,只有保持register用于I / OFunction。

领域访问尺寸描述
离散输入只读1位用作输入
线圈输出读/写1位用于控制离散
输入register只读16位用于输入
持有register读/写16位用于各种事物,包括输入,输出,配置data等。

Function代码指示主设备如何与从设备ID中指定的从设备进行交互。 根据send的Function代码,主设备可以读取从机的一个register,或写入它们。

当从站receive到包含Request中的Error的data包时,它们会返回Error代码。 对于诸如Illegal functionRequest,指定从站无法访问的非法register address以及指示从设备忙或已经发生故障的消息等问题,将返回Error代码。

Modbus RTU要求您在启动通信时知道或定义Baud rate,字符format(8位无奇even parity等)和从站ID等参数。 任何这些参数不匹配都会导致您的通信尝试失败。

下面让我们详细解释一下Modbus RTUdatamessage:

帧结构

帧结构 = address + Function吗 + data + 校验

address: 占用一个byte,范围0-255,其中effective范围是1-247,其他有特殊用途,比如255是广播address(广播address就是应答所有address,正常的需要两A device的address一样才能进行查询和回复)。

function code:占用一个byte,function code的意义就是,知道这个指令是干啥的,比如你可以查询从机的data,也可以修改data,所以不同function code对应不同Function。

data:根据function code不同,有不同结构,在后续的实例中有说明。

校验:为了保证data不Error,增加这个,然后再把前面的data进行计算看data是否一致,如果一致,就说明这帧data是正确的,我再回复;如果不一样,说明你这个data在传输的时候出了问题,data不对的,所以就抛弃了。

下面通过function code03和06解释详细解释一下:

function code0x03(读)

主机send: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E


那么这一组data是什么意思呢?

从上面的结构图中,可以看出,主机send的data大致是 address+function code+data+校验

所以Parse如下:

senddataParse

Modbus RTUdatamessage结构详解插图
01 - address,也就是你传感器的address
03 - function code,03代表查询Function,查询传感器的data
00 00 - 代表查询的Starting register address.说明从0x0000Start Query。这里需要说明以下,Modbus把data存放在register中,通过查询register来得到不同变量的值,一个register address对应2byte count据
00 01 - 代表查询了一个register.结合前面的00 00,意思就是查询从0开始的1个register value
84 0A - 循环冗余校验,是modbus的校验公式,从首个byte开始到84前面为止;

回复dataParse

Modbus RTUdatamessage结构详解插图1
01 - address,也就是你传感器的address
03 - 功function code,03代表查询Function,查询传感器的data。这里要注意的是注意发给从机的function code是啥,从机就要回复同样的function code,如果不一样说明这一帧data有Error
02 - 代表后面data的byte count,因为上面说到,一个register有2个byte,所以后面的byte count肯定是2*查询的register个数;
19 98 - register的值是19 98,结合send的data看出,01这个register的值为19 98
B2 7E - 循环冗余校验

基本流程:

send:从机的address+我要干嘛的function code+我要查的register的address+我要查的register address的个数+校验码

回复:从机的address+主机发我的function code+要send给主机data的byte count+data+校验码

function code0x06(写)

如果我要修改从机的data呢?那么这个协议有吗,答案是Yes!

主机send: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

senddataParse

Modbus RTUdatamessage结构详解插图2
01-主机要查询的从机address
06-function code,06代表修改单个registerFunction,修改有些不同,有修改一个register和修改多个register;
00 00-代表修改的Starting register address.说明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号register value为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个byte开始到48前面为止;

回复dataParse

Modbus RTUdatamessage结构详解插图3
01-从机返回给主机自己的address,说明这就是主机查的从机
06-function code,代表修改单个registerFunction,主机发啥function code,从机就必须回什么function code;
00 00-代表修改的Starting register address.说明是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号register value为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个byte开始到48前面为止;

常用function code详解

常用function code表格

function code名称data type作用
0x01读线圈register取得一组逻辑线圈的当前状态(ON/OFF)
0x02读离散输入register取得一组switch输入的当前状态(ON/OFF)
0x03读保持register整型、浮点型、字符型在一个或多个保持register中取得当前的binary值
0x04读输入register整型、浮点型在一个或多个输入register中取得当前的binary值
0x05写单个线圈register强置一个逻辑线圈的通断状态
0x06写单个保持register整型、浮点型、字符型把具体binary值装入一个保持register
0x0F写多个线圈register强置一串连续逻辑线圈的通断
0x10写多个保持register整型、浮点型、字符型把具体的binary值装入一串连续的保持register

01H-读Coil status

1)描述:读从机线圈register,位Operation,可读单个或者多个;
2)send指令:
假设从机address位0x01,register开始address0x0023,registerEnd抵制0x0038,总共读取21个线圈。协议图如下:

Modbus RTUdatamessage结构详解插图4

3)Response:
返回data的每一位对应Coil status,1-ON,0-OFF,如下图;

Modbus RTUdatamessage结构详解插图5

上表中data1表示0x0023-0x002a的Coil status,data1的最低位代表最低address的Coil status,可以理解为小端模式;

data2表示address0x002b-0x0033的Coil status,如下表:

Modbus RTUdatamessage结构详解插图6

data3表示address0x0034-0x0038的Coil status,不够8位,byte高位填充为0,如下表:

Modbus RTUdatamessage结构详解插图7

02H-读离散input state

1):读离散输入register,位Operation,可读单个或多个,协议类似function code0X01协议,此处省;

03H-读保持register

1)描述:读保持register,byte指令Operation,可读单个或者多个;
2)send指令:
从机address0x01,保持registerstarting address0x0032,读2个保持register

Modbus RTUdatamessage结构详解插图8

3)Response:

Modbus RTUdatamessage结构详解插图9

data存储顺序

Modbus RTUdatamessage结构详解插图10

04H-读输入register

1)描述:读输入register,byte指令Operation,可读单个或者多个;
2)send指令:同03H;
3)Response:同03H;

05H-写单个线圈

1)描述:写单个线圈,位Operation,只能写一个,写0xff00表示设置Coil status为ON,写0x0000表示设置Coil status为OFF
2)send指令:
设置0x0032线圈为ON;

Modbus RTUdatamessage结构详解插图11

3)Response:
同send指令;

06H-写单个保持register

1)描述:写单个保持register,byte指令Operation,只能写一个;
2)send指令:
写0x0032保持register为0x1232;

Modbus RTUdatamessage结构详解插图12

3)Response:同send指令;

0F-写多个线圈

1)描述:写多个线圈register。若data area的某位值为“1”表示被Request的相应Coil status为ON,若某位值为“0”,则为状态为OFF。
2)send指令:
Coil address为0x04a5,写12个线圈,

Modbus RTUdatamessage结构详解插图13

上图中DATA1为0x0c,表示:

Modbus RTUdatamessage结构详解插图14

DATA2为0x02,不够8位,byte高位填充0:

Modbus RTUdatamessage结构详解插图15

3)Response:

Modbus RTUdatamessage结构详解插图16

10H-写多个保持register

1)描述:写多个保持register,byte指令Operation,可写多个;
2)send指令:
保持registerstarting address为0x0034,写2个register4个byte的data;

Modbus RTUdatamessage结构详解插图17

3)Response:

Modbus RTUdatamessage结构详解插图18
技术术语(共 11 个)—— 点击展开
Modbus RTU基于串行链路的Modbus协议,使用binaryCoding和CRC check
RS485工业常用的差分串行通信标准,支持多点通信
RS232点对点串行通信标准,常用于短距离设备通信
function codeModbusfunction code指定读/写OperationType,如01读线圈、03读保持register
registerModbus register存储data单元,分线圈/离散输入/保持/输入register四类
PLC可编程逻辑控制器,Automation控制的核心设备
SCADAData Acquisition与监视控制system,用于远程监控工业过程
Baud rate串行通信每秒传输符号数,Modbus RTU常用9600/19200
传感器将物理量转换为电信号的检测装置
线圈Modbus位可读写data,address从00001开始
保持registerModbus 16位可读写data,address从40001开始
来源/Tools信息 —— 点击展开
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区 Category Modbus protocol标准 字数 3991 字 · 阅读约 10 分钟 更新 2026-06-30 永久链接 https://www.modbus.cn/27850.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus DebuggingTools,支持 Modbus RTU/TCP 实时通信debug、register读写、线圈控制、data监控和message分析。 无需安装,微信Search「Modbus DebuggingAssistant」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
把这篇Resources用于真实项目?

进入Tools中心进行messageParse、CRC verification和设备debug,或Submit requirements获取选型与接入建议。

工程师member

把这篇文章变成可执行的debugResources

开通后可使用高级messageParse、Resources包Download、Code Example、工程案例和优先Technical Support,适合真实项目交付。

高级Tools不限次
Resources包与代码包
Complete Engineering Case Library
优先Technical Support入口

发表回复

您的邮箱address不会被公开。 必填项已用 * 标注