2. 制造数据源接入与协议解析

制造现场的数据接入,本质上不是“把线接上”这么简单,而是要把来自不同层级、不同协议、不同语义的数据,统一成后续批流处理能够消费的标准化事件。设备层PLC输出的是寄存器与线圈状态,SCADA汇聚的是工位与产线级运行画面数据,MES提供的是工单、批次、物料与质量结果,传感器则持续产生温度、压力、振动、电流等高频模拟量。它们的时间精度、数据频率、语义粒度和可靠性要求差异极大,因此接入方案必须分层设计,而不是用同一种采集方式一网打尽。

一、四类数据源的接入定位

PLC是控制层核心,数据以Modbus、S7、EtherNet/IP等协议暴露,典型采集对象包括设备启停状态、运行/待机/故障标志、产量计数、节拍、报警字。PLC数据的特点是点位固定、变化驱动、实时性要求高,适合采用轮询或订阅方式采集,并保留原始地址与数据类型。

SCADA通常已经完成了对PLC的汇聚,提供的是工位级或产线级的聚合值,例如OEE、当前工单、设备综合状态。接入SCADA可以降低点位数量,但会损失部分原始细节,因此适合作为“状态与绩效”数据源,而不是唯一数据源。

MES是业务语义层,提供工单号、产品型号、批次、工艺路线、检验结果。MES数据变化频率低,但语义价值高,是后续把设备事件关联到具体产品与订单的关键。接入MES通常通过数据库、REST API或消息中间件完成,需要处理主数据映射与时间对齐。

传感器数据分为两类:一类接入PLC或采集模块后进入控制网络,另一类通过独立网关直接上云或进入边缘节点。高频振动、电流波形等数据频率可达kHz级,必须采用边缘缓存与批量上传,避免直接冲击中心平台。

二、OPC UA、Modbus、MQTT的协议解析要点

Modbus是最常见的设备协议,分为Modbus TCP与Modbus RTU。接入时要明确从站地址、功能码、寄存器起始地址、数据类型与字节序。例如读取保持寄存器40001~40010,对应功能码03,起始地址0,数量10。若设备返回两个寄存器表示一个32位浮点数,必须确认是高字在前还是低字在前,否则会出现数值完全错误。Modbus没有时间戳与语义描述,采集端需要补充采集时间、设备标识与点位名称。

OPC UA面向工业语义建模,具备地址空间、节点ID、数据类型、时间戳与质量码。接入时通过Endpoint连接,使用SecurityPolicy与用户证书完成安全会话,然后以Subscription方式订阅节点。OPC UA的优势是数据自带语义与质量,适合作为PLC与SCADA的统一接入层。需要注意节点ID的命名空间索引,以及采样间隔与发布间隔的配置,避免订阅过多导致服务端压力过大。

MQTT是轻量级发布订阅协议,适合传感器与边缘网关。接入时确定Broker地址、端口、ClientID、用户名密码、Topic层级与QoS等级。Topic建议按“工厂/车间/产线/设备/测点”设计,例如 factory1/workshopA/line1/plc01/temperature。QoS 0适合高频可丢数据,QoS 1适合状态与报警,QoS 2开销大,一般用于关键指令。MQTT消息体常用JSON或Protobuf,需要在接入端完成解析与字段校验。

制造数据源接入与协议解析链路 PLC 控制层 寄存器/线圈/报警字 SCADA 汇聚层 OEE/工单/设备状态 MES 业务层 工单/批次/质量结果 传感器/网关 温度/振动/电流 Modbus TCP/RTU 从站地址 · 功能码03/04 寄存器地址 · 字节序 轮询周期 200ms~1s OPC UA Endpoint · SecurityPolicy 节点ID · 订阅/发布间隔 时间戳 · 质量码 MQTT Broker · ClientID · Topic QoS 0/1/2 · 保留消息 JSON/Protobuf 载荷 边缘接入网关 协议解析 · 点位映射 时间戳补全 · 单位换算 数据缓存 · 断点续传 质量码校验 · 去重 统一事件格式输出 标准 事件 deviceId point value ts/quality 接入关键校验点 ① 字节序与数据类型一致 ② 时间戳来源统一 ③ 点位语义映射完整 ④ 质量码与异常值处理 ⑤ 断线缓存与重传 ⑥ 高频数据边缘降采样

三、接入实战:从点位配置到标准事件

下面以一个典型场景说明接入过程。某车间一台PLC通过Modbus TCP暴露运行状态与产量计数,寄存器40001为设备状态字,40002~40003为32位累计产量,字节序为高字在前。采集端配置如下:

{
  "deviceId": "PLC-LINE1-01",
  "protocol": "modbus-tcp",
  "host": "192.168.10.21",
  "port": 502,
  "slaveId": 1,
  "pollIntervalMs": 500,
  "points": [
    {"name": "runState", "func": 3, "address": 0, "type": "uint16"},
    {"name": "totalCount", "func": 3, "address": 1, "type": "uint32", "byteOrder": "big"}
  ]
}

采集到原始值后,接入网关需要完成三步转换。第一步,将寄存器值映射为业务语义:runState=1表示运行,0表示停机,2表示故障。第二步,补全时间戳,使用网关本地时间并标注时区,避免后续与MES工单时间对齐时出现偏差。第三步,输出统一事件格式:

{
  "deviceId": "PLC-LINE1-01",
  "point": "runState",
  "value": 1,
  "quality": "good",
  "ts": "2025-03-18T10:23:45.120+08:00"
}

对于MQTT传感器,接入时同样需要做字段校验。例如温度消息体为 {"t": 36.8, "unit": "C"},网关应校验t是否在合理范围(如-20~150),超出范围标记为可疑并写入异常通道,而不是直接进入主数据流。对于OPC UA,订阅节点后要检查质量码,若为Bad或Uncertain,应记录并触发告警,避免把无效数据当成正常值参与计算。

四、常见问题与判断依据

接入过程中最常见的问题是数值错误与时间错位。数值错误多由字节序、数据类型或寄存器偏移引起,判断方法是同时读取已知常量寄存器进行比对。时间错位则表现为设备事件与MES工单无法关联,解决方式是统一使用UTC时间存储,展示时再转换为本地时区,并在网关侧记录采集延迟。

另一个高频问题是高频数据压垮链路。对于振动、电流波形等数据,建议在边缘侧先做降采样或特征提取,例如每100ms计算一次RMS值,再以1s周期上传,既保留趋势又控制带宽。若必须保留原始波形,则采用本地缓存加批量上传,并设置断点续传与磁盘水位告警。

接入配置完成后,建议先用一条真实设备数据走通“采集—解析—标准事件—写入消息队列”全链路,确认字段、时间戳与质量码正确后,再批量扩展点位。这样可以把协议解析问题与后续批流处理问题分开定位。

总结来看,制造数据源接入的核心不是追求协议统一,而是建立“协议解析—语义映射—标准事件”的稳定通道。PLC、SCADA、MES、传感器各自承担不同角色,OPC UA、Modbus、MQTT各自解决不同层级的连接问题。只有把点位、时间、质量、频率四个维度都处理清楚,后续的批流一体处理才有可靠的数据基础。