FAB环境SECS/GEM数据采集架构实战:从RS232串口到HSMS高速通讯的演进 一、问题背景当连不上成为产能的隐形杀手2021年初我接手这个项目时产线有三百多台设备自动化覆盖率却低得离谱。设备通讯几乎全靠RS232串口线直连工控机所谓采集就是每台机器接一根串口线跑一个Python脚本轮询。当时我们统计过一个触目惊心的数字全厂设备平均联机率只有50%左右——也就是说任意时刻都有近一半的设备在掉线、假死或数据错乱根本无法被MES调度和追溯。问题体现在几个具体的痛点上。第一串口物理层极不稳定线材老化、接触不良是家常便饭一台设备一天掉线五六次是常态第二不同设备厂商的波特率、校验位、停止位配置五花八门光是适配就耗掉大量人力第三所有脚本都用多线程轮询同一个串口线程互相抢占导致数据错包、漏采第四也是最致命的点对点的采集模式让数据滞后再加上MES那一层的处理端到端延迟普遍在3秒以上工艺异常根本来不及拦截。我印象最深的是一次光刻机批次异常。因为串口掉线那台设备的曝光参数在MES侧消失了四十多分钟等我们人工点检发现时已经有一批晶圆走了错误配方。这件事直接把自动化改造推上了优先级最高的位置。我当时的结论很明确RS232这条路走到头了必须换架构、换协议、换通讯范式。二、技术原理先把SECS/GEM这套黑话讲清楚要动手改造得先搞懂设备到底在说什么话。半导体设备通讯有一套行业标准叫SECS/GEM由SEMI国际半导体产业协会制定。它其实拆成了几层SECS-I负责RS232串口时代的物理层和传输层SECS-II定义消息内容也就是SxFy这套报文格式比如S1F3是配方请求、S6F11是事件上报而GEMGeneric Equipment Model则是建立在SECS之上的行为模型它用一套状态机约束设备应该怎么响应上位机。GEM状态机是我后来反复啃的重点核心分三类状态。通信状态机Communication StateDISABLED通讯禁用到ENABLED启用再到COMMUNICATING已建立通讯控制状态机Control StateOFFLINE离线设备不响应工艺指令和ONLINE在线ONLINE下又分LOCAL本地手动和REMOTE远程受控还有工艺状态机描述设备在做哪道工序。理解这套状态机你才知道什么时候该发Select.req去握手什么时候设备处于OFFLINE就该停止下发指令——很多掉线事故本质就是没尊重设备的状态反馈。真正让我眼前一亮的是HSMSHigh-Speed SECS Message Services。它把SECS-II的消息承载从RS232串口搬到了TCP/IP网络上定义了HSMS-SSSingle Session单会话被动连接等模式。一句话设备不再是接一根串口线而是开一个TCP端口EAPEquipment Automation Program设备自动化程序作为客户端连上去。这一换带宽、并发、稳定性全部质变。EAP在这里扮演翻译官和守门员向下用SECS/GEM和每台设备对话向上把数据按MES需要的格式工单、批次、参数、事件推过去同时把MES的指令翻译回设备能懂的SxFy报文。所以从架构视角看数据流向是一条清晰的链设备Equipment→ 设备控制器Controller→ 通讯层RS232或HSMS-SS→ EAP网关SECS/GEM状态机→ MES与实时数据库SPC、追溯、OEE。下面这张架构图就是我改造后落地的真实拓扑。图1 FAB环境SECS/GEM数据采集架构图设备→EAP→MES三、实战案例50%到98%我是怎么把联机率翻上来的2021年第二季度我带着两个同事启动改造。第一步是诊断我们拉出全部掉线日志发现50%联机率背后的根因集中在五类线材与接触不良物理层、波特率/校验位配置漂移、超时设置过大导致假死无人感知、多线程抢占串口造成错包、以及部分老设备厂商的GEM实现根本不标准比如明确该回S1F2的它回了个空包。诊断清楚后我定了一个原则能上HSMS-SS的设备全部上HSMS实在只有串口的用串口服务器串口转TCP网关把它也接到同一个EAP框架里从物理上统一入口。第二步是重写通讯框架。我抛弃了原来每人一台机器一个轮询脚本的散装模式做了一套基于事件驱动的EAP网关每台设备一个独立TCP会话线程接收走select事件驱动而非sleep轮询统一的GEM状态机管理OFFLINE/ONLINE/REMOTE独立的心跳定时器Linktest检测掉线30秒无响应立即标记异常并告警而不是像以前那样傻等超时。对那批只支持串口的老设备我们用MOXA串口服务器把它转成TCP代码层完全复用HSMS会话模型物理差异被屏蔽在底层。第三步是灰度推广。我没有一次性全切而是先挑了一条最乱的刻蚀段12台设备做试点跑满两周稳定后再扩展到CVD、量测最后是光刻机这种高价值设备。每扩一类设备我都先建POC把该厂家的GEM实现摸透——比如某日系光刻机的S1F3配方字段顺序和文档完全相反这种坑必须单台验证。整个推广周期约五个月。结果超出预期。全厂平均联机率从50%提升到98%掉线时长中位数从每天累计近两小时降到不足十分钟端到端采集延迟从3秒降到200毫秒工艺异常第一次能做到秒级拦截因为数据完整了SPC的工序能力指数Cpk统计终于可信OEE报表也从拍脑袋变成看实时数据。最让我有成就感的是那台曾经消失过配方参数的光刻机后来成了全厂最稳定的节点之一。四、完整代码一个最小可用的HSMS-SS会话实现下面是我EAP网关里HSMS-SS被动连接会话的核心骨架脱敏后约60行覆盖了握手、超时、心跳、报文解析四件最关键的事。请注意这是教学级最小实现生产环境还要补ACK超时重传、会话池、日志与告警。# -*- coding: utf-8 -*-import socket, threading, struct, queue, timeclass HsmsSession(threading.Thread):每台设备一个独立 TCP 会话取代 RS232 的抢串口模式def __init__(self, sock, addr, timeout5):super().__init__(daemonTrue)self.sock sockself.addr addrself.timeout timeout # 超时设置避免 RS232 时代无限阻塞self.state OFFLINE # GEM 控制状态机OFFLINE/ONLINE/REMOTEself.alive Trueself._hb time.time()self.queue queue.Queue()def _recv_n(self, n):buf bself.sock.settimeout(self.timeout)while len(buf) n:chunk self.sock.recv(n - len(buf))if not chunk:return Nonebuf chunkreturn bufdef _recv_msg(self):# HSMS 头部固定 10 字节长度(4B)会话ID(2B)头部(1B)类型(1B)系统字节(4B)hdr self._recv_n(10)if not hdr:return Nonelength struct.unpack(I, hdr[:4])[0]body self._recv_n(length) if length else breturn hdr bodydef run(self):# 单连接单线程 事件驱动超时交给心跳定时器不阻塞接收while self.alive:try:msg self._recv_msg()except socket.timeout:if time.time() - self._hb 30: # 30s 无心跳即判掉线self.alive Falsecontinueif msg is None:breakself._handle(msg)self.sock.close()def _handle(self, msg):mtype msg[6]if mtype 1: # Select.req建立通讯状态self.state ONLINEself._send(self._build(5, msg[4:8]))elif mtype 6: # Data Message解析 S6F11 等事件上报self._on_data(msg[10:])def _on_data(self, body):self.queue.put(body) # 推入上报队列由采集线程批量落库def _send(self, data):try:self.sock.sendall(data)except OSError:self.alive Falsestaticmethoddef _build(flag, sysbytes):return struct.pack(I, 4) b\x00\x00 bytes([flag, 0]) sysbytes为什么这样写我挑三个最关键的决定解释。其一用每台设备一个独立会话线程取代原来的多线程轮询同一串口是从根上消灭了并发抢端口导致的错包——这是联机率从50%爬起来的第一功臣。其二超时与心跳分离接收循环只负责读掉线判断交给30秒心跳定时器这样即便对端假死也不会让接收线程永久阻塞系统能快速感知异常。其三HSMS头部固定10字节、长度字段在前所以我先收10字节再按长度收正文这个定长头变长体的解析方式能正确处理粘包和半包比RS232按行分隔要可靠得多。这段代码跑在我们网关里单机能稳定维持两百个以上并发会话是RS232时代想都不敢想的。五、效果对比RS232与HSMS-SS到底差在哪光说变好了不够我把改造前后的关键指标拉了一张多维度的对比表。数据来自我们产线改造前后的实测均值部分并发、建链指标是实验室压测结果用于说明范式差异。对比维度RS232 串口时代HSMS-SS 高速通讯提升幅度设备平均联机率50%98%接近翻倍平均采集延迟3000 ms200 ms约 15 倍峰值延迟5200 ms350 ms约 15 倍单节点最大并发会话1独占串口200数量级提升连接建立耗时800 ms60 ms约 13 倍日累计掉线时长近 2 小时不足 10 分钟约 12 倍数据完整率追溯约 78%99.5%显著改善运维人力点检2 人/班0.3 人/班大幅下降从这张表能看出HSMS带来的不只是快更是一整套可运维性的跃迁。延迟从3秒降到200毫秒意味着工艺异常可以在晶圆流转到下一站之前就被拦截这是质量防呆的本质区别。并发从一串口一设备到单节点两百会话直接让我们可以用少量网关服务器接管全厂TCO大幅下降。而数据完整率冲到99.5%才让下游的SPC、OEE、批次追溯真正有了可信的数据底座。下面这张柱状图把延迟、并发、建链三项最直观的差距画了出来。图2 RS232 与 HSMS-SS 通讯性能对比延迟/并发/建链六、实施建议分阶段推进但别低估这几类风险如果你也想做类似改造我强烈建议分阶段不要学我早期那种热血式全切的冲动。第一阶段是评估与POC盘点全厂设备通讯接口把支持HSMS-SS的、只支持SECS-I串口的、以及完全私有协议的分别归类挑2~3台典型设备做连通性验证把每家厂商GEM实现的方言摸清楚这一步能避免后期90%的返工。第二阶段是单线试点选一条最乱的工艺段跑满两周验证联机率、延迟、掉线恢复是否达标同时把告警和运维流程跑顺。第三阶段才是全厂推广按设备类型分批切每批留回滚预案。风险方面我踩过的坑你得提前防。第一协议不兼容不同厂商、甚至同厂商不同型号对GEM标准的实现都有差异有的S1F3字段顺序反了、有的事件ID自定义必须单台验证妄想一份配置通吃全厂一定会翻车。第二超时与心跳设置超时太长会假死无人知太短又会误杀正常波动心跳间隔要结合设备回复习惯调参我们最终定的30秒是压了一两个月才稳定的值。第三多线程并发哪怕切了HSMS网关侧会话池、队列、重传也要设计好否则高并发下照样错包。第四网络隔离与安全HSMS走TCP设备网和办公网必须做隔离曾有一次误把设备网桥接到办公网导致广播风暴教训深刻。第五人员技能SECS/GEM这套黑话门槛不低团队至少要有人能读懂SxFy报文否则出了怪问题谁都看不懂。七、进阶方向这套架构的边界与未来说实话即便做到98%联机率我现在也清楚这套架构的边界在哪里。它最大的局限是被动采集数据字段、配方映射、事件定义基本还是靠人工逐台配置设备一换型号就得重新适配GEM标准本身也覆盖不了所有高带宽的trace数据比如一台量测设备每秒产生的海量波形靠S6F11一条条上报会把网络打爆。另外状态机虽然规范但各厂商的自由发挥让自动化难以完全标准化。未来的方向我认为有三个。一是EDAEquipment Data Acquisition即Interface A它绕开GEM、用HTTP/XML直接把设备内部的高密度数据按需拉取专门解决海量trace数据的采集我们正在试点用它接管量测段。二是云边协同与AI把采集上来的数据在边缘侧做实时SPC和异常检测再上云做跨厂的大数据和数字孪生这块和现在流行的半导体AI质检、预测性维护天然契合。三是标准融合OPC UA over TSN等 newer 工业标准正在向半导体渗透未来也许设备通讯会统一到更现代的框架上。但无论怎么演进SECS/GEM这套设备语言学沉淀下来的状态机思想仍是理解半导体自动化的地基——先把今天的RS232换成HSMS把联机率做扎实再谈那些花哨的未来才是一个工程师该有的节奏。写在最后聊聊你所在的工厂现在设备通讯是RS232还是已经上了HSMS联机率卡在多少遇到过最离谱的厂商GEM方言是什么欢迎在评论区聊聊你的踩坑经历我能答的都会回。如果这篇对你有帮助点个赞和收藏后面我还会写EDA/Interface A海量trace数据采集的实战以及EAP网关高并发设计的细节。本文作者叶知晖 | 博客主页blog.csdn.net/yeflashzhihui | 转载请注明出处。

本月热点