4. 工业通信协议与接口开发
SCADA 能源监控系统的数据入口,几乎全部落在通信协议与接口驱动上。现场设备种类繁杂:电表、保护装置、PLC、逆变器、储能 BMS、环境传感器,它们使用的协议、物理接口、数据模型各不相同。本节围绕四类主流协议——Modbus、IEC 60870-5-104、OPC UA、MQTT——讲清它们各自适合什么场景、数据如何组织,以及驱动开发中真正要动手实现的关键环节。
四类协议的定位与选型
Modbus 是最基础的现场总线协议,分 RTU(串口)与 TCP 两种承载方式,采用“主站请求—从站应答”的轮询模型,数据模型只有四类:线圈、离散输入、保持寄存器、输入寄存器。它简单、通用、成本低,适合电表、温控器、小型 PLC 等点表规模不大的设备。IEC 104 是电力系统远动协议,运行在 TCP 之上,采用 ASDU 报文结构,支持遥测、遥信、遥控、遥调,具备总召唤、变化上送、时标、品质位等机制,适合变电站、开闭所等对实时性和可靠性要求高的场景。OPC UA 是面向信息建模的协议,自带地址空间、类型系统和订阅机制,适合 PLC、DCS、边缘网关等需要语义化数据访问的设备。MQTT 是发布/订阅型消息协议,通过 Broker 解耦,适合分布式站点、无线回传、云端汇聚等场景。
Modbus 驱动开发要点
Modbus 驱动的核心是“点表 + 轮询调度”。点表定义每个测点的从站地址、功能码、寄存器起始地址、数据类型和量纲系数。例如读取一块三相电表的 A 相电压,点表可写为:从站号 1、功能码 03、起始地址 0x0000、寄存器数量 2、数据类型 float32、系数 1.0。轮询时按功能码和地址区间合并请求,减少报文数量。解析时要注意字节序:Modbus 寄存器是 16 位大端,但 float32 在寄存器中的排列有 ABCD、CDAB、BADC、DCBA 四种常见顺序,必须与设备手册一致,否则读出的电压会变成乱码。
# 示例:Modbus TCP 读取保持寄存器(伪代码)
req = build_request(slave=1, func=0x03, start=0x0000, count=2)
resp = tcp_client.send(req)
raw = resp[9:13] # 4 字节数据
voltage = struct.unpack('>f', raw)[0] # 大端 float32
if voltage < 0 or voltage > 300:
quality = 'INVALID' # 越限标记
else:
quality = 'GOOD'
point['A相电压'] = (voltage, quality, timestamp)
轮询周期需要权衡:周期太短会压垮串口或设备,太长则实时性不足。一般电表遥测 1~5 秒,遥信 500 毫秒~1 秒。对于变化不频繁的开关量,可采用“变化上送 + 定时总召唤”结合的方式降低负载。
IEC 104 驱动开发要点
IEC 104 的驱动比 Modbus 复杂,因为它是有状态的。建立 TCP 连接后,主站先发送 STARTDT 激活传输,然后发起总召唤(C_IC_NA_1,类型标识 100),子站以信息对象序列回应全部遥测遥信。之后子站通过变化上送(如 M_SP_NA_1、M_ME_NC_1)主动推送变化点。驱动必须维护“传送原因”和“公共地址”,并正确处理时标与品质位。遥控采用“选择—执行”两步:先发 C_SC_NA_1 选择,收到确认后再发执行,避免误动。
实际开发中,104 驱动的难点在于报文长度不固定、信息对象地址(IOA)与点表的映射,以及总召唤期间的数据风暴处理。建议在驱动内设置接收缓冲区,按 ASDU 长度字段切分报文,再逐条解析信息对象,避免粘包拆包错误。
OPC UA 与 MQTT 驱动开发要点
OPC UA 驱动通常基于官方或开源 SDK,流程是:建立安全通道 → 创建会话 → Browse 浏览地址空间 → 将节点 NodeId 与点表绑定 → 创建订阅并设置采样间隔和死区。订阅模式下,服务端只在数据变化超过死区时推送,能显著降低网络流量。开发时要处理会话超时、订阅丢失和证书信任问题。
MQTT 驱动则围绕 Topic 设计展开。推荐按“站点/设备/测点”分层,例如 station01/meter03/voltage_a,Payload 使用 JSON 携带值、时标和品质。QoS 选择上,遥测可用 QoS 0 或 1,遥控命令必须用 QoS 1 并配合应答主题。驱动需要实现断线重连、遗嘱消息和保留消息,保证云端能感知设备离线。
协议解析与驱动开发的通用实践
无论哪种协议,驱动层都应遵循统一抽象:连接管理、报文编解码、点表映射、品质归一、异常上报。建议把协议差异封装在驱动内部,向上层暴露统一的“读点/写点/订阅”接口,这样 SCADA 实时库和画面组态就不必关心底层是 Modbus 还是 104。调试阶段可先用协议模拟器或抓包工具验证报文,再接入真实设备;上线后重点观察通信中断次数、报文超时率和无效品质点比例,这三项指标能快速定位链路或点表问题。