简介:半导体SECS/GEM协议是半导体制造设备与MES系统之间的通用通信标准,面向设备软件开发与MES集成测试人员,用于实现设备状态采集、远程指令下发等自动化交互。压缩包内是一套基于C#的SECS/GEM通信演示项目,包含完整的Visual Studio解决方案和HSMS通信模块,可以直接打开工程查看消息封装、连接管理及GEM行为模型的具体实现。共72个文件,以C#源码、项目配置、DLL/EXE、JSON配置及PDB调试符号为主,整体仅296KB,结构紧凑,适合作为二次开发参考。目前已有596人学习下载,说明其实践参考价值较高。通过阅读并运行示例程序,可以快速掌握设备与主机间的握手、数据上报和命令响应流程,减少从零理解标准的时间,并得到可直接落地的代码骨架。
1. 先搞清楚SECS/GEM到底在解决什么问题
做半导体设备的朋友一定有这种感受:设备端到工厂系统之间的通信,看起来是简单的数据收发,实际做起来却极其痛苦。不同设备厂商定义的数据格式不一样,同一厂商不同型号的机器也可能自成一套,今天接一台光刻机写一套通信代码,明天接一台刻蚀机又要重写一套,稍微有点规模的前道厂里躺着几百台设备,光是做设备联网的数据打通就能让IT团队崩溃。
SECS/GEM就是用来终结这种混乱状态的。它是一套由SEMI组织制定的半导体设备通信标准,核心目标是让设备与上位系统(MES、SPC、RMS等)之间有一个统一、标准、可扩展的对话方式。这套协议从上世纪80年代开始逐步成型,经历了SECS-I串口时代、SECS-II消息格式标准化、HSMS以太网传输普及、GEM行为模型统一这四个阶段,到今天已经成为半导体工厂设备自动化的事实标准。
很多人第一次接触SECS/GEM的时候,会被它一整套抽象概念搞晕——状态机、资源模型、收集事件、报警管理、远程命令、变量映射……这些术语堆在一起,看着就不像一个能快速上手的协议。但实际上它的设计思路非常贴近工厂现场的痛点:设备要能告诉系统“我现在在工作还是待机”“这批产品加工完成了吗”“刚才那个报警是什么原因”,系统要能告诉设备“开始生产”“暂停”“把某个参数改成20”,这些问题听上去简单,但在几十上百种设备形态面前,如果没有一套约束框架,实现起来就是一片混乱。
这篇文章想做的事情,就是把SECS/GEM这套协议按照“它为什么要这么做、实际怎么做、会踩什么坑”的逻辑理清楚,让准备入门的工程师、刚接手工厂自动化项目的技术人员、甚至是设备厂商里需要对接上位系统的软件工程师,都能用最短的时间建立起一个完整的认知框架。内容不追求把每个细节都堆上去,但关键路径必须讲透。
2. 从物理层到消息层的三层协议栈
2.1 传输方式的迭代:从串口到以太网
SECS/GEM不是一个单一协议,而是一个协议族。最底层解决的是“数据怎么传过去”的问题。这对应两个具体标准:SECS-I和HSMS。
SECS-I走的是RS-232串口,速率低、距离近、一对一连接,早期半导体工厂里设备密度低,串口勉强能用。但现在一套先进产线里的设备规模动不动几百台,数据量也远不是当年那种简单状态上报能比的,SECS-I基本已经退出实际应用。取而代之的是HSMS(High-Speed SECS Message Services),走TCP/IP以太网,典型的端口是5000。HSMS本质上是把SECS消息封装成TCP包,通过主动连接或被动连接两种模式建立通信链路。
对接HSMS的设备厂商一般会在设备的Ethernet接口上开放一个固定端口,主机(Host)侧作为客户端主动去连接设备端。这里有个最初的坑:有些设备端的连接策略很保守,比如同一时间只接受一个主机连接,如果工厂里有人开了个调试工具连着设备,正式的生产系统就连不进去;有些设备则要求主机侧先发特定的握手消息(Select Request),之后才开始正常的消息交换。
2.2 消息内容的结构:SECS-II的标准消息
数据传过去了,接下来要解决的是“传过去的内容是什么格式”。SECS-II定义了一套标准化的消息结构,这是SECS/GEM里最重要的部分。
它的消息体用“Stream(流) + Function(功能)”来编号,比如S1F1就是“询问设备是否在线”,S1F13是“建立通信”,S6F11是“事件上报”,S2F17是“请求读取变量”。每个编号都有明确的语义和消息体数据结构。SECS-II里的数据类型包括Binary、Boolean、ASCII、U2/U4/I2/I4/F4/A等,所有数据都用一个字节的格式码开头,加上字节长度描述。这套设计让消息在跨平台、跨语言的环境下都能被准确解析,不会出现大小端不一致、字符串编码混乱之类的经典网络编程问题。
在SECS-II之上,GEM标准进一步约定了一套设备行为模型:设备必须有通信状态(DISABLED、INITIATED、COMMUNICATING等)、控制状态(OFFLINE、ONLINE-LOCAL、ONLINE-REMOTE)、处理状态(READY、EXECUTING、IDLE等)、还有报警模型(报警产生、报警清除)、事件模型(定义事件、事件上报)、以及远程命令和配方管理的基本框架。这些约定把设备端的行为模式框得非常具体,避免了不同设备商实现出来的协议行为五花八门。
3. 设备模型与状态机:GEM让设备行为有了统一预期
3.1 三大状态模型的联动逻辑
GEM标准最核心的内容不在消息定义,而在行为模型。没有GEM的时候,SECS-II只是定义了一套通信格式,但每个设备根据自身习惯在什么时机发什么消息、收到什么消息后做什么反应,都是自由发挥。这就导致即便大家都用SECS-II,仍然可能出现语义不一致的情况——A设备和B设备都叫报告,内容结构却完全不一样。
GEM把设备行为收敛成几个模型。通信状态机只有三个状态:DISABLED(连接断开)、INITIATED(连接建立但未完成建立通信)、COMMUNICATING(完成S1F13/S1F14的Communication Establish,进入正常通信)。控制状态机分为OFFLINE、ONLINE-LOCAL、ONLINE-REMOTE三个大状态,OFFLINE下面还细分Equipment Offline和Host Offline两个子状态。处理状态机则描述设备当前是否在加工、是否空闲、是否暂停等。
这三套状态机互相之间有关联但没有严格的约束关系。比如一台设备可以通信状态是COMMUNICATING,但控制状态是OFFLINE(主机只是挂着但设备不执行远程命令);也可以是ONLINE-REMOTE但通信断开(一般是异常状态,需要做异常处理)。这些模型的意义在于给双方一个明确预期:主机收到S1F13后知道设备应该进入ONLINE-REMOTE,如果它发回来的状态不符合预期,就能立刻判断连接有问题。
3.2 变量、事件和报告:设备数据的标准出口
设备产生的数据,GEM标准通过三条路径暴露给主机:状态变量(Status Variable)、设备常量(Equipment Constant)、数据变量(Data Variable)。这三类变量是设备数据的标准出口,取值通过S1F11/S1F12(读状态变量)、S2F13/S2F14(设置设备常量)、S2F17/S2F18(读数据变量)这些消息交互完成。
事件上报机制是GEM里最核心也最常用的功能。设备侧预先定义好事件集合(Collection Event),例如每个晶圆加工完成触发一个“Process Completed”事件,某段工艺参数越限触发一个“Parameter Exceeded”事件。当事件发生时,设备根据主机的订阅配置,发送S6F11消息,把预设的数据变量值一并上报。主机如果希望批量接收事件,需要在建立通信后依次完成Define Report(S2F33/S2F34)、Link Event Report(S2F35/S2F36)、订阅事件(S2F37/S2F38)这三个步骤,设备端才会按设定上报。很多初次做对接的工程师在这里翻车,就是漏了其中某一步,导致设备死活不上报数据。
4. 实操中如何完成一次SECS/GEM对接
4.1 一个典型对接过程的完整链路
从一个真实项目的经验来看,主机(Host)与设备的一次完整SECS/GEM对接涉及多个阶段,每个阶段都要验证好才能进入下一步。
第一步是网络层调通。确认设备端的IP地址和端口,用telnet或者nc命令测试TCP连通性。如果只有设备端主动连主机的场景,那需要在主机侧开一个监听端口,注意防火墙规则。实际现场里这一步最常见的坑是:设备所在网段和主机不在同一VLAN,或者网络交换机端口只配了静态IP没配路由,导致主机连不上设备。这些网络问题往往花费的时间比协议本身还多。
第二步是基准通信验证。主机发S1F1,设备回S1F2,确认设备在线。然后发S1F13请求建立通信,设备返回S1F14,带上设备ID和软件版本信息。S1F14的返回内容需要关注:如果设备回复状态码为0表示通信建立成功;非0则要看具体的错误码含义。有些设备在S1F13通信建立前会拒绝其他任何消息,所以顺序不能乱。
第三步是动态事件配置。按前面说的顺序,先S2F33定义报告格式(报告里包含哪些数据变量、状态变量),再S2F35把报告绑定到具体事件,然后S2F37订阅事件。这三步做完之后,设备端在事件发生时应按配置上报S6F11。实际验证时最好制造一次真实事件(比如手动完成一个空跑流程或触发一个测试报警),确认上报数据中的变量值正确、事件ID匹配。
第四步是远程命令验证。异机和原位设备一般支持若干远程命令(Remote Command),比如Start、Stop、Abort。主机通过S2F41下发命令,设备执行后返回S2F42,带上完成状态。这个环节里最重要的一点是确认命令执行的同步和异步语义:有的命令设备执行得很快,马上就在S2F42里返回结果;有些命令(比如整批次开始加工)是后台异步执行,S2F42返回的只是“接受命令”状态,真正的执行结果要通过事件上报来确认。
4.2 协议数据解析的实操注意点
SECS-II消息的二进制解析看着简单,细节里全是坑。字节序就是最容易踩的一个:SECS-II标准规定消息里的数值类型(如U2、U4、I4)是大端序(Big-Endian),与常见PC平台的x86架构小端正好相反。如果你在Windows上直接用指针强转或者直接用crash的popen方法读数据,解析出来全是反的。正确做法是每读到数值类型时,手动按大端序组装,或者使用成熟的SECS/GEM库来帮助你处理这些细节。
另一个常见问题是长度的表示。SECS-II消息里的长度字段是一个可变长度的整数,最高位为1表示后续还有字节,这个设计在嵌入式设备里很常见。有些设备对长消息(比如大于256字节的配方数据)分帧发送,主机侧需要做消息重组。这些看起来琐碎的问题,如果没提前准备,联调现场会被折磨得很惨。
还有编码问题。不同设备厂商对S1F2里的设备信息中的中文字符、特殊字符的处理方式不一,有的用ASCII,有的用UTF-8,甚至有的用JIS编码。在日志解析和展示环节需要考虑到这种情况,避免在面板上看到乱码导致误判设备状态异常。
5. 常见问题和踩坑实录
5.1 通信超时与数据丢失
SECS/GEM通信中,T3、T5、T6、T7、T8这些超时参数是标准里明确指定的。T3是回复超时,主机发出消息后在规定时间内没收到设备的回复,就认为消息超时,需要做重试或者汇报异常。T5是连接建立超时,T6是数据发送超时,T7是连接空闲超时,T8是网络传输报文间隔超时。这些参数在不同设备上配置可能不一样,对接时需要和厂商确认。
实际项目里最常碰到的通信问题是:设备网络拥塞导致T3超时,主机误判为设备离线,触发报警,甚至把设备踢下线。解决方案是在主机侧做合理重试机制,比如S1F13通信建立失败后等几秒重试,而不是立刻标记设备不可用。同时排查设备端是否有固定间隔的心跳包(S1F1),如果设备本身设计比较老没有心跳,主机侧要自己维护一个周期性的S1F1轮询来感知设备是否在线,但轮询频率不能太高,否则会加重设备通信负担。
5.2 GEM上下文不一致和状态机卡死
一台设备可能出现通信状态正常,但处理状态和实际情况不一致的情况。比如设备通过S6F11上报了“Process Started”事件,但主机侧因为消息处理异常丢掉了这个事件,MES里的设备状态还停留在Idle。这种情况最危险,因为系统会认为设备没有在干活,可能把下一批任务又分配过来,导致设备过载。
处理这个问题的常规手段是状态同步机制:主机和设备互相约定,在收到对方的关键事件后,通过S1F21(获取设备处理状态)主动查询设备端状态来校准本地记录;或者在每次设备空闲超时后,主机做一次强制状态同步。还有一些工厂会在设备侧配置“在线状态改变事件”,设备从LOCAL切换到REMOTE时强制主机刷新记录。这些机制都是为了处理通信和状态不一致的边界情况。
另外一个很常见但很少被文档提及的问题:GEM标准中,设备处于OFFLINE状态时,Remote Commands必须被拒绝,如果主机在设备未切换至ONLINE-REMOTE时就下发S2F41命令,设备会返回错误码。但部分设备商为了现场调试方便,在OFFLINE状态也允许执行部分命令,这就会导致不同产线之间的行为不一致。代码里一定不能让“这个设备可以不代表那个设备也可以”。
5.3 日志分析与协议调试工具选型
平时做SECS/GEM联调,工具选好了事半功倍。这里的核心矛盾是:设备厂商自带的调试软件往往只能看设备侧的状态,主机侧收发的消息不透明;通用的网络抓包工具(比如Wireshark)能抓TCP流量,但SECS-II的消息内容需要自己写解析或者装插件。个人经验是两种工具配合使用:先用网络的抓包工具确认TCP层连接是否正常、消息是否到达,再用支持SECS/GEM解析的调试工具(比如可以装SEMI标准解析插件的Wireshark,或者一些商业的SECS测试模拟器)来做消息级别的验证。
做消息日志的时候养成一个好习惯:统一日志格式,把每个消息的流号、功能号、往返时间、消息摘要都记录下来,尤其是S6F11的大量事件上报,如果日志不打全,量一大就很难定位问题。很多模糊的问题最后定位下来都是靠日志回放找到的线索,比如某个事件上报里携带的变量ID和报告定义不一致,这类问题只有在完整消息流里才能看得清。
6. 开发选型和实施路径建议
6.1 自主开发 vs 成熟开源库的选择
有不少工程师上来就问能不能自己用纯Socket开发实现SECS/GEM。技术上当然可以,SECS-II的消息格式本身不难解析,GEM的状态机逻辑也完全可以手写。但从项目落地的角度,完全不建议从零开始造轮子。原因在于SECS/GEM标准的边界情况极多,纯按照协议文档来实现,第一次联调一定会遇到大量设备侧的非标准行为,而这些行为往往是在数十年跨厂家的设备对接中被收集和完善的。成熟开源库或商业SDK已经把各种厂商设备的兼容性踩过了,站在这个基础上做二次开发和适配,效率会高很多。
如果你是学习目的,自己写一个简化版的SECS-II消息解析器用来理解协议细节,这是很好的路径。但如果是工厂在产的自动化项目,稳妥起见,直接用成熟方案。开源的可以选择SEMI自己维护的一些参考实现,或者GitHub上活跃度高的开源库,闭源的商业SDK则推荐在签了NDA的前提下直接和原厂沟通拿试用版。
6.2 实施团队的职能分工建议
一个完整的SECS/GEM实施项目至少需要三种角色:设备端对接工程师、主机端应用开发工程师、以及负责协议适配和异常处理的中间层工程师。设备端工程师要理解设备的PLC程序结构,能够配置设备侧的SECS/GEM参数(比如事件ID、变量映射),同时能用设备自带调试工具发起消息验证。主机端工程师则要处理MES和SECS/GEM之间的交互逻辑,例如设备的实时状态更新、报警处理、批次流程控制等。中间层工程师承担了最吃苦的那部分工作——把设备上报的各种非标准数据转换成本地系统的标准数据结构,同时把命令下发的各种业务动作翻译成符合GEM模型的消息序列。
这三种角色在实际项目中经常会交叉,小团队甚至可能由同一个人兼任。但职责划分要清楚,否则出了问题很难对抗。特别是当联调出现问题时,设备厂商、主机开发方、现场IT经常会互相甩锅,一个清晰的对接记录表——团队里的每个事件、消息模板和负责人信息都记录得明明白白——能极大加速问题定位。
7. 半导体工厂中SECS/GEM的延展应用
在新型的半导体智能工厂里,SECS/GEM早已不只是设备数据采集这么简单。它正在和更多系统做深度融合。比如和FDC(故障检测与分类)系统集成:通过SECS/GEM实时上报的高频工艺参数,FDC系统能够在线做统计分析,发现工艺偏离趋势并提前预警。再比如和RMS(配方管理系统)联动:主机通过远程命令和S7消息组(配方管理)下发配方到设备端,实现配方的版本化闭环管理,避免现场操作员手工录入配方的笔误风险。
设备OEE统计也是SECS/GEM数据的典型应用场景。设备状态事件(比如事件中记录停机开始、恢复生产)结合设备状态机模型,可以精确区分设备故障时间、待料时间、换型时间和实际生产时间。以前很多工厂靠人工记录纸质产量报表,数据滞后不说,还容易失真,上了SECS/GEM之后基本上可以做到分钟级的OEE实时分析。很多工厂做数字化改造,第一步就是先把所有设备的SECS/GEM打通,没有这层原始数据基础,上层的APC(先进过程控制)、良率分析、数字孪生都是空谈。
最后想分享一点个人实际体会:SECS/GEM这套协议看起来是技术问题,但越做越会发现它本质上是工程管理问题。接入一台新设备的成本,很大程度取决于前期和设备厂商的沟通是否充分——设备端的变量表文档是否完整、事件定义是否清晰、人员培训是否到位,这些都直接决定联调周期。我的做法是,在采购设备的技术协议阶段就把SECS/GEM对接要求写进去,明确设备需要支持的事件类型、变量列表、通信异常处理机制,尽量在验收阶段就把对接工作做完,而不是等到设备进场后再来谈。希望这篇文章能帮正在这条路上的同行们少走一些弯路。
本文还有配套的精品资源,点击获取