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报文段中。
Modbus在OSI模型中的定位 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 Modbus 应用层 RS-232 / RS-485 Modbus RTU / ASCII TCP (端口502) IP 以太网 Modbus TCP Modbus仅定义应用层;串行变体覆盖物理层+数据链路层,TCP变体依赖标准TCP/IP协议栈

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读保持寄存器、数据地址映射
Modbus协议栈层次结构 应用层 — 功能码 + 数据模型 功能码:01读线圈、03读寄存器、06写单寄存器、16写多寄存器…… 数据链路层 — 帧封装 + 差错校验 RTU:地址+功能码+数据+CRC-16 | TCP:MBAP头+PDU 物理层 — 传输介质 + 电气特性 RS-485双绞线(半双工) | 以太网CAT5e/CAT6(全双工) 上层依赖下层提供服务:应用层PDU → 数据链路层封装 → 物理层比特流传输

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模式在功能码层面完全兼容。