【Modbus】Modbus协议基础知识详解
目录
引言
一、Modbus协议介绍
1.1 简介
1.2 特点
1.3 Modbus协议栈结构
1.4 与其他工业协议比较
二、Modbus数据模型与功能码
2.1 数据模型
2.2 常用功能码
2.3 异常码
三、Modbus通信帧结构
3.1 通信机制
3.2 Modbus RTU帧结构
3.2.1 RTU帧结构
3.2.2 RTU帧时序
3.2.3 RTU帧示例
3.3 Modbus TCP帧结构
3.2.1 TCP帧结构
3.2.2 TCP连接管理:
3.2.3 TCP帧示例
四、高级Modbus功能扩展
4.1 Modbus子协议
4.2 Modbus扩展
五、常见问题
5.1 性能优化
5.2 错误处理与恢复
5.3 安全实践
六、Modbus的应用场景
6.1 OPC UA与Modbus的融合
6.2 边缘计算中的Modbus
附录
Modbus功能码对照表
Modbus异常码对照表
参考
引言
在工业4.0和物联网时代,各种新型通信协议层出不穷,但Modbus协议依然占据着工业自动化领域的核心地位。根据HMS Networks的2023年工业网络市场报告,Modbus在工业通信协议中仍保持着近20%的市场份额。这一诞生于1979年的协议为何具有如此强大的生命力?
一、Modbus协议介绍
1.1 简介
Modbus 是一种开放、简单、广泛应用的工业通信协议,最初由 Modicon(现为施耐德电气)于 1979 年为可编程逻辑控制器(PLC)设计。如今,它已成为工业自动化领域最常用的通信标准之一,广泛应用于 PLC、传感器、仪表、HMI、DCS 等设备之间的数据交换。
1.2 特点
开放性 | 免费、公开,无版权保护,厂商可自由实现。 |
简单性 | 协议结构清晰,易于理解和实现。 |
主从架构 | 采用“主-从”(Master-Slave)通信模式,主站发起请求,从站响应。 |
数据模型 | 基于寄存器的读写操作,数据以离散量或模拟量形式组织。 |
跨平台 | 可运行在串行链路(如 RS-232/RS-485)或以太网(TCP/IP)上。 |
1.3 Modbus协议栈结构
Modbus协议采用分层架构,但在不同物理介质上实现方式各异:
Modbus RTU/ASCII协议栈:
- 应用层:Modbus PDU(协议数据单元)
- 数据链路层:Modbus帧结构
- 物理层:RS-485/RS-232
Modbus TCP/IP协议栈:
- 应用层:Modbus PDU
- 传输层:TCP
- 网络层:IP
- 数据链路层:以太网
- 物理层:双绞线/光纤Modbus的未来发展
1.4 与其他工业协议比较
协议 | 优势 | 劣势 | 适用场景 |
---|---|---|---|
Modbus | 简单、通用、低成本 | 速度慢、安全性弱 | 中小型控制系统 |
PROFINET | 高速、实时性好 | 复杂、成本高 | 大型自动化系统 |
EtherCAT | 极高速度、低延迟 | 专用硬件要求 | 运动控制 |
OPC UA | 跨平台、信息模型丰富 | 资源消耗大 | IT-OT融合 |
二、Modbus数据模型与功能码
2.1 数据模型
Modbus采用统一地址空间,但不同数据类型有独立的地址范围:
数据类型 | 数据类型 | 地址范围 | 主站访问权限 | 物理含义 |
---|---|---|---|---|
线圈 | 1 bit | 00001-09999 | 读写 | 数字量输出(DO) |
离散输入 | 1 bit | 10001-19999 | 只读 | 数字量输入(DI) |
输入寄存器 | 16 bits | 30001-39999 | 只读 | 模拟量输入(AI) |
保持寄存器 | 16 bits | 40001-49999 | 读写 | 模拟量输出(AO) |
注意:实际设备中常采用基于0的地址编址,如保持寄存器40001对应地址0。
2.2 常用功能码
Modbus协议同时规定了很多种功能码,但常用的往往是用于对存储区读写的功能码,如下表:
功能码 | 功能说明 |
01H | 读取输出线圈 |
02H | 读取输入线圈 |
03H | 读取保持寄存器 |
04H | 读取输入寄存器 |
05H | 写入单线圈 |
06H | 写入单寄存器 |
0FH | 写入多线圈 |
10H | 写入多寄存器 |
2.3 异常码
当从设备检测到错误时,返回异常响应:
异常响应:[功能码 + 0x80][异常代码]
常见异常代码:
异常码 | 异常说明 |
---|---|
01 | 非法功能码 |
02 | 非法数据地址 |
03 | 非法数据值 |
04 | 从设备故障 |
05 | 确认(需要长时间操作) |
06 | 从设备忙 |
三、Modbus通信帧结构
3.1 通信机制
Modbus采用严格的"一问一答"式主从通信模式,其通信流程如下:
主设备请求 → [网络传输] → 从设备接收 → 从设备处理 → 从设备响应 → [网络传输] → 主设备接收
超时管理机制:
- 响应超时(Response Timeout):主设备等待从设备响应的最长时间
- 帧间超时(Inter-frame Delay):RTU模式下字符间最大允许间隔
- 轮询间隔(Polling Interval):主设备连续请求间的最小时间间隔
3.2 Modbus RTU帧结构
3.2.1 RTU帧结构
[地址][功能码][数据][CRC16校验]
字段 | 长度 | 说明 |
---|---|---|
从设备地址 | 1 字节 | 0x00 ~ 0xFF,其中 0x00 是广播地址,0x01 ~ 0xFF 是设备地址。 |
功能码 | 1 字节 | 指定操作类型,如读寄存器、写寄存器等。 |
数据域 | N 字节 | 包含请求或响应的具体数据,长度可变。 |
CRC16校验 | 2 字节 | 低字节在前,高字节在后,用于错误检测。 |
3.2.2 RTU帧时序
- 3.5字符时间静默:帧开始和结束的标志
- 1.5字符时间间隔:帧内字符间最大间隔
3.2.3 RTU帧示例
示例 1:主站读取从站保持寄存器(功能码 0x03)
主站读取从站地址为 0x01
的设备,从寄存器地址 40001
开始,读取 2 个寄存器。
- 寄存器地址 40001 对应的内部地址是
0x0000
(因为 40001 是起始地址,偏移为 0) - 要读取 2 个寄存器
请求帧(主站 → 从站):
01 03 00 00 00 02 C4 39
数据解释:
值 说明 01
从设备地址 03
功能码 00
起始地址高字节 00
起始地址低字节 00
寄存器数量高字节 02
寄存器数量低字节 C4 39
CRC 校验
响应帧(从站 → 主站):假设读取到的值为 0x1234
和 0x5678
01 03 04 12 34 56 78 B9 38
数据解释:
值 说明 01
从设备地址 03
功能码 04
字节数 12
数据 1 高字节 34
数据 1 低字节 56
数据 2 高字节 78
数据 2 低字节 B9 38
CRC 校验
示例 2:主站写单个保持寄存器(功能码 0x06)
场景:主站向从站地址 0x02
的设备,写入寄存器 40002
(内部地址 0x0001
),值为 0xABCD
请求帧:
02 06 00 01 AB CD 79 76
值 | 说明 |
---|---|
02 | 从设备地址 |
06 | 功能码 |
00 | 地址高字节 |
01 | 地址低字节 |
AB | 值高字节 |
CD | 值低字节 |
79 76 | CRC 校验 |
响应帧(写操作成功,回显原请求):
02 06 00 01 AB CD 79 76
写单个寄存器时,从站通常回显相同的帧作为确认。
3.3 Modbus TCP帧结构
3.2.1 TCP帧结构
ModbusTCP的数据帧可分为两部分: MBAP头结构 + PDU
MBAP头结构
MBAP为报文头,长度为7字节,组成如下:
名称 | 字节长度 | 释义 |
---|---|---|
事务标识符 | 2 | 用于请求-响应匹配区别报文 |
协议标识符 | 2 | 00 00表示Modbus协议 |
长度 | 2 | 表示后续的数据长度,单位为字节(包括单元标识符) |
单元标识符 | 1 | 从站设备地址 |
PDU结构
名称 | 字节长度 | 释义 |
---|---|---|
功能码 | 1 字节 | 指定操作类型,如读寄存器、写寄存器等。 |
数据 | N 字节 | 包含请求或响应的具体数据,长度可变 |
3.2.2 TCP连接管理:
- 默认端口:502
- 保持连接:支持长连接和短连接两种模式
- 最大PDU长度:通常为253字节(RS485限制)或更多
3.2.3 TCP帧示例
主站读取从站保持寄存器(功能码 0x03)(沿用上面 RTU 的读寄存器例子)
请求帧(TCP):
00 01 00 00 00 06 01 03 00 00 00 02
字段 | 值 | 说明 |
---|---|---|
事务 ID | 00 01 | 任意,如 1 |
协议 ID | 00 00 | Modbus 协议 |
长度 | 00 06 | 后续 6 字节 |
从站地址 | 01 | 从站 1 |
功能码 | 03 | 读保持寄存器 |
起始地址 | 00 00 | 0x0000 |
寄存器数量 | 00 02 | 2 个 |
响应帧(TCP):
00 01 00 00 00 07 01 03 04 12 34 56 78
字段 | 值 | 说明 |
---|---|---|
事务 ID | 00 01 | 与请求一致 |
协议 ID | 00 00 | |
长度 | 00 07 | 后续 7 字节 |
从站地址 | 01 | |
功能码 | 03 | |
字节数 | 04 | 数据长度 |
数据 | 12 34 56 78 | 两个寄存器值 |
四、高级Modbus功能扩展
4.1 Modbus子协议
文件记录访问(功能码0x14)
允许访问设备中的文件记录,适用于复杂数据结构传输。
屏蔽写寄存器(功能码0x16)
实现对寄存器中特定位的原子读写操作,避免竞态条件。
读写多个寄存器(功能码0x17)
组合读写操作,减少通信回合次数。
4.2 Modbus扩展
Modbus Plus (MB+)
- 令牌传递网络协议
- 1Mbps传输速率
- 支持对等通信
Modbus Secure
- 添加TLS/SSL加密层
- 防止窃听和篡改
- 保持协议兼容性
Modbus over UDP
- 适用于高速、低延迟网络
- 支持广播和多播
- 牺牲可靠性换取速度
五、常见问题
5.1 性能优化
批量读取优化
自适应轮询机制:根据数据变化频率动态调整轮询间隔,平衡实时性和带宽利用率。
5.2 错误处理与恢复
通信故障处理策略:
- 指数退避重试机制
- 从设备状态缓存
- graceful降级处理
数据一致性保障:
- 原子操作使用(功能码0x16)
- 事务日志记录
- 写操作确认机制
5.3 安全实践
网络层防护:
- 物理网络分割
- 防火墙ACL规则
- VPN隧道加密
协议层增强:
- Modbus Secure/TLS
- 客户端认证
- 功能码白名单
六、Modbus的应用场景
6.1 OPC UA与Modbus的融合
现代工业系统中,Modbus常作为现场层协议,通过OPC UA网关向上集成:
现场设备 → Modbus RTU/TCP → OPC UA网关 → OPC UA服务器 → 云平台/SCADA
6.2 边缘计算中的Modbus
边缘设备充当Modbus主站,实现本地数据处理和决策:
- 数据预处理和过滤
- 本地闭环控制
- 协议转换和标准化
附录
Modbus功能码对照表
功能码 (16进制) | 功能说明 | 功能码 (16进制) | 功能说明 |
---|---|---|---|
1 | 读取输出线圈状态 | 12 | 主机模拟编程 |
2 | 读取输入开关状态 | 13 | 重置通信链路 |
3 | 读取保持寄存器 | 14 | 读取文件记录 |
4 | 读取输入寄存器 | 15 | 写入文件记录 |
5 | 写入单线圈 | 16 | 掩码写寄存器(AND/OR 位操作) |
6 | 写入单寄存器 | 17 | 读写多个寄存器 |
7 | 读取异常状态 | 18 | 读FIFO队列(特殊设备) |
8 | 诊断,子功能码决定具体操作 | 19 – 28 | 保留(曾用于编程/文件操作) |
09,0A | 保留(曾用于编程/控循功能) | 29,2A | 保留 |
0B | 获取事件计数 (仅串行) | 2B | 通过 MEI 读取厂商、型号、序列号等 |
0C | 获取事件日志(仅串行) | 2C – 40 | 保留(部分用于 MEI) |
0D,0E | 保留(曾用于编程/探寻) | 41 – 48 | 原用户保留,现部分厂商使用(如读扩展寄存器) |
0F | 写入多线圈 | 49 – 63 | 未分配(保留) |
10 | 写入多寄存器 | 64 – 6E | 常见用户自定义区(必须查设备手册) |
11 | 报告从站标识(Slave ID) | 6F – 7F | 保留(128–255 用于异常码) |
Modbus异常码对照表
异常码 (十六进制) | 异常码 (十进制) | 含义 |
---|---|---|
0x01 | 1 | 非法功能(不支持该功能码) |
0x02 | 2 | 非法数据地址(寄存器/线圈地址不存在) |
0x03 | 3 | 非法数据值(写入值超出范围) |
0x04 | 4 | 从站设备故障 |
0x05 | 5 | 确认(仅用于编程命令) |
0x06 | 6 | 从站设备忙 |
0x08 | 8 | 存储奇偶校验错误 |
0x0A | 10 | 网关路径不可用 |
0x0B | 11 | 网关目标设备未响应 |
参考
- IEC 61158: Industrial communication networks - Fieldbus specifications
- 《Modbus协议权威指南》,工业自动化出版社,2022
- Modbus官方文档:https://modbus.org
- 在线Modbus测试工具:Modbus Simulator