Modbus协议介绍
核心概览
-
诞生: 1979年由 Modicon 公司(现为施耐德电气的一部分)为其 PLC 产品设计。
-
本质: 一种应用层消息传递协议,位于 OSI 模型的第 7 层。它定义了客户端(主站/Master)和服务器(从站/Slave)之间如何请求和交换数据,独立于底层物理层(如 RS-232, RS-485, Ethernet, TCP/IP)。
-
架构: 严格的主从式(Master-Slave)架构。
-
主站 (Master/Client): 通信的唯一发起者。它主动向从站发送请求(查询/命令)。
-
从站 (Slave/Server): 被动响应者。每个从站有唯一地址(1-247)。从站只能在接收到发给它的有效请求后,才进行响应(返回数据或执行操作)。从站不能主动发起通信或连接。
-
-
核心功能: 提供对设备内部离散量(线圈)和寄存器(存储单元) 的读取和写入操作。
-
开放性: Modbus 协议规范是公开的、免版税的,这促进了其广泛采用和众多厂商的支持。
-
简单性: 协议结构简单,易于理解和实现(尤其是在微控制器上),硬件要求低。
核心概念
-
数据模型 (地址空间):
Modbus 将设备内部的数据抽象为四种主要类型,每种类型有独立的地址空间:数据类型 访问方式 物理对应示例 Modbus 地址范围 (常用表示) 功能码 (部分) 线圈 (Coils) 读/写 数字量输出 (DO)、开关状态、可写标志位 00001 - 09999 (0x0000 - 0x270F) 读: 01 (0x01)
写: 05 (单), 15 (多)离散输入 (Discrete Inputs) 只读 数字量输入 (DI)、开关状态、只读状态位 10001 - 19999 (0x0000 - 0x270F) 读: 02 (0x02) 输入寄存器 (Input Registers) 只读 模拟量输入 (AI)、只读参数、实时数据 30001 - 39999 (0x0000 - 0x270F) 读: 04 (0x04) 保持寄存器 (Holding Registers) 读/写 模拟量输出 (AO)、可配置参数、存储数据 40001 - 49999 (0x0000 - 0x270F) 读: 03 (0x03)
写: 06 (单), 16 (多)-
地址表示: 协议传输中使用的是从 0 开始的偏移地址(例如,保持寄存器 40001 在协议中表示为地址 0)。文档和软件界面常用带前缀的 5 位数地址(如 40001)方便理解。
-
数据类型: 寄存器通常存储 16 位无符号整数。协议本身不定义浮点数、字符串等复杂类型,需要主从站约定数据在寄存器中的表示格式(如 IEEE 754 浮点数占用 2 个连续寄存器)。
-
-
协议数据单元 (PDU - Protocol Data Unit):
这是 Modbus 协议的核心,独立于底层传输方式。结构非常简单:| 功能码 (1 Byte) | 数据 (0-N Bytes) |
-
功能码 (Function Code): 指定要执行的操作类型(读/写哪种数据,单点/多点)。高位为
1表示异常响应。 -
数据 (Data): 包含请求或响应所需的参数,如起始地址、数量、实际数据值等。格式由功能码决定。
-
-
应用数据单元 (ADU - Application Data Unit):
PDU 加上特定传输方式所需的附加头尾信息,构成最终在网络上传输的报文。-
Modbus RTU/ASCII: ADU = [地址] + [PDU] + [错误校验]
-
Modbus TCP: ADU = [MBAP Header] + [PDU]
-
主要传输方式 (物理层/链路层)
-
Modbus RTU (Remote Terminal Unit):
-
最常见的传输方式。
-
物理层: 通常基于 RS-232 或 RS-485 串行总线。RS-485 支持多点通信(一主多从),是主流。
-
数据表示: 二进制。数据直接以字节二进制形式传输。
-
报文结构 (ADU):
| 从站地址 (1 Byte) | PDU (N Bytes) | CRC (2 Bytes) |
-
从站地址: 目标从站标识符 (1-247, 0 是广播地址,248-255 保留)。
-
CRC (循环冗余校验): 用于检测传输错误。
-
-
特点: 效率高、紧凑。需要配置串口参数(波特率、数据位、停止位、奇偶校验)。依赖严格的时间间隔 (3.5字符时间) 界定报文帧。
-
-
Modbus ASCII (American Standard Code for Information Interchange):
-
物理层: 同 RTU (RS-232/RS-485)。
-
数据表示: 每个字节的十六进制ASCII字符表示(0-9, A-F)。每个数据字节用两个ASCII字符传输。
-
报文结构 (ADU):
| ':' (起始符) | 从站地址 (2 Chars) | PDU (2*N Chars) | LRC (2 Chars) | CR LF (结束符) |
-
LRC (纵向冗余校验): 用于错误检测。
-
-
特点: 可读性强(用串口调试工具能直接看懂),效率低于 RTU(传输相同信息量需要双倍字节)。同样依赖时间间隔或起始/结束符界定帧。
-
-
Modbus TCP/IP:
-
物理层/网络层: 基于 以太网 (Ethernet) 和 TCP/IP 协议栈。
-
报文结构 (ADU):
| MBAP Header (7 Bytes) | PDU (N Bytes) |
-
MBAP Header (Modbus Application Protocol Header):
-
事务标识符 (2 Bytes): 主站生成,用于请求响应配对(一个连接上可能有多个并发请求)。
-
协议标识符 (2 Bytes): 固定为
0x0000,表示 Modbus 协议。 -
长度 (2 Bytes): 指示后面 PDU 字段 + 单元标识符字段的总字节数。
-
单元标识符 (1 Byte): 功能上等同于 RTU 中的从站地址,用于标识串行链路或总线上的目标从站(在 TCP 直连单个设备时,此字段常被忽略或设为固定值,如 0xFF 或 0x00)。这是实现 Modbus TCP 到 Modbus RTU/ASCII 网关的关键字段。
-
-
-
特点:
-
利用 TCP 的可靠传输(确认、重传、流控)。
-
使用标准以太网和 IP 网络,易于集成到现有 IT 基础设施。
-
支持长距离通信(跨网段、互联网,需考虑安全和延迟)。
-
不再依赖时间间隔界定帧,由 TCP 的流控制保证数据完整性。
-
默认端口是 502。
-
一个主站可以同时通过不同 TCP 连接与多个从站通信,或者多个主站连接同一个 TCP 从站服务器(需从站支持并发连接)。
-
-
-
其他变种:
-
Modbus Plus (Modbus+): Modicon 专有的高速令牌总线网络,非开放标准,逐渐被以太网替代。
-
Modbus over UDP: 使用 UDP 代替 TCP,速度更快但不可靠。应用较少。
-
Modbus Secure: 基于 TLS/SSL 的加密 Modbus TCP,解决安全问题。
-
通信过程
-
主站发起请求:
-
主站构建一个包含目标从站地址(或单元标识符)、功能码和所需数据(地址、数量、写入值等)的 PDU。
-
根据传输方式(RTU/ASCII/TCP)封装成 ADU。
-
发送 ADU 到网络。
-
-
从站处理请求:
-
从站接收到 ADU。
-
检查地址/单元标识符是否匹配自己。
-
校验数据完整性(CRC/LRC 或 TCP 层保证)。
-
解析 PDU 中的功能码和数据。
-
执行请求的操作(读取线圈/寄存器状态,或写入值)。
-
-
从站发送响应:
-
如果请求成功,构建一个包含原功能码(正常)和请求数据(读请求)或确认信息(写请求)的 PDU。
-
如果请求失败(非法功能码、非法地址、执行错误等),构建一个异常响应 PDU:将原功能码最高位置
1(功能码 + 0x80),后面跟一个异常码 (1 Byte) 指示错误原因。 -
根据传输方式封装成 ADU。
-
发送响应 ADU 回主站。
-
-
主站处理响应:
-
主站接收到响应 ADU。
-
校验数据完整性。
-
检查事务标识符(TCP)或地址(RTU/ASCII)是否匹配之前的请求。
-
解析 PDU:
-
如果是正常响应:提取数据或确认操作成功。
-
如果是异常响应:根据异常码处理错误。
-
-
功能码 (Function Codes - 常用示例)
| 功能码 (十进制/十六进制) | 名称 | 作用 | 访问类型 | PDU 请求示例 (简化) | PDU 响应示例 (简化) |
|---|---|---|---|---|---|
| 01 / 0x01 | Read Coils | 读取一个或多个线圈状态 | 读 | FC 01, Start Addr Hi/Lo, Qty Hi/Lo | FC 01, Byte Count, Coil Status Data |
| 02 / 0x02 | Read Discrete Inputs | 读取一个或多个离散输入状态 | 读 | FC 02, Start Addr Hi/Lo, Qty Hi/Lo | FC 02, Byte Count, Input Status Data |
| 03 / 0x03 | Read Holding Registers | 读取一个或多个保持寄存器内容 | 读 | FC 03, Start Addr Hi/Lo, Qty Hi/Lo | FC 03, Byte Count, Register Data Hi/Lo... |
| 04 / 0x04 | Read Input Registers | 读取一个或多个输入寄存器内容 | 读 | FC 04, Start Addr Hi/Lo, Qty Hi/Lo | FC 04, Byte Count, Register Data Hi/Lo... |
| 05 / 0x05 | Write Single Coil | 写入单个线圈状态 (ON/OFF) | 写 | FC 05, Output Addr Hi/Lo, Value Hi/Lo (FF00=ON, 0000=OFF) | FC 05, Output Addr Hi/Lo, Value Hi/Lo (Echo) |
| 06 / 0x06 | Write Single Register | 写入单个保持寄存器内容 | 写 | FC 06, Reg Addr Hi/Lo, Value Hi/Lo | FC 06, Reg Addr Hi/Lo, Value Hi/Lo (Echo) |
| 15 / 0x0F | Write Multiple Coils | 写入多个线圈状态 | 写 | FC 15, Start Addr Hi/Lo, Qty Hi/Lo, Byte Count, Coil Data | FC 15, Start Addr Hi/Lo, Qty Hi/Lo |
| 16 / 0x10 | Write Multiple Registers | 写入多个保持寄存器内容 | 写 | FC 16, Start Addr Hi/Lo, Qty Hi/Lo, Byte Count, Reg Data Hi/Lo... | FC 16, Start Addr Hi/Lo, Qty Hi/Lo |
优势
-
简单易懂: 协议结构清晰,易于开发和集成。
-
开放免费: 规范公开,无授权费用。
-
广泛支持: 几乎所有 PLC、HMI、SCADA 系统、DCS、仪表、驱动器、智能设备都支持 Modbus。
-
成熟稳定: 经过数十年工业现场验证,可靠性高。
-
易于部署: 硬件要求低(尤其 RTU),布线简单(RS-485 总线)。
-
互操作性强: 不同厂商设备只要遵循协议规范即可通信。
局限性
-
主从限制: 从站不能主动上报数据(如报警、事件),主站必须不断轮询。实时性受限。
-
无内置安全机制:
-
RTU/ASCII:无认证、无加密(明文传输),易受窃听、欺骗、篡改。
-
TCP:依赖网络层安全(如 VPN, 防火墙),协议本身无安全特性(直到 Modbus Secure)。
-
-
数据模型简单: 仅支持基本数据类型(位、16位字),复杂结构需约定。
-
无对象模型: 缺乏对设备信息(如厂商、型号、版本)的标准访问方式(对比 OPC UA)。
-
效率问题 (RTU/ASCII):
-
轮询机制在从站多、数据量大时效率低、延迟高。
-
串行传输速度相对较慢。
-
-
广播限制: 广播写操作缺乏确认机制,可靠性存疑。
-
缺乏时间戳: 协议本身不携带数据产生的时间戳。
应用场景
-
PLC 与 HMI (人机界面) 通信
-
SCADA/DCS 系统采集现场设备(传感器、变送器、仪表、驱动器)数据
-
楼宇自动化系统 (HVAC, 照明控制)
-
能源监控系统 (电表、水表、气表)
-
工厂设备状态监控与数据采集
-
RTU (远程终端单元) 与中心站通信
总结
Modbus 是一个简单、开放、可靠的工业通信协议基石。尽管它在安全性、实时性、数据模型复杂度方面存在局限性,但其无与伦比的普及度、易用性和稳定性使其在工业自动化领域仍然占据着极其重要的地位,尤其是在连接传统设备和构建基础监控系统方面。在现代 IIoT 和边缘计算场景中,Modbus 通常作为边缘网关向下连接现场设备的协议,而网关则通过更现代的协议(如 MQTT, HTTPS)将数据上传到云端或上层系统。
理解 Modbus 的核心在于掌握其主从架构、四种数据模型(线圈、离散输入、输入寄存器、保持寄存器)及其地址映射、功能码的作用以及不同传输方式(RTU, ASCII, TCP)的报文封装机制。
浙公网安备 33010602011771号