Modbus协议工作原理,从通信架构到帧结构全解析

1 阅读13分钟

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 RTUModbus ASCIIModbus 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的核心校验手段,计算步骤如下:

  1. 初始化CRC寄存器为0xFFFF
  2. 遍历帧的前N+2字节(地址+功能码+数据域),每个字节与CRC寄存器进行异或运算;
  3. 对CRC寄存器循环右移1位,若最低位为1,则与多项式0xA001异或;
  4. 遍历完成后,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高字节
字节值0x010x030x000x010x000x020x850x39
  • 起始地址: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),判定一帧接收完成;
  • 从机执行三层校验:
    1. 地址校验:帧首字节为0x01,与本机地址一致,继续处理;
    2. CRC校验:计算接收帧前6字节的CRC值,与帧尾的0x85 0x39对比,一致则校验通过;
    3. 功能码校验:功能码0x03是本机支持的功能,继续处理。

步骤4:从机执行指令(读取寄存器数据)

  • 从机解析请求帧的参数:起始地址0x0001,寄存器数量0x0002
  • 从机从保持寄存器数组中读取地址1和2的值,假设为:温度0x012C(十进制300,对应30.0℃)、湿度0x0064(十进制100,对应10.0%RH)。

步骤5:从机构建并发送响应帧

响应帧格式:从机地址+功能码+数据长度+寄存器数据+CRC校验,具体字节如下:

字段从机地址功能码数据长度寄存器1高位寄存器1低位寄存器2高位寄存器2低位CRC低字节CRC高字节
字节值0x010x030x040x010x2C0x000x640x700x48
  • 数据长度:0x04(2个寄存器,每个2字节,共4字节数据);
  • 寄存器数据:0x012C(温度)、0x0064(湿度),按大端序存储;
  • CRC校验:基于前8字节计算得到,低字节0x70在前,高字节0x48在后。

从机同样需先切换RS485为发送状态,发送响应帧后切换回接收状态。

步骤6:主机接收并解析响应帧

  • 主机接收从机的响应帧,执行CRC校验;
  • 主机解析数据域:
    1. 数据长度为0x04,对应2个寄存器;
    2. 寄存器1的值:0x012C → 十进制300 → 转换为实际温度30.0℃;
    3. 寄存器2的值:0x0064 → 十进制100 → 转换为实际湿度10.0%RH;
  • 完成一次通信闭环,主机可根据需求发起下一次请求。

3. 异常场景处理

若从机接收的请求帧有误(如地址不匹配、功能码不支持、寄存器地址越界),则不会返回正常响应帧,而是返回异常响应帧,示例如下(功能码0x03,非法寄存器地址):

字段从机地址异常功能码异常码CRC低字节CRC高字节
字节值0x010x830x020x440x0A
  • 异常功能码:0x83 = 0x03 + 0x80
  • 异常码:0x02 → 表示“非法数据地址”(寄存器地址超出从机有效范围)。

五、Modbus协议的核心优势与局限性

1. 核心优势

  • 开源免费:无专利费,任何人都可实现协议栈,嵌入式开发中可直接编写代码实现,无需第三方库。
  • 硬件门槛低:支持串口和以太网,嵌入式设备只需串口+RS485模块即可接入,成本极低。
  • 兼容性强:几乎所有工业设备都支持Modbus协议,不同厂家的设备可无缝通信。
  • 易于调试:有成熟的上位机工具(如Modbus Poll、Modbus Slave),可快速验证通信是否正常。

2. 局限性

  • 主从架构限制:无法实现从机之间的直接通信,所有通信都需通过主机中转。
  • 总线带宽有限:RS485总线的波特率最高支持115200bps,且从机数量最多247台,不适合大规模组网。
  • 安全性低:协议本身无加密机制,数据以明文传输,工业现场需通过物理隔离或加密网关保障数据安全。