4、设备联机与数据采集:SECS/GEM协议应用、PLC数据采集、MES系统对接,打通设备信息孤岛。

各位工程师朋友,这一章咱们聊聊设备联机。说白了,就是让产线上的设备开口说话,把数据吐出来。

我在通富微电的产线上见过太多「聋哑设备」了。一台进口的贴片机,性能很好,但数据全靠操作员手抄。每天下班前,班长拿着本子一台一台去记产量、记报警次数。你想想看,这效率能高吗?

打通信息孤岛,核心就三件事:SECS/GEM协议、PLC数据采集、MES系统对接。咱们一个一个说。

4.1 SECS/GEM协议:半导体设备的通用语言

SECS/GEM,这是半导体行业的标配协议。我刚开始接触时也觉得头大,后来发现它其实不复杂。

SECS(SEMI Equipment Communications Standard)定义了设备与主机之间的通信格式。GEM(Generic Equipment Model)则定义了设备的行为模型。两者配合,就能实现设备状态上报、配方管理、报警处理等功能。

核心要点:SECS/GEM不是一种协议,而是一套标准。它基于TCP/IP或RS-232传输,消息格式采用SECS-II编码。

我在项目中遇到过一台老旧的ASM固晶机,原厂说只支持SECS-I(RS-232版本)。结果我们改造时发现,它的串口线被老鼠咬断了。嗯,后来我们加了个串口转以太网模块,才把数据接上来。

4.1.1 消息结构

SECS消息由Header和Body组成。Header固定10个字节,包含消息ID、设备ID、流号等功能码。Body则是SECS-II格式的数据项。

// SECS消息示例(十六进制)
// Header: 01 00 00 00 01 02 00 00 00 01
// Body: 41 42 43 (ASCII "ABC")

// 解析后:
// 设备ID: 1
// 流号: 2
// 功能码: 1
// 数据: "ABC"

说白了,设备发一条消息,主机回一条确认。就这么简单的一问一答,构成了整个通信基础。

4.1.2 状态机管理

GEM定义了设备的几种状态:INIT、READY、EXECUTING、IDLE等。设备必须在这些状态间切换,并上报给MES。

状态 含义 触发条件
INIT 初始化中 设备上电
READY 待机就绪 初始化完成
EXECUTING 正在运行 收到启动指令
IDLE 空闲暂停 手动暂停或报警

实战技巧:我建议在设备联机调试时,先验证状态机切换是否正常。曾经有一次,设备上报的状态一直是INIT,查了半天发现是初始化脚本里少写了一条确认指令。

4.2 PLC数据采集:从底层抓取实时数据

不是所有设备都支持SECS/GEM。很多国产设备、老设备,只有PLC接口。这时候就得靠PLC数据采集了。

PLC采集的核心是寄存器读写。你需要知道设备的PLC型号、通信协议(Modbus TCP、Profinet、EtherCAT等),以及每个数据点对应的寄存器地址。

4.2.1 采集架构

我常用的架构是:PLC → 工业网关 → 数据服务器 → MES。工业网关负责协议转换,把PLC的原始数据转成标准格式(JSON或XML),再推送到上层系统。

// Modbus TCP读取示例(Python)
import pymodbus.client as ModbusClient

client = ModbusClient("192.168.1.100", port=502)
# 读取保持寄存器,地址0x0000,长度10
result = client.read_holding_registers(0x0000, 10, unit=1)
if result.isError():
    print("读取失败")
else:
    print(f"当前产量: {result.registers[0]}")
    print(f"设备温度: {result.registers[1] / 10.0}°C")

注意:PLC采集频率不要太高。我曾经把采集间隔设成100ms,结果把PLC的CPU跑满了,设备直接死机。建议生产数据1秒采集一次,报警数据可以实时触发。

4.2.2 数据清洗与缓存

PLC采集上来的数据,往往有噪声。比如传感器抖动导致数值跳变,或者通信中断导致数据缺失。

我的做法是:在工业网关上做一层数据清洗。用滑动平均滤波处理模拟量,用状态机过滤数字量的毛刺。清洗后的数据再写入本地缓存(SQLite或Redis),防止网络中断丢数据。

4.3 MES系统对接:让数据流动起来

数据采集上来,最终要喂给MES。MES是产线的大脑,它需要知道每台设备的实时状态、产量、良率、报警信息。

对接方式主要有两种:API接口数据库直连

4.3.1 API接口对接

这是最推荐的方式。MES提供RESTful API,设备端或数据采集系统定时调用API上报数据。

// 上报设备状态到MES(JSON格式)
{
  "deviceId": "DB-001",
  "timestamp": "2025-03-15 14:30:00",
  "status": "RUNNING",
  "productionCount": 1250,
  "defectCount": 3,
  "temperature": 25.6,
  "alarmCode": null
}

我建议采用批量上报的方式。比如每5分钟上报一次,把5分钟内的所有数据打包成一个数组。这样可以减少API调用次数,降低MES服务器的压力。

4.3.2 数据库直连

有些老旧的MES系统没有API接口,只能直接读写数据库。这种方式风险较高,我不太推荐。

如果非要用,记住几个原则:

  • 只读不写,或者只写特定的接口表
  • 使用数据库连接池,避免频繁建立连接
  • 加一个中间层,不要直接操作MES的业务表

避坑指南:我曾经直接写MES的订单表,结果写错了字段,导致整个批次的产品被标记为报废。从那以后,我再也不敢直接操作MES的业务表了。老老实实加一个接口表,让MES自己去读。

4.4 打通信息孤岛的整体架构

说了这么多,咱们把整个架构串起来。一个典型的产线数据采集系统,分为四层:

  1. 设备层:贴片机、固晶机、焊线机等,支持SECS/GEM或PLC接口
  2. 采集层:工业网关、数据采集卡,负责协议转换和数据清洗
  3. 数据层:实时数据库(InfluxDB)和历史数据库(MySQL/PostgreSQL)
  4. 应用层:MES系统、看板系统、报表系统

数据流向是:设备 → 采集层 → 数据层 → 应用层。反过来,MES也可以下发指令到设备,比如切换配方、启动停止。

嗯,这里要注意一点:数据一致性。设备上报的数据和MES记录的数据必须一致。我建议在采集层加一个数据校验机制,比如对每条数据计算CRC校验码,MES收到后校验,不一致就要求重发。

个人经验:我在通富微电的一条焊线产线上,用了三台工业网关,分别采集不同品牌的设备。一开始数据总是对不上,后来发现是各台网关的时钟不同步。加了个NTP时间同步服务,问题就解决了。你想想看,时间戳都不一致,数据怎么可能对得上?

最后说一句,打通信息孤岛不是一蹴而就的事。我建议先选一条产线做试点,跑通后再推广。别想着一步到位,那容易翻车。