第二章:通信协议基础——Modbus TCP/RTU、OPC UA与MQTT

各位同学,大家好。今天我们来聊聊自控系统里最绕不开的话题——通信协议。

说实话,我刚开始做自动化那会儿,也被各种协议搞得头大。Modbus、OPC、MQTT……每个都号称自己是“工业标准”,但实际用起来坑一个比一个深。今天我就把这几兄弟掰开了揉碎了讲清楚,顺便分享一些我当年踩过的坑。

2.1 Modbus TCP/RTU:老当益壮的工业老兵

Modbus 这玩意儿,1979年就诞生了。你想想看,比我都大。但它至今还在大量使用,为什么?简单、稳定、便宜。

Modbus 有两种主要形态:RTU 和 TCP。

2.1.1 Modbus RTU

RTU 跑在串口上(RS-232/RS-485)。它的数据是二进制格式,紧凑高效。一个报文帧大概长这样:

地址 | 功能码 | 数据 | CRC校验
1字节 | 1字节 | N字节 | 2字节

举个例子,读取从站地址为1的设备的保持寄存器,起始地址0,读取2个寄存器:

请求:01 03 00 00 00 02 C4 0B
响应:01 03 04 00 0A 00 14 7A 6B

这里 0x000A 是10,0x0014 是20。嗯,就是这么直白。

我的经验:RTU 的 CRC 校验经常被人忽略。我曾经在一个项目里,从站设备离主站有800米,线缆质量一般,结果数据时不时跳变。排查了两天,最后发现是 CRC 实现有 bug。从那以后,我拿到任何 Modbus 设备,第一件事就是拿 Modbus Poll 工具扫一遍 CRC 正确性。

2.1.2 Modbus TCP

TCP 就是把 RTU 的报文直接塞进 TCP 包里,去掉了 CRC(因为 TCP 自己会校验),加了个 MBAP 头。结构如下:

MBAP头(7字节) | 功能码(1字节) | 数据(N字节)

MBAP 头包含事务标识符、协议标识符、长度和单元标识符。说白了,就是告诉接收方“这是哪个请求的回复”。

TCP 默认端口是502。我建议你记住这个端口号,因为很多防火墙默认会拦它。

避坑指南:我曾经遇到一个客户,Modbus TCP 通信时断时续。查了半天,发现是交换机的端口安全策略把502端口给封了。所以,部署前一定要确认网络策略。

2.2 OPC UA:工业4.0的通信基石

OPC UA 和 Modbus 不是一个时代的产物。Modbus 是“发个数字过去”,OPC UA 是“我给你一个对象,里面有温度、压力、状态,还有历史数据”。

OPC UA 的核心优势:

  • 面向对象的信息模型:不只是传数值,还能传元数据
  • 安全机制:支持证书、加密、签名
  • 跨平台:Windows、Linux、嵌入式都能跑
  • 历史数据访问:可以查询过去的数据

一个典型的 OPC UA 地址空间结构:

Root
 └── Objects
      └── DeviceSet
           ├── PLC_1
           │    ├── Temperature (变量)
           │    ├── Pressure (变量)
           │    └── Status (变量)
           └── PLC_2
                ├── Speed (变量)
                └── Alarm (事件)

你看,这比 Modbus 的“寄存器地址0x0000”要直观得多。

我的建议:如果你在做新项目,尤其是需要和 MES、ERP 对接的,直接上 OPC UA。别再用 OPC DA(基于 COM/DCOM)了,那玩意儿在跨网络时简直是噩梦。我当年配 DCOM 权限配到想砸电脑。

2.3 MQTT:物联网时代的轻量级选手

MQTT 最初是 IBM 为石油管道监控设计的。它的特点是:轻量、发布/订阅模式、支持 QoS。

为什么 MQTT 适合物联网?

  • 报文头最小只有2字节
  • 支持断线重连和遗嘱消息
  • 一对多通信,天然适合传感器数据采集

一个典型的 MQTT 主题结构:

factory/area1/line2/temperature
factory/area1/line2/pressure
factory/area1/line3/temperature

客户端可以订阅 factory/area1/# 来获取所有数据。

QoS 有三个级别:

QoS 含义 适用场景
0 最多发一次,不确认 温度等非关键数据
1 至少发一次,可能重复 状态变化通知
2 恰好发一次,保证不重复 报警、控制指令
我的教训:别一上来就用 QoS 2。我曾经在一个项目里,500个传感器都用 QoS 2,结果 Broker 负载直接爆了。后来改成大部分用 QoS 0,关键报警用 QoS 1,系统就稳了。记住,QoS 越高,开销越大。

2.4 协议选型对比:到底该用哪个?

这个问题没有标准答案。但我可以给你一个决策框架:

场景 推荐协议 理由
PLC 与现场设备通信 Modbus RTU/TCP 简单、兼容性好、成本低
上位机与 PLC 通信 OPC UA 信息模型丰富、安全、跨平台
传感器数据上云 MQTT 轻量、支持断线重连、适合弱网
设备与设备直接通信 Modbus TCP 实时性好、延迟低
需要历史数据查询 OPC UA 原生支持历史数据访问

我个人习惯是:现场总线用 Modbus,车间级用 OPC UA,云端用 MQTT。这三者各司其职,互不冲突。

核心原则:没有最好的协议,只有最合适的协议。选型时考虑三个因素:设备兼容性、网络环境、维护成本。别为了追求“先进”而选一个没人会用的协议。

2.5 知识体系总览

下面这张图,是我自己梳理的通信协议知识体系。你可以把它当作一个“地图”,随时回来对照。

自控系统通信协议知识体系 Modbus OPC UA MQTT RTU (RS-232/485) TCP (端口502) 功能码:01/03/06/10 信息模型(对象/变量) 安全机制(证书/加密) 历史数据/报警/事件 发布/订阅模式 QoS 0/1/2 遗嘱消息/保留消息 选型决策矩阵 现场设备 ↔ PLC → Modbus RTU/TCP 上位机 ↔ PLC → OPC UA 传感器 → 云平台 → MQTT

这张图把三大协议的核心特征和选型方向都标出来了。你可以把它截图保存,以后做方案时拿出来对照一下。


公众号:蓝海资料掘金营,微信deep3321