MES 与设备对接:四种接口的选型与踩坑记录
背景:产线设备为什么难对接
MES 要管住产线,得先把设备数据收上来:报工、SN 绑定、检测结果、UPH 统计。设备五花八门,本文按四种主流方式讲清选型逻辑,附真实踩坑记录。
解决思路:按设备能力分层
对接方式不是越高级越好,而是设备能力说了算:
- 有工控上位机、能跑 HTTP → 优先 HTTP/JSON,成本最低、最好排查;
- PLC 且支持 OPC UA → OPC UA,标准化、自带语义模型,老协议(Modbus TCP)可用网关转换;
- 扫码枪等简单外设 → 串口/网络端口直接解析条码流;
- 实在没接口的老设备 → 数据库直读兜底,但必须用中间表隔离。
实现一:HTTP 接口
报文约定 JSON。关键设计:接口幂等,设备重试不会产生重复数据;超时短、重试带退避,避免 MES 抖动时请求被打爆。
POST /api/device/report
{
"deviceCode": "CAK24080078",
"eventType": "productionCheck",
"sn": "SN20260821-001",
"result": "OK",
"time": "2026-08-21 09:30:00"
}
用 deviceCode + eventType + time 做幂等键,重复上报返回成功不落库。对接前定死三件事:字段 camelCase、时间 yyyy-MM-dd HH:mm:ss、错误码语义(2xx 收下、4xx 请求错、5xx 服务端错)。
实现二:OPC UA
适合点位多、有语义模型的 PLC,用订阅而非轮询,采样间隔按工艺设,100ms~1s 足够。最大的坑是证书:首次连接要把服务端证书加入信任列表,否则报 BadSecurityChecksFailed/BadCertificateUntrusted。测试环境设 None 能通,现场务必 SignAndEncrypt + 正式证书。
实现三:扫码枪
走串口(COM)或网络端口,条码以回车结尾。注意 \r、\n 都要处理,部分枪带 STX 前缀。关键是按行读取 + 超时保护,防止乱码塞满缓冲区。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
while True:
line = ser.readline().decode('ascii', errors='ignore').strip()
if line:
print('条码:', line)
实现四:数据库直读
设备把数据写进中间表(如 Device_Report_Queue),MES 用作业定期拉取。两条铁律:绝不让设备直连业务表;中间表带处理状态位和上报时间。这只是过渡,长期仍要推动设备上标准接口。
踩坑记录:四个真实案例
- 「unsupported protocol scheme」不是网络问题:工控机日志狂报
Post "/api/...": unsupported protocol scheme ""。这是 Go 客户端的报错,根因是配置里 MES 地址没加载对——要么 section 被enable=false禁用导致地址为空,要么缺http://前缀,要么值带引号。排查顺序:找配置文件 → 核对地址 → 对齐实际读取的 section → 重启看日志。 - 设备时钟不同步,追溯时间全乱:上报时间比 MES 早几分钟,排序错乱。让工控机统一 NTP 校时即可。
- GBK 与 UTF-8 乱码:老上位机用 GBK 编码中文,MES 按 UTF-8 解析全乱码。约定传输一律 UTF-8。
- 断网重连后重复上报:积压报文全部重发,表数据翻倍。加流水号唯一约束解决。
总结
设备对接的本质是定协议、控边界、留后路:协议按设备能力选型,HTTP 优先;幂等、超时、编码、时钟细节提前定死;出问题先怀疑配置再看代码。记牢这四点,新设备上线基本一稿过。