付同学的技术客栈/

边缘采集层:现场数据进 MES 的第一道关

所属专题 MES现场落地手记 第 3 篇 / 共 9 篇 查看专题目录

有一次看产线看板,班长指着屏幕说:这台锁螺丝机明明在跑,为什么 MES 显示停机?

软件侧先查日志。接口正常,消息队列没有积压,实时处理服务也没报错。

电气侧看 PLC。设备运行点位在跳,自动模式点位也正常。

最后把点位表翻出来才发现,MES 接入时把“自动模式”当成了“运行状态”。设备没有停,只是那个点位的语义被理解错了。

这类问题很常见。它不是业务逻辑错,也不是数据库慢,而是现场数据进入 MES 的第一道关没有守好。

边缘采集最容易被低估。

在方案里它可能只是一个“采集服务”,但到了现场,它要面对的是不同品牌控制器、不稳定网络、设备改造历史、点位命名习惯,还有师傅口中的“这个信号以前就这样”。

我遇到过一种情况,MES 页面显示设备停机,设备工程师看 PLC 又觉得设备没问题。最后查下来,不是系统错,也不是设备错,而是大家对“运行中”这个点位的理解不一样。

这种问题如果不在边缘层处理清楚,后面的业务层只会越来越乱。

一、边缘采集层到底在守什么

边缘采集层表面上是在读设备数据。

实际上,它在守三件事。

第一,守协议差异。

西门子、三菱、欧姆龙、台达、汇川,还有扫码枪、测试机、视觉设备,不会天然说同一种语言。

第二,守点位语义。

一个地址里的值到底代表什么,什么时候变化,是否清零,单位是什么,是否需要换算,这些都要在边缘侧和配置里说清楚。

第三,守现场不稳定。

网络会断,PLC 会重启,工控机会蓝屏,测试机会晚几秒吐结果,扫码枪可能重复扫。边缘层要尽量把这些波动挡住,不要让 MES 业务层直接受冲击。

所以边缘采集层不是“读几个点位”。

它更像 MES 和现场之间的翻译、缓冲和第一道质检。

二、不同设备,接法真的不一样

一个散热器工厂里,设备来源可能很杂。

比如:

  • 西门子 S7-1200 / S7-1500。
  • 三菱 MELSEC。
  • 欧姆龙 NX / CJ / CP 系列。
  • 台达、汇川等 PLC。
  • 自动锁螺丝机。
  • 风扇测试机。
  • 扫码枪。
  • 视觉检测设备。
  • 厂商专机。

西门子可能走 OPC UA,也可能通过 S7 通信读取开放 DB。

三菱常见 MC Protocol / SLMP,读 D、M、X、Y 这些软元件。

欧姆龙可能走 FINS/UDP、FINS/TCP,也可能通过 EtherNet/IP 或上位机转接。

台达、汇川常见 Modbus RTU / Modbus TCP。

测试机更灵活。有的主动推 TCP,有的写 CSV,有的提供 HTTP API,有的只能查本地数据库。

所以边缘层不能只抽象成一个 PLCClient

它至少要有一套设备接入模型:

device_code: 设备编号
vendor: Siemens / Mitsubishi / Omron / Delta / Inovance
protocol: OPC UA / S7 / SLMP / FINS / Modbus TCP / Socket / File
endpoint: IP、端口、站号、节点号
tag_address: DB 地址、D 寄存器、DM 区、Holding Register
data_type: bool / int16 / int32 / float / string
byte_order: ABCD / BADC / CDAB / DCBA
read_cycle: 采样周期
access_mode: read_only / read_write
business_usage: 运行状态 / 产量 / 报警 / 测试结果 / 工艺参数

这些字段看起来细,但现场就是靠这些细节活着。

三、点位表不是附件,是合同

我现在会把点位表当成软件和电气之间的合同。

一张能用的点位表,不应该只写:

D100 产量
M200 运行
M201 报警

这太容易出问题。

更好的写法应该接近这样:

设备:screw-01
点位:current_order_output
地址:D100
类型:int32
单位:pcs
含义:当前工单产量
清零规则:切换工单后 PLC 清零
采样周期:1s
存储策略:产量事件入业务库,实时值进 Redis
负责人:电气 / MES 双方确认

如果 D100 实际是设备生命周期累计产量,那 MES 就不能直接把它当成当前工单产量。要么让 PLC 提供当前工单计数,要么 MES 在工单开始时记录基准值,再用差值计算。

这个差别很小,但它决定看板准不准。

四、边缘层要处理“读到了,但不能直接用”的数据

现场数据经常不是读到就能用。

比如 Modbus 读到两个寄存器:

0x41B8 0x0000

这可能是一个 float,也可能是两个 int16。字节序不同,解析出来的值就完全不一样。

再比如温度点位读到 253,可能表示 253 摄氏度,也可能表示 25.3 摄氏度,因为设备侧用了 0.1 的缩放系数。

再比如报警点位不是一个 bool,而是一个报警码:

0: 正常
101: 气压不足
205: 扭矩超限
302: 急停

边缘层要把这些原始数据转成中心系统能理解的标准数据。

否则业务层会被各种设备细节拖乱。

五、本地缓存是现场系统的保险

车间网络不可能永远稳定。

边缘节点采到数据以后,如果中心消息队列不可用,或者网络断了,不能直接丢。

这些数据尤其要先落本地缓存:

  • 工序过站。
  • 测试结果。
  • 报警开始和恢复。
  • 产量计数变化。
  • 质量检测结果。

网络恢复后再补传。

补传时必须带唯一消息 ID 或业务唯一键,中心侧做幂等。否则断网十分钟恢复后,可能会出现重复过站、重复报警、重复产量。

这里真正要防的不是“网络断了”,而是网络恢复以后系统悄悄变脏。

六、边缘层最终要输出业务事件

不是所有点位变化都应该直接进业务库。

设备运行状态每秒变化一次,适合更新实时状态。

温度、压力、电流这类高频数据,适合进时序库。

测试完成、报警发生、工序过站,这类才是业务事件。

比如测试机输出:

SN: F202404210001
转速: 1850 rpm
电流: 0.18 A
噪音: 31 dB
结果: OK

中心系统真正需要的是:

event_type: test_completed
sn: F202404210001
work_order_no: WO2024042103
station_code: fan-test-02
device_code: tester-01
items:
  speed: 1850 rpm
  current: 0.18 A
  noise: 31 dB
result: OK
event_time: 2024-04-21 14:32:18

这样质量追溯、工序过站、看板刷新才能接上。

七、我会怎么落地第一版

如果是第一阶段,我不会一上来做复杂的边缘平台。

我会先做一个能跑的边缘 Agent:

  • 支持一到两种核心协议。
  • 点位配置从文件或数据库加载。
  • 关键数据本地持久化。
  • 上传中心消息队列。
  • 本地日志能查。
  • 有健康检查。
  • 支持重启后继续补传。

同时要求现场给出设备清单和点位表。

没有点位表,就不承诺数据准确。

这句话有点硬,但很重要。否则 MES 会替现场混乱背锅。

八、小结

边缘采集层做得好,MES 后面的业务模块才有可信数据。

它不是一个简单接口,而是现场复杂度的缓冲层。

它要懂协议,要尊重点位表,要处理字节序和缩放,要能断网缓存,要把原始数据变成业务事件。

这层如果做薄了,后面所有“实时看板”“质量追溯”“OEE 分析”都会变得不可靠。


本系列:

MES现场落地手记 第 3 篇 / 共 9 篇
查看专题目录

留下一条评论

暂无评论