第05章 Modbus协议
约 2063 字大约 7 分钟
2026-01-27
5.1 相关通信标准
① UART
- UART 是一种通信协议,用于实现设备之间的异步串行通信。
- UART 是逻辑层的通信协议,它定义了数据帧格式(起始位、数据位、校验位、停止位)和波特率等参数。
- UART本身不规定电气特性(如电压电平),需要配合其他标准(如 RS-232、RS-485)来实现物理传输。
② RS-232
定义:由 EIA 制定的一种点对点串行通信标准。
电气特性:电压范围通常为 ±15V(-3V ~ -15V 表示逻辑 1,+3V ~ +15V 表示逻辑 0),比 TTL 电平抗干扰能力强

通信方式:全双工(可同时收发)
最大距离:约 15 米
拓扑结构:点对点(1 发送方,1 接收方)
典型接口:DB9 或 DB25 接口
常见用途:早期 PC、工业设备、调制解调器等
与UART关系: UART 是逻辑协议,RS-232 是物理层标准,所以 UART 数据可以通过 RS-232 标准进行传输。
③ RS-485
定义:一种差分信号传输的串行通信标准,支持多点通信。
电气特性:差分信号(A/B 线),抗干扰能力强,适合长距离通信

通信方式:半双工或全双工(取决于硬件设计)
最大距离:可达 1200 米
拓扑结构:多点总线型(最多支持 32~256 个节点)
常见用途:工业自动化、楼宇控制、传感器网络等
典型接口:接线端子、RJ45、DB9
与UART关系: UART 是逻辑协议,RS-485 是物理层标准,所以 UART 数据可以通过 RS-232 标准进行传输。
5.2 协议概述
Modbus是一种工业级主从式串行通信协议,由Modicon公司(现施耐德电气)于1979年为可编程逻辑控制器PLC通信设计。作为工业自动化领域事实上的通信标准,其采用"请求-响应"机制,支持多种物理层接口和传输模式。已成为工业控制系统的行业标准之一。
① Modbus 和 UART
| UART | Modbus | |
|---|---|---|
| 协议层级 | 物理层/数据链路层(比特传输) | UART协议层之上、应用层(数据交互规则) |
| 数据定义 | 无语义,仅传输原始比特 | 定义寄存器地址、功能码等语义 |
② Modus 协议核心特性
开放性架构 协议规范完全公开(现由Modbus-IDA组织维护),采用BSD授权模式,任何厂商无需支付许可费用即可实现兼容设备,这是其成为工业通信领域TCP/IP的关键因素。
轻量化设计 协议头仅包含地址域(1B)+功能码(1B)+数据域(N B)+校验域(2B),这种极简帧结构带来三大优势
硬件实现成本低(8位MCU即可处理)
网络负载率低(RTU模式最小帧仅4字节)
开发调试门槛低
多物理层支持 通过分层设计实现介质无关性:
- 电气接口:支持RS-485(主流,最大节点数32)、RS-232
- 网络层:支持TCP/IP over Ethernet(Modbus TCP)
- 无线扩展:可通过网关转换支持LoRa、Zigbee等
主从通信模型
- 单主多从拓扑(典型应用)
- 从设备(Slave)地址范围1-247(0为广播地址)
- 典型响应时间<1ms
③ 标准化数据模型(四种寄存器类型)(重要)
在 Modbus 协议中,设备(从机)会维护几种预定义的寄存器区域,主机可以通过协议命令读取或写入这些寄存器。每种寄存器有其特定的功能:
| 寄存器类型 | 读写权限 | 起始逻辑地址 | 数据位宽 | 典型应用 |
|---|---|---|---|---|
| 线圈 (Coils) | 读写 | 0x0001 | 1位 | 控制继电器、指示灯 |
| 离散输入 (Discrete Inputs) | 只读 | 0x1001 | 1位 | 检测传感器开关状态 |
| 输入寄存器 (Input Registers) | 只读 | 0x3001 | 16位 | 读取模拟量传感器数据 |
| 保持寄存器 (Holding Registers) | 读写 | 0x4001 | 16位 | 配置设备参数、存储数据 |
④ 功能码(重要)

⑤ 三种具体实现
Modbus RTU(推荐方案)
基于串口(RS-485/RS-232)的二进制编码,高效紧凑,适用于工业现场。
帧格式:
[Address(1B)](设备地址) + [Function(1B)](功能码) + [Data(N B)](数据) + [CRC(2B)](CRC校验)`技术特点:
- 采用3.5字符静默时间作为帧间隔
- CRC-16校验多项式:0x8005
- 波特率自适应(1200-115200bps)
Modbus ASCII
使用 ASCII 字符编码传输数据,每个字节(8位)拆分为两个十六进制字符(0-9, A-F)。例如,字节 0x5B会被编码为字符 '5'和 'B'(ASCII 码 0x35和 0x42),传输效率较低(数据量加倍) ,可读性强,适合调试。
帧格式:
[Address(2ASC)] [Function(2ASC)] [Data] [LRC(2ASC)]典型应用场景:
- 调试阶段的人眼可读需求
- 存在字符转换设备的异构系统
- 波特率误差>2%的劣质线路
Modbus TCP
基于以太网,将RTU帧嵌入TCP/IP协议栈,支持远程通信
帧结构:
[MBAP Header(7B)] + [Function(1B)] + [Data]其中MBAP头包含:
- Transaction ID(2B):请求响应匹配标识
- Protocol ID(2B):固定0x0000
- Length(2B):后续字节数
- Unit ID(1B):兼容串行设备地址
默认使用TCP 502 端口,支持 Full-Duplex 通信
5.3 Modbus RTU 详细介绍
① 报文结构
Modbus RTU 通信基于主从架构,主站(Master)发送请求帧,从站(Slave)返回响应帧。
帧格式如下:

各部分介绍:
- 从站地址(设备地址、ModbusID)用于多个从设备识别。
- 功能码代表不同的命令。
- 数据表示写入的内容,不同的功能码写入的内容不同。
- CRC 校验用于收发消息确认是否有效。
② 各种操作的报文

③ 帧间间隔(Start Silence)
Start Silence (起始静默时间,也称为帧间间隔)是指前一帧的最后一个字节传输完成,到下一帧的第一个字节开始传输之间的最小空闲时间。
在 Modbus RTU 模式下,该静默时间必须 ≥ 3.5 个字符传输时间(即 3.5 × 单个字符的传输时间)。
如果静默时间 < 3.5 字符时间,接收设备可能会错误地将两帧合并解析,导致通信错误。
如何计算 3.5 字符时间?
静默时间取决于 波特率(Baud Rate) 和 数据格式(如 8N1,即 8 数据位、无校验、1 停止位):
1个字符时间 = (1 起始位 + 8 数据位 + 1 停止位) / 波特率
例如,115200bps时,1个字符时间 = 10bits / 115200bps ≈ 86.8μs
19200bps时,1个字符时间 = 10bits / 19200bps时 ≈ 520.8us
9600bps时,1个字符时间 = 10bits / 9600bps ≈ 1.04ms
3.5字符时间 = 3.5 × 1个字符时间
例如,115200bps时,3.5个字符时间 ≈ 303.82us
19200bps时, 3.5个字符时间 ≈ 1.8ms
9600bps时, 3.5个字符时间 ≈ 3.65ms为什么需要 Start Silence?
- 帧分隔:Modbus RTU 是无起始符/结束符的二进制协议,依赖静默时间来区分帧。
- 防止粘帧:如果主设备连续发送请求,而静默时间不足,从设备可能无法正确解析帧边界,导致 CRC 校验失败或数据错位。
- 兼容性:所有 Modbus RTU 设备必须遵守该规则,否则可能无法正常通信。
实际应用注意事项
- 主设备(Master)在发送新帧前,必须等待 ≥ 3.5 字符静默时间。
- 从设备(Slave)在响应时,通常会在收到完整帧后立即回复(无需额外静默时间)。
- 字符时间和串口的波特率有关,常见的波特率有9600,19200和115200,如果使用低速波特率(小于19200),要严格按照3.5个字符时间,如果使用高速波特率,可以直接使用35个50us(1.75ms)作为标准时间。
④ 错误检测和超时
Modbus RTU使用 CRC(循环冗余校验)进行错误检测。如果接收方检测到CRC不匹配,则该消息会被丢弃,等待下一个有效消息。
