Modbus是一种主从式串行通信协议,由施耐德公司于1979年推出,专门为工业现场设备通信设计。它的核心特点是简单、开源、兼容性强,无需复杂的硬件支持,仅通过串口(RS232/RS485)或以太网即可实现设备间的数据交互,广泛应用于PLC、传感器、变频器、嵌入式单片机等工业设备。
本文从通信架构、传输模式、帧结构、核心流程四个维度,彻底讲透Modbus协议的工作原理,覆盖嵌入式开发和工业通信的核心知识点。
一、Modbus协议的核心通信架构:主从模式
Modbus协议的通信逻辑基于主-从(Master-Slave)架构,这是它与其他对等通信协议(如TCP/IP)的核心区别,也是工业现场“集中管控”需求的直接体现。
1. 主从设备的角色定义
| 设备角色 | 核心权限 | 数量限制 | 典型设备 |
|---|---|---|---|
| 主机(Master) | 1. 主动发起通信请求(读/写指令) 2. 控制通信时序,决定何时与哪个从机通信 3. 接收并解析从机的响应数据 | 同一通信总线只能有1台主机 | 工控机、PLC(主站)、嵌入式网关、上位机软件 |
| 从机(Slave) | 1. 被动接收主机的指令,无法主动发起通信 2. 根据指令执行相应操作(如返回传感器数据、修改寄存器值) 3. 向主机返回响应帧(含执行结果或数据) | 同一总线可支持最多247台从机(地址范围1-247) | 传感器、变频器、执行器、嵌入式单片机(从站) |
2. 主从通信的核心规则
- 总线控制权唯一:任何时刻,只有主机能发起通信,从机只能等待指令,避免多设备同时发送数据导致总线冲突。
- 从机地址标识:每台从机都有唯一的地址(1-247),主机通过地址指定通信目标;地址
0为广播地址,主机发送的广播指令所有从机都会执行,但从机无需返回响应。 - 请求-响应闭环:主机发送一条指令 → 对应从机接收并处理 → 从机返回响应 → 主机解析响应,完成一次通信闭环;若从机未收到指令或指令错误,不会返回响应,主机触发超时机制。
3. 通信拓扑结构
Modbus协议支持两种主流拓扑,适配不同的传输介质:
- RS485总线拓扑(Modbus RTU/ASCII):采用手拉手链式结构,所有设备的A/B引脚依次串联,主机位于总线一端,从机分布在总线上;总线两端需接120Ω终端电阻,减少信号反射。
- 以太网星型拓扑(Modbus TCP):基于TCP/IP网络,所有设备连接到交换机,主机通过IP地址访问从机,突破RS485的247台从机限制,支持远程通信。
二、Modbus协议的三大传输模式:RTU/ASCII/TCP
Modbus协议根据传输介质和数据格式,分为三种主流传输模式,其中Modbus RTU是嵌入式设备的首选。
1. 三种传输模式核心对比
| 特性 | Modbus RTU | Modbus ASCII | Modbus TCP |
|---|---|---|---|
| 传输介质 | RS232/RS485串口 | RS232/RS485串口 | 以太网(TCP/IP) |
| 数据格式 | 二进制(8位字节) | ASCII字符(每个字节用2个ASCII码表示) | 基于TCP报文,二进制格式 |
| 帧分隔方式 | 帧间隔(>3.5个字符时间) | 帧头:(0x3A)+ 帧尾\r\n(0x0D0A) | 基于TCP连接的报文长度字段 |
| 校验方式 | CRC16校验(2字节) | LRC校验(1字节) | 依赖TCP/IP的校验机制,无需额外校验 |
| 传输效率 | 高(二进制紧凑,无冗余) | 低(数据量翻倍,仅用于调试) | 最高(以太网带宽大,支持高速传输) |
| 抗干扰能力 | 强(二进制传输,校验严格) | 弱(ASCII码易受干扰) | 强(TCP/IP重传机制) |
| 嵌入式适配性 | 高(串口通信,资源占用低) | 低(仅用于调试) | 中(需以太网接口,适合网关设备) |
2. 嵌入式场景首选:Modbus RTU
在嵌入式开发中,Modbus RTU是应用最广的模式,原因如下:
- 硬件门槛低:几乎所有嵌入式单片机(如STM32、ESP32)都标配串口,搭配RS485模块即可实现通信,无需额外硬件。
- 传输效率高:二进制数据格式,无冗余字符,在低波特率下(如9600bps)也能快速传输数据。
- 工业兼容性强:绝大多数工业传感器、执行器都支持Modbus RTU协议,无需协议转换。
三、Modbus协议的核心:帧结构解析
Modbus协议的通信本质是帧的传输与解析——主机发送请求帧,从机返回响应帧,帧的格式决定了数据如何被识别和处理。
1. 通用帧结构(主从通信的“语言格式”)
无论哪种传输模式,Modbus帧都包含地址段、功能段、数据段、校验段四个核心部分,不同模式的差异仅在于字段的编码和分隔方式。
(1)Modbus RTU帧结构(嵌入式重点)
Modbus RTU帧是二进制紧凑格式,无帧头帧尾,靠3.5个字符时间的间隔区分不同帧,完整结构如下(字节序为大端序):
| 字段 | 字节数 | 功能说明 | 取值范围/示例 |
|---|---|---|---|
| 从机地址(Slave Address) | 1 | 标识目标从机,主机通过此字段指定通信对象 | 1-247(有效地址);0(广播地址) |
| 功能码(Function Code) | 1 | 指示从机执行的操作类型(读/写寄存器、读线圈等) | 0x01(读线圈);0x03(读保持寄存器);0x06(写单个寄存器) |
| 数据域(Data) | N(可变) | 包含指令参数或响应数据: - 请求帧:寄存器起始地址、寄存器数量、写入的数据等 - 响应帧:返回的数据长度、寄存器数据等 | 请求帧示例(0x03指令):0x00 0x01 0x00 0x02 → 读起始地址0x0001,共2个寄存器 |
| CRC校验(CRC) | 2 | 用于校验帧的完整性,检测传输过程中的数据错误 | 计算方式:基于前N+2字节的CRC16算法,低字节在前,高字节在后;示例:0x85 0x39 |
关键细节:CRC16校验计算逻辑
CRC16是Modbus RTU的核心校验手段,计算步骤如下:
- 初始化CRC寄存器为
0xFFFF; - 遍历帧的前N+2字节(地址+功能码+数据域),每个字节与CRC寄存器进行异或运算;
- 对CRC寄存器循环右移1位,若最低位为1,则与多项式
0xA001异或; - 遍历完成后,CRC寄存器的值即为校验码,低字节在前存入帧尾。
(2)请求帧与响应帧的对应关系
主机发送的请求帧和从机返回的响应帧一一对应,功能码是两者的关联核心:
- 正常响应:从机返回的功能码与主机请求的功能码完全一致;数据域为请求的目标数据。
- 异常响应:从机返回的功能码为原功能码+0x80(如请求0x03,异常时返回0x83);数据域为异常码(指示错误类型,如非法功能码、非法寄存器地址)。
2. Modbus协议的核心数据模型:四大寄存器
Modbus协议定义了四大类寄存器,用于存储不同类型的数据,主机通过功能码操作这些寄存器,这是协议与设备交互的核心接口。
| 寄存器类型 | 功能描述 | 数据类型 | 读写属性 | 常用功能码 |
|---|---|---|---|---|
| 线圈寄存器(Coils) | 存储开关量数据(如继电器状态、指示灯开关) | 1位(0/1) | 可读可写 | 0x01(读)、0x05(写单个)、0x0F(写多个) |
| 离散输入寄存器(Discrete Inputs) | 存储外部输入的开关量数据(如按钮状态、传感器触发信号) | 1位(0/1) | 只读(数据由外部设备输入) | 0x02(读) |
| 保持寄存器(Holding Registers) | 存储模拟量数据(如温度、压力、转速) | 16位(2字节) | 可读可写 | 0x03(读)、0x06(写单个)、0x10(写多个) |
| 输入寄存器(Input Registers) | 存储外部传感器的模拟量数据(如ADC采集值) | 16位(2字节) | 只读(数据由传感器输入) | 0x04(读) |
关键注意:寄存器地址是1-based(从1开始),而嵌入式代码中数组是0-based,开发时需注意地址偏移。
四、Modbus协议的通信流程:以RTU模式为例
以主机读取从机保持寄存器(功能码0x03)为例,完整拆解Modbus RTU的通信流程,这是嵌入式开发中最常用的场景。
1. 场景定义
- 主机:工控机(地址无,仅发送指令);
- 从机:STM32嵌入式设备(地址
0x01); - 需求:主机读取从机保持寄存器地址0x0001和0x0002的值(存储的是温度和湿度数据);
- 串口参数:波特率9600bps,数据位8,停止位1,无校验(Modbus RTU默认配置)。
2. 完整通信流程(6步闭环)
步骤1:主机构建请求帧
根据功能码0x03的要求,请求帧需包含:从机地址+功能码+起始地址+寄存器数量+CRC校验,具体字节如下:
| 字段 | 从机地址 | 功能码 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC低字节 | CRC高字节 |
|---|---|---|---|---|---|---|---|---|
| 字节值 | 0x01 | 0x03 | 0x00 | 0x01 | 0x00 | 0x02 | 0x85 | 0x39 |
- 起始地址:
0x0001(对应寄存器1); - 寄存器数量:
0x0002(读取2个寄存器); - CRC校验:基于前6字节计算得到
0x3985,存储时低字节0x85在前,高字节0x39在后。
步骤2:主机发送请求帧(控制RS485收发状态)
- 主机将RS485模块的DE/RE引脚置高(切换为发送状态);
- 主机通过串口将请求帧的8个字节发送到RS485总线;
- 发送完成后,延迟2ms(确保数据完全发送),将DE/RE引脚置低(切换为接收状态),等待从机响应。
步骤3:从机接收并校验请求帧
- 从机(STM32)通过串口中断接收总线数据,逐字节存入接收缓冲区;
- 从机检测帧间隔:若两次接收字节的时间差超过3.5个字符时间(9600bps下约4ms),判定一帧接收完成;
- 从机执行三层校验:
- 地址校验:帧首字节为
0x01,与本机地址一致,继续处理; - CRC校验:计算接收帧前6字节的CRC值,与帧尾的
0x85 0x39对比,一致则校验通过; - 功能码校验:功能码
0x03是本机支持的功能,继续处理。
- 地址校验:帧首字节为
步骤4:从机执行指令(读取寄存器数据)
- 从机解析请求帧的参数:起始地址
0x0001,寄存器数量0x0002; - 从机从保持寄存器数组中读取地址1和2的值,假设为:温度
0x012C(十进制300,对应30.0℃)、湿度0x0064(十进制100,对应10.0%RH)。
步骤5:从机构建并发送响应帧
响应帧格式:从机地址+功能码+数据长度+寄存器数据+CRC校验,具体字节如下:
| 字段 | 从机地址 | 功能码 | 数据长度 | 寄存器1高位 | 寄存器1低位 | 寄存器2高位 | 寄存器2低位 | CRC低字节 | CRC高字节 |
|---|---|---|---|---|---|---|---|---|---|
| 字节值 | 0x01 | 0x03 | 0x04 | 0x01 | 0x2C | 0x00 | 0x64 | 0x70 | 0x48 |
- 数据长度:
0x04(2个寄存器,每个2字节,共4字节数据); - 寄存器数据:
0x012C(温度)、0x0064(湿度),按大端序存储; - CRC校验:基于前8字节计算得到,低字节
0x70在前,高字节0x48在后。
从机同样需先切换RS485为发送状态,发送响应帧后切换回接收状态。
步骤6:主机接收并解析响应帧
- 主机接收从机的响应帧,执行CRC校验;
- 主机解析数据域:
- 数据长度为
0x04,对应2个寄存器; - 寄存器1的值:
0x012C→ 十进制300 → 转换为实际温度30.0℃; - 寄存器2的值:
0x0064→ 十进制100 → 转换为实际湿度10.0%RH;
- 数据长度为
- 完成一次通信闭环,主机可根据需求发起下一次请求。
3. 异常场景处理
若从机接收的请求帧有误(如地址不匹配、功能码不支持、寄存器地址越界),则不会返回正常响应帧,而是返回异常响应帧,示例如下(功能码0x03,非法寄存器地址):
| 字段 | 从机地址 | 异常功能码 | 异常码 | CRC低字节 | CRC高字节 |
|---|---|---|---|---|---|
| 字节值 | 0x01 | 0x83 | 0x02 | 0x44 | 0x0A |
- 异常功能码:
0x83=0x03 + 0x80; - 异常码:
0x02→ 表示“非法数据地址”(寄存器地址超出从机有效范围)。
五、Modbus协议的核心优势与局限性
1. 核心优势
- 开源免费:无专利费,任何人都可实现协议栈,嵌入式开发中可直接编写代码实现,无需第三方库。
- 硬件门槛低:支持串口和以太网,嵌入式设备只需串口+RS485模块即可接入,成本极低。
- 兼容性强:几乎所有工业设备都支持Modbus协议,不同厂家的设备可无缝通信。
- 易于调试:有成熟的上位机工具(如Modbus Poll、Modbus Slave),可快速验证通信是否正常。
2. 局限性
- 主从架构限制:无法实现从机之间的直接通信,所有通信都需通过主机中转。
- 总线带宽有限:RS485总线的波特率最高支持115200bps,且从机数量最多247台,不适合大规模组网。
- 安全性低:协议本身无加密机制,数据以明文传输,工业现场需通过物理隔离或加密网关保障数据安全。