在工业自动化、智能楼宇、能源监控等领域,各种各样的传感器、仪表、PLC(可编程逻辑控制器)需要相互“对话”,协同工作。而要让这些来自不同厂商、不同型号的设备说“同一种语言”,就需要一种标准化的通信协议。其中,Modbus RTU 无疑是应用最广泛、最经久不衰的协议之一。

今天,我们就来揭开 Modbus RTU 的神秘面纱,看看它是如何工作的,以及为什么它在当今工业界依然如此重要。

一、Modbus RTU 是什么?

Modbus RTU 是一种广泛应用的串行通信协议,属于 Modbus 协议家族的一种传输模式。它采用主从(Master-Slave)架构,通常运行在物理串行接口上,如 RS-485 或 RS-232

  • Modbus: 是一种应用层消息传递协议,定义了数据的结构和含义。它独立于底层物理层,因此可以在多种网络(如串口、以太网)上实现。

  • RTU: 代表 远程终端单元。在这种模式下,数据以二进制(十六进制)形式表示,具有高数据密度,通信效率高,非常适合工业环境。

  • 对比: 另一种常见的Modbus模式是 Modbus ASCII,它使用可读的ASCII字符表示数据,效率较低,但易于调试。Modbus TCP/IP 则是运行在以太网上的版本。

核心特点:
  • 简单易用: 协议格式简单,易于开发和集成。

  • 开放标准: 免版税,被众多设备制造商支持,是事实上的工业通信标准。

  • 可靠性高: 具有循环冗余校验(CRC),确保数据传输的准确性。

  • 主从结构: 一个主站设备(如PLC、SCADA系统、计算机)可以轮询多个从站设备(如传感器、变频器、电表)。

二、通信方式与物理层

  1. 主从架构
    • 主站: 主动发起请求(查询)的设备。同一时间网络上只能有一个主站处于活动状态。

    • 从站: 被动响应主站请求的设备。每个从站都有一个唯一的地址(1-247)。从站永远不会主动发送数据。

  2. 物理接口
    • RS-485: 最常用的物理层。支持多点通信(一条总线上可挂接多个设备,通常最多32个),抗干扰能力强,传输距离远(最长可达1200米)。

    • RS-232: 通常用于点对点通信,传输距离短(通常小于15米),抗干扰能力较弱,常用于计算机与单个设备的连接。

  3. 接线
    • 使用双绞线进行连接。

    • RS-485网络需要终端电阻(位于总线两端,约120欧姆)来抑制信号反射。

三、核心功能码

功能码指明了主站命令从站执行何种操作。主要分为两类:位操作字操作

功能码(十进制) 名称 操作类型 对象类型
01 读线圈状态 位操作 线圈(Coils)
02 读离散量输入 位操作 离散输入(Discrete Inputs)
03 读保持寄存器 字操作 保持寄存器(Holding Registers)
04 读输入寄存器 字操作 输入寄存器(Input Registers)
05 写单个线圈 位操作 线圈(Coils)
06 写单个寄存器 字操作 保持寄存器(Holding Registers)
15 写多个线圈 位操作 线圈(Coils)
16 写多个寄存器 字操作 保持寄存器(Holding Registers)

四种数据区的区别(非常重要!):

  1. 线圈: 可读可写,通常映射到设备的开关量输出(DO),如继电器的通/断。

  2. 离散输入: 只读,通常映射到设备的开关量输入(DI),如按钮、限位开关的状态。

  3. 保持寄存器: 可读可写,通常用于存储设备的工作参数、设置值等,如目标速度、温度设定值。

  4. 输入寄存器: 只读,通常用于存储设备的实时采集数据,如当前温度、压力、流量。

四、数据是如何打包的?—— 解析 RTU 报文帧

Modbus RTU 的数据以二进制形式传输,非常紧凑。

  • 从站地址: 接收数据的从设备的唯一标识符(1-247)。

  • 功能码: 告诉从设备要执行什么操作。例如:

    • 01: 读取线圈状态(读位,开关量)

    • 02: 读取离散输入(读位,只读)

    • 03: 读取保持寄存器(读字,可读可写,最常用)

    • 04: 读取输入寄存器(读字,只读)

    • 05: 写单个线圈

    • 06: 写单个寄存器

    • 16: 写多个寄存器

  • 数据: 包含请求或响应的具体信息,如寄存器的起始地址、要读取的数量、写入的值等。

  • CRC校验: 循环冗余校验。发送方会根据前面的所有字节计算出一个16位的值,接收方也会进行同样的计算。如果结果不匹配,说明传输过程中发生了错误,数据会被丢弃,确保通信的可靠性。

五、通信示例(16进制)

01、读线圈(位操作)

读取线圈起始地址为00 01的连续三个线圈状态。

返回01 即三个线圈状态为001。

02、读离散输入(位操作)

读取离散输入起始地址为00 01的三个连续离散输入状态。

返回06 即三个离散输入状态为110。

03、读保持寄存器(字操作)

读取保持寄存器起始地址为00 01的两个连续保持寄存器状态。

根据返回值 得即两个保持寄存器状态为00 E9和00 8B。

04、读输入寄存器(字操作)

读取输入寄存器起始地址为00 01的两个连续输入寄存器状态。

根据返回值 得即两个输入寄存器状态为00 85和00 96。

05、写单个线圈(位操作)

在地址为01的线圈处置1(FF 00代表写1,00 00代表写0)

写入成功返回报文与原报文一致

06、写单个寄存器(字操作)

在地址为01的单个寄存器写入00 7B

写入成功返回报文与原报文一致

15、写多个线圈(位操作)

把起始地址为00 01的三个连续线圈分别置为011

16、写多个寄存器(字操作)

在地址为01 、02的两个寄存器写入00 7B、01 41。

六、配置参数

要实现Modbus RTU通信,必须确保通信双方的所有参数完全一致

  1. 从站地址: 每个从站的唯一ID。

  2. 波特率: 通信速度(如9600, 19200, 115200 bps)。

  3. 数据位: 通常为8位。

  4. 停止位: 通常为1位或2位。

  5. 校验位: 奇校验、偶校验或无校验。

常见设置: 9600, 8, N, 1 (波特率9600,数据位8,无校验,停止位1)

七、在实际项目中需要注意什么?

  1. 接线与终端电阻: 使用 RS-485 时,必须使用双绞线。在总线的最远两端,需要各接一个 120Ω 的终端电阻,以消除信号反射,保证通信质量。

  2. 设备地址: 总线上每个从设备必须有唯一的地址。

  3. 波特率、数据位、奇偶校验、停止位: 总线上所有设备的这些串口参数必须完全一致,否则无法通信。常见的设置是 19200, 8, E, 1 或 9600, 8, N, 2

  4. CRC 计算: 虽然原理复杂,但实践中开发者通常直接使用现成的函数库来计算 CRC,无需手动计算

总结

Modbus RTU 以其极简的设计、卓越的可靠性和广泛的厂商支持,成为了工业控制领域最基础、最重要的通信协议之一。理解其主从架构、四种数据区、帧格式和配置参数,是进行工业设备联网、数据采集和系统集成的基本功。尽管存在速度和安全性的局限,但在大量的现有设备和特定应用场景中,它仍然是无可替代的最佳选择。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐