1. Modbus协议概述
Modbus协议诞生于1979年,由Modicon(现施耐德电气旗下)为可编程逻辑控制器(PLC)通信而设计。经过四十余年发展,它已成为工业自动化领域应用最广泛的应用层通信协议,是连接传感器、执行器、控制器与上位机的“工业通用语言”。
1.1 发展历史与里程碑
| 时间 | 事件 | 意义 |
|---|---|---|
| 1979年 | Modicon发布Modbus串行协议 | 首个公开、免授权的工业现场总线协议 |
| 1990年代 | Modbus RTU/ASCII标准化 | 统一串行通信帧格式,降低设备互联门槛 |
| 2000年 | Modbus TCP规范发布 | 基于TCP/IP栈,将Modbus引入以太网时代 |
| 2004年 | Modbus组织成立 | 协议维护、认证与推广进入规范化阶段 |
| 至今 | IEC 61158标准采纳 | 成为国际公认的工业通信标准之一 |
关键认知:Modbus的持久生命力源于其开放、简单、鲁棒三大特性。无需授权费,帧结构紧凑,且能在恶劣工业环境中稳定运行。
1.2 OSI模型定位
Modbus在OSI七层模型中仅覆盖第7层(应用层),依赖下层传输介质完成数据收发。不同物理层实现对应不同变体:
- Modbus RTU/ASCII:物理层为RS-232/RS-485,数据链路层采用主从轮询机制,应用层承载Modbus报文。
- Modbus TCP:物理层为以太网,传输层使用TCP(端口502),网络层为IP,应用层将Modbus PDU封装于TCP报文段中。
1.3 主从架构原理
Modbus采用严格的主从(Master/Slave)通信模型:
- 主站(Master):唯一主动发起通信的节点。发送请求帧,等待从站响应。通常为PLC、DCS、上位机或网关。
- 从站(Slave):被动响应节点。不主动发送数据,仅当收到主站请求且地址匹配时,才返回响应帧。典型设备包括传感器、变送器、执行器、智能仪表。
实战要点:同一总线上最多支持247个从站(地址1~247),地址0为广播地址。从站响应超时通常设置为100~1000ms,具体取决于波特率和总线负载。
1.4 协议栈层次结构
Modbus协议栈从底层到顶层分为三个核心层次:
| 层次 | 名称 | 功能说明 | 典型内容 |
|---|---|---|---|
| L1 | 物理层 | 定义电气接口、传输介质、信号电平 | RS-485差分信号、以太网RJ45 |
| L2 | 数据链路层 | 帧封装、地址识别、差错校验 | RTU帧(CRC-16)、TCP MBAP头 |
| L3 | 应用层 | 功能码定义、数据模型映射、PDU构造 | 功能码03读保持寄存器、数据地址映射 |
1.5 四种数据模型
Modbus应用层定义了四种基本数据对象,所有读写操作均基于这些模型:
| 对象类型 | 访问粒度 | 读写属性 | 地址范围 | 典型用途 |
|---|---|---|---|---|
| 线圈(Coil) | 1 bit | 可读可写 | 00001~09999 | 开关量输出、继电器控制 |
| 离散输入(Discrete Input) | 1 bit | 只读 | 10001~19999 | 按钮状态、限位开关 |
| 输入寄存器(Input Register) | 16 bit | 只读 | 30001~39999 | 模拟量采集、温度/压力值 |
| 保持寄存器(Holding Register) | 16 bit | 可读可写 | 40001~49999 | 设定值、PID参数、累计量 |
常见误区:地址范围(如40001)是PLC行业习惯的协议地址,实际报文传输的是数据地址(0x0000~0xFFFF)。例如保持寄存器40001在报文中对应地址0x0000。初学者务必区分这两种地址表示法。
1.6 功能码分类
功能码是Modbus应用层的核心指令,决定主站请求的操作类型:
- 位操作:01(读线圈)、02(读离散输入)、05(写单线圈)、15(写多线圈)
- 字操作:03(读保持寄存器)、04(读输入寄存器)、06(写单寄存器)、16(写多寄存器)
- 诊断与管理:07(读异常状态)、08(诊断)、11(读事件计数)、17(报告从站ID)
选型提示:实际项目中最常用的功能码是03(读保持寄存器)和16(写多寄存器),覆盖90%以上的数据采集与控制场景。RTU与TCP模式在功能码层面完全兼容。