一、为什么我必须自己搭EAP?
去年车间新进一台刻蚀机,设备厂商配的EAP报价38万,还只支持3个事件上报。我一看需求——至少要对接12个事件、5个远程命令、还要实时采集FDC数据。找厂商定制?加20万,还要等3个月。
最后我花了2周用Python从零搭了一套,跑到现在零故障。这篇文章把我踩过的坑、调通的代码全部整理出来,希望帮同行省下这几十万。
二、EAP到底是什么?5分钟搞懂架构
EAP(Equipment Automation Program)是半导体设备与MES之间的桥梁。简单说,它做三件事:
1. 让设备'开口说话'——把设备状态、报警、事件上报给MES
2. 让MES'远程指挥'——远程下发配方、控制设备执行
3. 让数据'自动流动'——实时采集过程数据(FDC)送分析系统
层级 | 协议 | 作用 | 传输方式 |
L1 | SECS-I | 定义消息帧格式 | 串口(RS232) |
L2 | SECS-II | 定义消息语义(数据项) | 独立于传输层 |
L3 | HSMS | TCP/IP高速传输 | 网口(以太网) |
L4 | GEM | 设备行为模型(状态机) | 应用层规范 |
三、环境准备与HSMS连接
我用的是secsgem Python库,这是目前最成熟的开源SECS/GEM实现。安装很简单:
pip install secsgem
HSMS被动模式连接(设备端主动连EAP):
import secsgem
import logging
logging.basicConfig(level=logging.INFO)
# HSMS配置 - 被动模式(EAP作为服务端)
hsms_settings = secsgem.HsmsSettings(
address="0.0.0.0", # 监听所有网卡
port=5000, # HSMS默认端口
connect_mode=secsgem.HsmsConnectMode.PASSIVE,
device_id=0,
name="EAP-Server"
)
handler = secsgem.HsmsHandler(hsms_settings)
handler.enable()
print("EAP HSMS服务端已启动,等待设备连接...")
四、SECS消息处理:核心通信逻辑
EAP的'大脑'是消息分发器,按Stream/Function路由到对应的Handler。以下是完整的消息处理框架:
class EAPMessageHandler:
"""SECS消息路由处理器"""
def __init__(self):
self.handlers = {
(1, 1): self.on_alarm_report, # S1F1 报警上报
(1, 13): self.on_establish_comm, # S1F13 建立通信
(2, 33): self.on_link_event, # S2F33 事件定义
(2, 41): self.on_remote_command, # S2F41 远程命令
(5, 1): self.on_exception_report, # S5F1 异常上报
(6, 11): self.on_event_report, # S6F11 事件上报
}
def dispatch(self, stream, function, data):
key = (stream, function)
handler = self.handlers.get(key, self.on_unknown)
return handler(data)
def on_event_report(self, data):
# S6F11 事件上报 - 最核心的消息
ceid = data.get("CEID", 0)
reports = data.get("RPT", [])
print(f"[事件] CEID={ceid}, 数据项={len(reports)}")
self.forward_to_mes(ceid, reports)
return {"ack": 0} # S6F12 确认
def forward_to_mes(self, ceid, reports):
# 转发到MES系统
mes_payload = {
"equipment_id": self.equip_id,
"event_id": ceid,
"timestamp": datetime.now().isoformat(),
"data": reports
}
self.mes_client.send(mes_payload)
五、GEM状态模型实现
GEM定义了设备控制状态机,EAP必须正确处理状态转换。以下是关键状态的Python实现:
状态 | 代码 | 说明 |
EQUIPMENT_OFFLINE | 1 | 设备离线,未建立通信 |
ATTEMPT_ONLINE | 2 | 尝试上线中 |
HOST_OFFLINE | 3 | 主机离线 |
ONLINE_LOCAL | 4 | 在线-本地模式 |
ONLINE_REMOTE | 5 | 在线-远程模式(目标状态) |
class GEMStateManager:
"""GEM状态机管理"""
VALID_TRANSITIONS = {
"EQUIPMENT_OFFLINE": ["ATTEMPT_ONLINE"],
"ATTEMPT_ONLINE": ["ONLINE_LOCAL", "ONLINE_REMOTE",
"EQUIPMENT_OFFLINE"],
"ONLINE_LOCAL": ["ONLINE_REMOTE", "EQUIPMENT_OFFLINE"],
"ONLINE_REMOTE": ["ONLINE_LOCAL", "EQUIPMENT_OFFLINE"],
}
def __init__(self):
self.current = "EQUIPMENT_OFFLINE"
def transition(self, target):
valid = self.VALID_TRANSITIONS.get(self.current, [])
if target not in valid:
raise ValueError(
f"非法转换: {self.current} -> {target}")
old = self.current
self.current = target
print(f"[状态] {old} -> {target}")
return True
六、踩坑记录:这5个问题卡了我最久
问题 | 原因 | 解决方案 | 耗时 |
连接建立后30秒断开 | HSMS Linktest超时 | 每25秒主动发Linktest(S1F1) | 2天 |
S6F11偶发丢事件 | 未发S6F12确认 | 每个S6F11必须回S6F12 | 1天 |
中文报警码乱码 | SECS-II字符串编码 | 强制指定JIS-8编码 | 3天 |
设备重启后重连失败 | Session ID未重置 | 重连时清除原有session | 1天 |
多设备并发崩溃 | 全局变量共享 | 每设备独立handler实例 | 2天 |
七、完整系统部署与效果
把所有模块整合起来,一个完整的EAP系统就成型了:
• 支持HSMS被动/主动双模式连接
• 完整的SECS消息路由(S1/S2/S5/S6)
• GEM状态机管理
• 事件实时上报到MES
• 远程命令下发与确认
上线后效果:设备通信建立时间从人工30分钟缩短到自动15秒,事件上报准确率从92%提升到99.97%,远程控制成功率99.5%以上。
写在最后
搭建EAP最难的不是代码,是理解SECS/GEM协议的那堆文档。我刚开始也被几千页的spec吓到,但其实核心就那么几个消息。先把S1F13(建立通信)、S6F11(事件上报)、S2F41(远程命令)这3个跑通,80%的场景就覆盖了。
---
更多半导体实战工具,欢迎访问我的VIP资源区:SPC控制图工具、CPK计算器、FDC规则模板等,帮你快速落地!
你在搭EAP时遇到过什么坑?欢迎评论区交流,我会一一回复!
标签:#半导体 #EAP #SECS_GEM #设备自动化 #Python #智能制造