EAP设备自动化:SECS/GEM协议从零到实战
EAP设备自动化:SECS/GEM协议从零到实战
1. 问题背景:为什么需要EAP?
我在FAB第一次接触EAP的时候,被一堆缩写搞晕了——MES、EAP、EDA、SECS、GEM……傻傻分不清。当时我以为EAP就是"设备辅助程序",后来才知道EAP(Equipment Automation Program,设备自动化程序)是半导体CIM系统中最接近设备底层的软件。 2017年我参与了一个8寸晶圆厂的智能化改造项目。改造前,设备操作全靠人工:工程师手动输入Recipe参数,用U盘拷贝程序,用手写记录生产数据。结果可想而知——参数输入错误率高达2.3%,每个月因为参数问题导致的良率损失超过80万元。 EAP上线后,这一切都变了。Recipe由MES自动下发,参数错误率降到了0.01%以下,每批次的生产数据自动采集上传。原来需要3个人管理的设备,现在1个人可以管6台。 这就是EAP的价值:把人工操作变成自动化,把信息孤岛变成数据闭环。 EAP在CIM架构中的位置非常重要。它上接MES,下接设备,是整个工厂自动化的"桥梁"。MES给EAP发指令,EAP翻译成设备能懂的语言,设备执行后再把状态数据传回MES。没有EAP,MES就是瞎子聋子。
2. 技术原理:SECS/GEM协议栈
EAP和设备之间的通信靠的是SECS/GEM协议。这套协议是半导体行业的国际标准(SEMI标准),所有主流半导体设备都支持。 SECS/GEM协议分为四层,从下往上: 第一层是物理层。早期用RS-232串口,现在主流是用TCP/IP网口。物理层管的是"怎么把比特从一个地方传到另一个地方",不考虑内容。 第二层是SECS-I/HSMS层。SECS-I是串口版本,HSMS是网口版本。这一层管的是"帧"的传输——把数据打包成帧,发送出去,接收确认。 第三层是SECS-II层。这一层定义消息格式。比如"发送Recipe参数"这个消息,S1F1是"Are you there?"(设备在线确认),S7F19是"Recipe Download Request"(Recipe下载请求)。每个消息都有唯一的编号,设备端和主机端都要严格按编号通信。 第四层是GEM(Generic Equipment Model)层。这一层定义了设备的状态模型和行为规范。比如:设备有"待机"、"运行"、"报警"等状态,状态转换要遵循GEM规范;设备发生异常时要主动上报(Event Report);主机可以远程控制设备(Remote Command)。 EAP软件就是SECS/GEM协议的主机端实现。它要:建立和维持与设备的连接;解析来自设备的SECS消息;把MES的指令翻译成SECS消息发送给设备;处理设备状态变化和报警;管理Recipe和其他配置文件。
3. 实战案例:Recipe下载故障排查
有一次凌晨3点,产线突然停了。MES显示Recipe下载失败,设备报警码E1003——"Recipe格式错误"。我被叫到现场,一看日志: S7F19(Recipe下载请求)发送后,设备返回S7F20(否定确认),错误码:0x0102(格式校验失败)。我第一反应是Recipe文件被破坏了,重新传了一次,结果还是一样。 后来仔细查日志,发现一个规律:只有特定型号的Recipe下载失败,其他的都正常。这意味着问题不在Recipe文件本身,而在文件内容和设备型号的匹配性上。 最后找到原因:那个型号的设备对PPARM(Process Parameter,工艺参数)顺序有严格要求,但MES下发的Recipe里,PPARM顺序和设备的DCP(Device Data Collection Parameter)定义不一致。设备端校验PPARM时发现顺序不对,直接拒绝了。 解决方案是修改MES端Recipe模板,把PPARM顺序调整正确。这个问题后来总结成一条经验:Recipe格式不只是"参数对不对",还包括"参数顺序、数据类型、单位、范围"是否符合设备规范。
4. 完整代码:SECS消息解析
下面是一个简化版的SECS-II消息解析代码,演示如何解析设备返回的Recipe下载响应:

import struct import socket class SECSGateway: def __init__(self, host, port): self.host = host self.port = port self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((host, port)) self.sock.settimeout(30) def send_message(self, header, body): # SECS-II消息格式:10字节头 + 变长body # 头格式:SessionID(2B) + Length(4B) + HeaderBlock(4B) length = len(body) + 4 header_bytes = struct.pack('>HHI', 0xFFFF, length, header) self.sock.sendall(header_bytes + body) def recv_message(self): # 先读10字节头 header = self.sock.recv(10) if len(header) < 10: raise ConnectionError("SECS header incomplete") session_id, msg_len, header_block = struct.unpack('>HHI', header) body = b'' if msg_len > 0: body = self.sock.recv(msg_len) return header_block, body def parse_equip_status(self, body): # 解析设备状态报告 (S1F3/S1F4类型) # SECS-II body是L(List)类型,第一项是设备状态 items = self._parse_secsiterm(body) status_map = { 0: '待机(Standby)', 1: '运行(Run)', 2: '报警(Alarm)', 3: '维护(Maintenance)', } if len(items) > 0: eq_status = items[0] return status_map.get(eq_status, f'未知({eq_status})') return '状态未知' def _parse_secsiterm(self, data): # 简化SECS-II数据解析:L=列表,B=字节,I4=4字节整数 results = [] i = 0 while i < len(data): fmt_byte = data[i]; i += 1 item_type = (fmt_byte >> 2) & 0x3F length_bytes = fmt_byte & 0x03 length = int.from_bytes(data[i:i+length_bytes], 'big'); i += length_bytes if item_type == 0: # List results.append(self._parse_secsiterm(data[i:i+length])) elif item_type == 1: # Binary results.append(data[i:i+length]) elif item_type == 34: # I4 (4-byte integer) results.append(int.from_bytes(data[i:i+length], 'big')) i += length return results def close(self): self.sock.close() # 使用示例 # gateway = SECSGateway('192.168.1.100', 5000) # try: # h, b = gateway.recv_message() # print(f'收到设备消息: {h:#010x}') # print(f'设备状态: {gateway.parse_equip_status(b)}') # finally: # gateway.close()
为什么要这样写? SECS协议解析的关键是理解数据格式。SECS-II用1字节表示数据类型和长度——高6位是类型,低2位是长度字节数。比如0x01代表List(列表),0x11代表1字节长度的列表。 实际项目中,强烈建议用现成的SECS库(如Python的pycomm3),不要自己从零写解析器。上面的代码只是演示原理,生产环境用pycomm3更可靠。
5. 效果对比:EAP上线前后数据
从图表可以看出:Recipe错误率从2.3%降到0.01%(降低99.6%),数据采集及时率从68%提升到99.5%,每月设备停机时间从45小时降到8小时,人工操作步骤从18步降到2步。效果非常显著。
6. 实施建议:避坑指南
实施EAP项目的几条核心经验: 第一,优先打通数据采集链路,再做控制指令。EAP最基础的功能是数据采集,把设备状态、工艺参数、报警信息实时采集上来,这是后续所有功能的基础。不要一上来就做Recipe下发、程序控制这些高级功能。 第二,设备端SECS实现要充分验证。很多设备的SECS实现不标准,遇到过设备报告的数据格式和文档不一致的情况。建议在EAP上线前,用协议分析仪抓包验证设备端的SECS实现是否符合标准。 第三,EAP和MES的接口设计要清晰。哪些指令由MES发起,哪些由EAP自主判断,两边的状态同步机制,报警处理流程,都要提前设计清楚。我在项目里吃过亏,接口模糊导致大量返工。 第四,要有设备仿真测试环境。用真实设备测试EAP成本高、风险大,建议先接入设备仿真器(SECS Simulator)验证EAP逻辑,再连真实设备。 第五,EAP日志要设计好。出问题时,日志是排查的唯一依据。日志要包含:时间戳、设备ID、SECS消息内容(十六进制)、处理结果、异常信息。日志量会很大,建议按设备ID和日期分目录存储。
7. 进阶方向:国产EAP的机遇
目前国内FAB的EAP系统主要还是用国外产品(应用材料、KLA、TEL等),价格贵,定制难,售后服务受制于人。国产EAP的机会在于: 本土化适配:国产EAP更懂国产设备的特点,可以提供更好的原生支持。 成本优势:同等功能下,国产EAP价格可以做到国外产品的1/3甚至更低。 快速响应:国内厂商的售后服务响应速度快,可以根据FAB的具体需求做定制开发。 但国产EAP也面临挑战:设备兼容性(特别是新设备型号)、协议的完整支持(GEM 300等新标准)、稳定性验证。FAB对稳定性要求极高,切换成本很大。 AI方向:未来EAP可能会引入AI能力,比如基于历史数据预测设备故障,自动优化Recipe参数,智能诊断SECS通信异常等。目前已有厂商在探索,但成熟度还不够。
📝 发布后复制到评论区: 🔴 【评论区互动】 问题1:你们厂的EAP是哪家的?用过国产EAP吗?体验如何? 问题2:你在SECS通信中踩过什么坑?有没有遇到过设备端实现不符合标准的情况?





