Modbus RTU

Modbus RTU 是一种通用的工业标准通信协议,广泛应用于工业自动化设备(如传感器、编码器、变频器、PLC 等)。

协议概述

  • 历史:1979 年由 Modicon(现施耐德电气)发明,最初用于 PLC 通信。
  • 地位:工业自动化的事实标准。
  • 物理层:通常基于 RS-485 或 RS-232。
  • 特点:采用二进制传输,紧凑高效。

通信模式:请求-响应

Modbus 采用主从(Master-Slave)架构和请求-响应模式:

sequenceDiagram
    participant Host as 主机 (PC)
    participant Slave as 从机 (编码器)
    Host->>Slave: 请求 (读寄存器)
    Slave-->>Host: 响应 (返回数据)
    Host->>Slave: 请求
    Slave-->>Host: 响应

特点

  • 从机被动:从机不会主动发送数据,必须由主机轮询。
  • 严格顺序:一问一答,必须等待上一次响应完成才能发送下一次请求。

对比其他模式

模式描述示例
请求-响应主机问,从机答Modbus RTU
主动推送设备定时/事件触发发送某些传感器串口协议
发布-订阅订阅后自动接收MQTT, ROS

对采样率的影响: 这就是采样率受限的根本原因 —— 每次都要完成完整的请求-响应周期(发送请求 + 设备处理 + 接收响应),即下文计算的 17 字节传输时间加上设备内部处理时间。

帧结构示例

以读取编码器数据为例,一次典型的请求/响应过程如下:

请求帧 (8 字节)

主机发送给从机的指令:

01 03 00 00 00 02 C4 0B
│  │  └──┬──┘ └──┬──┘ └──┬──┘
│  │     │       │       └─ CRC 校验 (2字节)
│  │     │       └─ 寄存器数量 (2字节)
│  │     └─ 起始地址 (2字节)
│  └─ 功能码 (1字节)
└─ 地址 (1字节)

响应帧 (9 字节)

从机返回给主机的数据:

01 03 04 7F FF FD E7 D3 0D
│  │  │  └────┬────┘  └──┬──┘
│  │  │       │          └─ CRC 校验 (2字节)
│  │  │       └─ 数据 (4字节)
│  │  └─ 字节数 (1字节)
│  └─ 功能码 (1字节)
└─ 地址 (1字节)

总通信量:请求 8 字节 + 响应 9 字节 = 17 字节

通信速率与采样率计算

在波特率为 9600 bps 的情况下,通信耗时计算如下:

  1. 传输时间

    • 串口通信通常为 “1 起始位 + 8 数据位 + 1 停止位 ” = 10 位/字节。
    • 总位数:17 字节 × 10 位 = 170 位。
    • 传输耗时:
  2. 采样率限制

    • 如果代码中还有 time.sleep(0.1) 的间隔。
    • 总周期:
    • 实际采样率:
  3. 理论极限

    • 如果不加延时,仅考虑传输时间:
    • 提高采样率的方法
      • 减少软件层面的轮询间隔。
      • 提高波特率(如从 9600 提至 115200),如果硬件支持。

Modbus 家族对比

变体物理层特点
Modbus RTURS-485/RS-232二进制,紧凑高效,工业最常用。
Modbus ASCIIRS-485/RS-232ASCII 字符,可读性好,但效率低(数据量翻倍)。
Modbus TCP以太网基于 TCP/IP 协议,用于网络传输。

为什么选择 Modbus RTU

  1. 开放免费:无授权费,协议公开。
  2. 简单可靠:结构简单,易于实现。
  3. 硬件支持
    • RS-485 优势:抗干扰能力强,传输距离远(理论可达 1200m)。
    • 总线拓扑:支持多设备挂载在同一条总线上,通过地址区分不同设备。