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 打通信息孤岛的整体架构
说了这么多,咱们把整个架构串起来。一个典型的产线数据采集系统,分为四层:
- 设备层:贴片机、固晶机、焊线机等,支持SECS/GEM或PLC接口
- 采集层:工业网关、数据采集卡,负责协议转换和数据清洗
- 数据层:实时数据库(InfluxDB)和历史数据库(MySQL/PostgreSQL)
- 应用层:MES系统、看板系统、报表系统
数据流向是:设备 → 采集层 → 数据层 → 应用层。反过来,MES也可以下发指令到设备,比如切换配方、启动停止。
嗯,这里要注意一点:数据一致性。设备上报的数据和MES记录的数据必须一致。我建议在采集层加一个数据校验机制,比如对每条数据计算CRC校验码,MES收到后校验,不一致就要求重发。
个人经验:我在通富微电的一条焊线产线上,用了三台工业网关,分别采集不同品牌的设备。一开始数据总是对不上,后来发现是各台网关的时钟不同步。加了个NTP时间同步服务,问题就解决了。你想想看,时间戳都不一致,数据怎么可能对得上?
最后说一句,打通信息孤岛不是一蹴而就的事。我建议先选一条产线做试点,跑通后再推广。别想着一步到位,那容易翻车。