Modbus协议介绍

核心概览

  • 诞生: 1979年由 Modicon 公司(现为施耐德电气的一部分)为其 PLC 产品设计。

  • 本质: 一种应用层消息传递协议,位于 OSI 模型的第 7 层。它定义了客户端(主站/Master)和服务器(从站/Slave)之间如何请求和交换数据,独立于底层物理层(如 RS-232, RS-485, Ethernet, TCP/IP)。

  • 架构: 严格的主从式(Master-Slave)架构。

    • 主站 (Master/Client): 通信的唯一发起者。它主动向从站发送请求(查询/命令)。

    • 从站 (Slave/Server): 被动响应者。每个从站有唯一地址(1-247)。从站只能在接收到发给它的有效请求后,才进行响应(返回数据或执行操作)。从站不能主动发起通信或连接。

  • 核心功能: 提供对设备内部离散量(线圈)和寄存器(存储单元) 的读取和写入操作。

  • 开放性: Modbus 协议规范是公开的、免版税的,这促进了其广泛采用和众多厂商的支持。

  • 简单性: 协议结构简单,易于理解和实现(尤其是在微控制器上),硬件要求低。

核心概念

  1. 数据模型 (地址空间):
    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 个连续寄存器)。

  2. 协议数据单元 (PDU - Protocol Data Unit):
    这是 Modbus 协议的核心,独立于底层传输方式。结构非常简单:

    text
     
    | 功能码 (1 Byte) | 数据 (0-N Bytes) |
    • 功能码 (Function Code): 指定要执行的操作类型(读/写哪种数据,单点/多点)。高位为 1 表示异常响应。

    • 数据 (Data): 包含请求或响应所需的参数,如起始地址、数量、实际数据值等。格式由功能码决定。

  3. 应用数据单元 (ADU - Application Data Unit):
    PDU 加上特定传输方式所需的附加头尾信息,构成最终在网络上传输的报文。

    • Modbus RTU/ASCII: ADU = [地址] + [PDU] + [错误校验]

    • Modbus TCP: ADU = [MBAP Header] + [PDU]

主要传输方式 (物理层/链路层)

  1. Modbus RTU (Remote Terminal Unit):

    • 最常见的传输方式。

    • 物理层: 通常基于 RS-232 或 RS-485 串行总线。RS-485 支持多点通信(一主多从),是主流。

    • 数据表示: 二进制。数据直接以字节二进制形式传输。

    • 报文结构 (ADU):

      text
       
      | 从站地址 (1 Byte) | PDU (N Bytes) | CRC (2 Bytes) |
      • 从站地址: 目标从站标识符 (1-247, 0 是广播地址,248-255 保留)。

      • CRC (循环冗余校验): 用于检测传输错误。

    • 特点: 效率高、紧凑。需要配置串口参数(波特率、数据位、停止位、奇偶校验)。依赖严格的时间间隔 (3.5字符时间) 界定报文帧。

  2. Modbus ASCII (American Standard Code for Information Interchange):

    • 物理层: 同 RTU (RS-232/RS-485)。

    • 数据表示: 每个字节的十六进制ASCII字符表示(0-9, A-F)。每个数据字节用两个ASCII字符传输。

    • 报文结构 (ADU):

      text
       
      | ':' (起始符) | 从站地址 (2 Chars) | PDU (2*N Chars) | LRC (2 Chars) | CR LF (结束符) |
      • LRC (纵向冗余校验): 用于错误检测。

    • 特点: 可读性强(用串口调试工具能直接看懂),效率低于 RTU(传输相同信息量需要双倍字节)。同样依赖时间间隔或起始/结束符界定帧。

  3. Modbus TCP/IP:

    • 物理层/网络层: 基于 以太网 (Ethernet) 和 TCP/IP 协议栈。

    • 报文结构 (ADU):

      text
       
      | 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 从站服务器(需从站支持并发连接)。

  4. 其他变种:

    • Modbus Plus (Modbus+): Modicon 专有的高速令牌总线网络,非开放标准,逐渐被以太网替代。

    • Modbus over UDP: 使用 UDP 代替 TCP,速度更快但不可靠。应用较少。

    • Modbus Secure: 基于 TLS/SSL 的加密 Modbus TCP,解决安全问题。

通信过程

  1. 主站发起请求:

    • 主站构建一个包含目标从站地址(或单元标识符)、功能码和所需数据(地址、数量、写入值等)的 PDU。

    • 根据传输方式(RTU/ASCII/TCP)封装成 ADU。

    • 发送 ADU 到网络。

  2. 从站处理请求:

    • 从站接收到 ADU。

    • 检查地址/单元标识符是否匹配自己。

    • 校验数据完整性(CRC/LRC 或 TCP 层保证)。

    • 解析 PDU 中的功能码和数据。

    • 执行请求的操作(读取线圈/寄存器状态,或写入值)。

  3. 从站发送响应:

    • 如果请求成功,构建一个包含原功能码(正常)和请求数据(读请求)或确认信息(写请求)的 PDU。

    • 如果请求失败(非法功能码、非法地址、执行错误等),构建一个异常响应 PDU:将原功能码最高位置 1 (功能码 + 0x80),后面跟一个异常码 (1 Byte) 指示错误原因。

    • 根据传输方式封装成 ADU。

    • 发送响应 ADU 回主站。

  4. 主站处理响应:

    • 主站接收到响应 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

优势

  1. 简单易懂: 协议结构清晰,易于开发和集成。

  2. 开放免费: 规范公开,无授权费用。

  3. 广泛支持: 几乎所有 PLC、HMI、SCADA 系统、DCS、仪表、驱动器、智能设备都支持 Modbus。

  4. 成熟稳定: 经过数十年工业现场验证,可靠性高。

  5. 易于部署: 硬件要求低(尤其 RTU),布线简单(RS-485 总线)。

  6. 互操作性强: 不同厂商设备只要遵循协议规范即可通信。

局限性

  1. 主从限制: 从站不能主动上报数据(如报警、事件),主站必须不断轮询。实时性受限。

  2. 无内置安全机制:

    • RTU/ASCII:无认证、无加密(明文传输),易受窃听、欺骗、篡改。

    • TCP:依赖网络层安全(如 VPN, 防火墙),协议本身无安全特性(直到 Modbus Secure)。

  3. 数据模型简单: 仅支持基本数据类型(位、16位字),复杂结构需约定。

  4. 无对象模型: 缺乏对设备信息(如厂商、型号、版本)的标准访问方式(对比 OPC UA)。

  5. 效率问题 (RTU/ASCII):

    • 轮询机制在从站多、数据量大时效率低、延迟高。

    • 串行传输速度相对较慢。

  6. 广播限制: 广播写操作缺乏确认机制,可靠性存疑。

  7. 缺乏时间戳: 协议本身不携带数据产生的时间戳。

应用场景

  • PLC 与 HMI (人机界面) 通信

  • SCADA/DCS 系统采集现场设备(传感器、变送器、仪表、驱动器)数据

  • 楼宇自动化系统 (HVAC, 照明控制)

  • 能源监控系统 (电表、水表、气表)

  • 工厂设备状态监控与数据采集

  • RTU (远程终端单元) 与中心站通信

总结

Modbus 是一个简单、开放、可靠的工业通信协议基石。尽管它在安全性、实时性、数据模型复杂度方面存在局限性,但其无与伦比的普及度、易用性和稳定性使其在工业自动化领域仍然占据着极其重要的地位,尤其是在连接传统设备和构建基础监控系统方面。在现代 IIoT 和边缘计算场景中,Modbus 通常作为边缘网关向下连接现场设备的协议,而网关则通过更现代的协议(如 MQTT, HTTPS)将数据上传到云端或上层系统。

理解 Modbus 的核心在于掌握其主从架构、四种数据模型(线圈、离散输入、输入寄存器、保持寄存器)及其地址映射、功能码的作用以及不同传输方式(RTU, ASCII, TCP)的报文封装机制。

posted @ 2025-07-30 23:37  卖雨伞的小男孩  阅读(206)  评论(0)    收藏  举报