☰
SECS/GEM/GEM300/EAP协议栈详解:从物理层到设备自动化
2026/10/23 1:31:09 网站建设 项目流程

SECS/GEM/GEM300/EAP 这套协议体系,在半导体工厂里是设备自动化的地基。只要你在FAB里待过,肯定见过设备工程师对着日志抓耳挠腮,也见过软件工程师在调试终端前一行行敲命令。这玩意儿说复杂也复杂,消息类型上百种,状态模型绕来绕去;说简单也简单,本质上就是设备和主机之间“约好怎么说人话”。这篇是系列的第二篇,专门把协议层拆开揉碎讲清楚:从最底层的字节传输,到消息怎么组包,再到GEM标准里定义的各种行为规范,最后把GEM300和EAP的位置摆明白。适合刚入行准备做设备自动化、或者要和设备厂商对接的工程师参考,读完之后你能自己看懂抓包日志,也能在联调会议上不被厂商唬住。

1. 协议栈全景:先搞清楚每一层在干什么

1.1 从SECS-I到EAP,一次类比说清层次关系

打个比方。两个人要聊天,得先解决三件事:声音怎么传过去(物理层)、说出来的话怎么断句成一句句完整的句子(会话层)、每句话用什么语言和语法规则(表示层)。SECS/GEM/GEM300 这套体系,就是半导体设备自动化里的“聊天规范”。

  • SECS-I(SEMI E4):定义物理层,也就是RS-232串口上的字节传输规则。
  • HSMS(SEMI E37):替代SECS-I的新物理/传输层,跑在TCP/IP之上,是现在FAB的主流。
  • SECS-II(SEMI E5):定义消息的语法,也就是主机和设备之间互相传输的“消息格式”和“具体用词表”。
  • GEM(SEMI E30):定义设备的行为规范,比如什么时候该报告状态、报警怎么上报、远程命令怎么处理,相当于“聊天时双方该遵守的礼貌和流程”。
  • GEM300:面向300mm工厂的扩展协议族,包含E39、E40、E84、E87、E90等一堆新标准,主要解决装载端口、载具追踪、设备间通信这些更细的问题。
  • EAP:不是SEMI标准,而是MES与设备之间的自动化逻辑中间层,负责把GEM的底层消息翻译成业务动作。

这套分层结构,和网络协议里的OSI七层模型有点像,但是更专一:它只服务于半导体制造设备。理解每一层是干什么的,是在协议层排错之前必须打好的底子。我见过太多人直接把SECS-II消息打印出来看,看不懂就开始瞎猜,其实问题可能出在最底层的HSMS心跳断连,或者SECS-I的波特率设置错了,压根没到消息解析这一步。

1.2 为什么协议要分层,以及SEMI标准族全景

分层最大的好处是解耦。换句话讲,各层可以独立升级。早期设备用SECS-I跑串口,后来FAB网络化普及,大家想用TCP/IP来跑,如果协议不分层,整个消息格式就得推翻重来。SECS-II的消息格式和物理传输方式无关,今天你可以用RS-232传,明天换HSMS用TCP传,SECS-II照用不误。这就是标准的魅力,也是为什么SEMI把标准拆成E4、E5、E37、E30等多个族。

协议标准全称说明对应层次核心作用
SEMI E4SECS-I物理/传输层基于RS-232的字节流传输
SEMI E5SECS-II消息层消息格式、数据项、流与功能码
SEMI E30GEM行为层设备行为建模、事件/报警管理
SEMI E37HSMS传输层基于TCP/IP的高速消息传输
SEMI E39对象服务应用层扩展对象实例管理(如载具、工艺配方)
SEMI E40工艺流程管理应用层扩展Run Management、配方管理
SEMI E84载物台通信传输扩展装载端口与载具的通信协议
SEMI E90追踪应用层扩展WIP追踪与物料路由
SEMI E94控制作业管理应用层扩展多任务控制作业的协调

SEMI标准还有很多,E87(载具管理)、E88(物料搬运)、E116(设备追踪)等等,实际项目中按需采用。但从“协议层”这个主题出发,E4、E5、E30、E37是绝对核心。EAP是在这些核心标准之上做业务编排的。

2. 传输层的两台“信使”:SECS-I与HSMS

2.1 SECS-I:老当益壮的RS-232实现

SECS-I把SECS-II消息块封装成“块(Block)”,通过RS-232串口逐字节发送。它有一些非常硬核的规定:每个块最长不超过244字节,块与块之间用长度字节分隔,字符帧格式是“起始位+数据位+奇偶校验+停止位”的串口标准。实际项目中,波特率常见9600或19200,但选串口就意味着速率天花板——9600波特率下,每秒只能传大约960字节,算上消息开销,传一个几百字节的SECS-II消息就要1秒起步。

SECS-I有个特点值得注意:它是单主机对单设备的点对点通信。一台设备只能和一个主机建立连接,主机唯一,设备地址(Device ID)是0或者某个特定值。这在老式的单机台自动化里没问题,但到了300mm工厂,一台设备既要和MES通信,又要和AMHS(自动物料搬运系统)通信,点对点很明显不够用。SECS-I还有一个“时间戳”机制,块里带Length字段和奇偶校验,保证串口上噪声干扰下还能发现丢字节、错字节。

然后是消息的发送机制。SECS-I分“多块消息”,一个SECS-II消息如果超过244字节,会被拆成多个块依次传送。接收方必须把所有块收齐才能还原成完整消息,块信息里包含块号、总块数,还有一个特殊的“结束块”标记。这意味着,如果你在抓串口数据,看到的是带序号的块,而不是直接看到一条完整消息。协议层联调时,如果发现某个多块消息总是不完整,先别怀疑SECS-II解析,去查串口是不是丢了字节,或者是不是两块消息之间间隔过大导致超时。

2.2 HSMS:TCP/IP时代的消息高速路

HSMS(High-Speed Message Services)解决了SECS-I的两大痛点:速率和连接数。它基于TCP/IP,走以太网,消息响应速度是毫秒级;并且一台设备可以同时与多个远程实体通信,不再是一对一。HSMS也定义了更清晰的连接管理:不是直接从设备进程启动就开始传消息,而是有一个“未连接→连接→通信中”的握手流程。

HSMS的消息格式分两层:传输头(Header)和正文(Data)。传输头是固定的26字节,里面包含消息长度、会话ID、消息头字节、期待响应位等关键信息。实际操作中,HSMS最常见的坑有两个:一个是心跳超时。HSMS规定,如果一段时间内没有消息通信,连接双方应发送心跳请求(Selective Data)维持连接,默认心跳间隔常见10秒、20秒。如果对端设备因网络抖动没有回应,TCP连接会被判定断开,设备就会进入离线状态,MES里显示“Equipment Offline”。另一个是端口冲突。HSMS默认端口5000,但实际FAB里经常由设备厂商随意指定,几千台设备很容易撞端口,排查时先查端口占用。

HSMS 三种连接模式也需要掌握:

  • Active模式:主动发起TCP连接,适合设备寻址到主机。
  • Passive模式:被动监听主机发起的连接。
  • Active-Passive混合模式:设备上起TCP服务,同时可以尝试连主机备用地址。

实际项目里最常用的是主机Active、设备Passive。设备只需要配置“控制端IP+Port”和“设备IP+Port”,主机负责连接管理。但这也会带来一个麻烦:主机重连设备之前,必须主动断开旧连接,否则设备端只认一个TCP连接,新连接会被拒绝。联调时遇到“连不上设备”,多半是连接没断开干净。

2.3 传输层选型的实操建议

当前新建FAB的项目,不需要犹豫,直接选HSMS。只有在老旧设备改造、或设备控制器只有串口没有网口的极端场景下,才保留SECS-I。如果你在做上位机软件,直接按HSMS实现,顺便兼容SECS-I作为一个底层驱动选项就够了。选型不是技术问题,而是维护成本问题。串口方案还需要光电隔离、串口服务器,调试难度和排错成本远高于TCP。尤其在远程诊断、多主机协同、日志采集这些场景,没有IP一切都白搭。

对比维度SECS-IHSMS
物理介质RS-232串口以太网TCP/IP
通信拓扑一对一一对多
典型速率9600/19200 bps100M/1Gbps
连接建立物理链路+握手TCP连接+握手
心跳机制无标准定义周期性心跳
适用场景老旧设备、改造现代FAB主流

具体到手写代码,我建议先实现HSMS的以下消息收发原语:建立连接、释放连接、发送数据块、接收数据块、心跳响应、连接状态回调。消息体解析放在下一层做,传输层只关心字节流完整送达。这里的“完整送达”很关键:TCP虽然是可靠传输,但不保证“一条应用消息恰好一个TCP包”,所以HSMS层必须自己做粘包拆包。常见做法是先用4字节存长度,再等够长度再parse。

3. SECS-II协议层:消息的语法与语法

3.1 消息头结构

SECS-II消息是SECS-I/HSMS传输的“载荷”。一条消息由消息头(Message Header)+ 正文(Body)组成。消息头固定10字节,是整个协议里最需要背下来的东西。

  • 字节0-1:Device ID(会话ID),但只有低7位有效,高1位是“是否包含会话ID”的标志。实际抓包里,你会发现DC位(设备ID标志)经常是0,表示不区分设备地址。
  • 字节2:Stream(流)和Function(功能)。
  • 字节3:W位(期待响应位)、R位(恢复请求位)。
  • 字节4-5:会话ID(Session ID),用于多块消息的事务关联。
  • 字节6-9:系统字节,起“事务标识”作用,用于匹配“请求-响应”对。

这里最容易被忽视的是字节4-5的会话ID。它本质上是“该条消息所属的事务ID”。当你发一个请求,需要等待回复时,回复消息的系统字节要和请求消息相同,这样发送方才能知道这个回复是针对哪条请求的。多块消息的每一块也都带同一个Systen Bytes,接收方才能把分散的块重新组装成同一条消息。抓包时如果发现响应消息的System Bytes对不上请求的,基本都是上层业务实现有bug,而不是网络问题。

3.2 事务机制:对话ID与W-Bit

SECS-II的通信模式可以分三类:无响应请求(Primary Message without reply)、有响应请求(Primary Message with reply)、以及由主机发起的事务。W位(Wait-Bit)就是关键开关。W=0表示不收回复,W=1要求接收方必须回一条对应Stream/Function的消息。这是一种“谁提问谁收尾”的机制,跟聊天中对讲机“我说完,你回我”一样。

事务建立的细节是:主机发送一条W=1的请求,设备端收到后,必须以一条“与此请求匹配的”Secondary消息(通常Stream和Function有关联)回复。这个回复里,要求System Bytes与请求一致。同时,消息头里的W位为0,表示该消息是应答消息。设备不能自己主动“回答”一条不存在的请求,也不能在收到请求前就开始发送应答。联调中最常见的错误是设备端自作主张乱发Secondary消息,或者主机端没有维护好等待中的会话表,导致响应到了却匹配不到任何请求,直接丢弃。

主机端的事务管理,强烈建议实现一个“等待响应队列”。发送请求时,把System Bytes注册进队列,设置超时时间(常见10秒~30秒),收到响应后按System Bytes匹配出对,从队列弹出。超时未响应的,还要触发超时重试或报警逻辑。这个队列在EAP里尤其重要,因为EAP可能同时向多台设备发请求,没有队列管理,根本搞不清哪条响应属于哪条请求。

3.3 数据项与SML格式

SECS-II消息正文不是普通字符串,而是一棵数据项树。数据项的类型包括:二进制(Binary)、布尔(Boolean)、ASCII字符串、8字节整数(I8)、4字节整数(I4)、2字节整数(I2)、1字节整数(I1)、8字节浮点(F8)、4字节浮点(F4)、列表(List)等。每个数据项以格式代码开头,格式代码后跟长度字节,表示该项占用的字节数。List类型可以嵌套任意多个数据项,这构成了设备消息的层级结构。

举个例子,一条S2F41(主机请求设备列表)的响应消息S2F42里,正文常常是一个巨大的List,嵌套着多个子List,每个子List描述一台子设备的信息。如果直接拿十六进制打印看,正常人根本看不懂。所以要引入SML(SECS Message Language)这种文本格式。SML看起来像这样的伪代码:

S2F42 <L [3] <A "设备1"> <A "设备2"> <A "设备3"> >

SML是调试和联调的“通用语言”,几乎所有SECS/GEM调试工具都支持SML格式的发送和解析。上手时,你需要会读SML、会写SML、会把SML翻译成字节流,以及反着来。字节流和SML之间的转换,就是SECS-II库要做的事。自己写这个转换不难,但要注意边界问题:长度超过127字节的字符串要用“长数据项”表示,否则解析会错位;嵌套List的元素个数也要数清楚,漏一个元素后面的全部错位,查起来极其头疼。

3.4 流和功能码

SECS-II的消息类型用“流/功能”(SxFy)来标识。流表示大类,功能表示具体动作。常见的有:

  • S1F0:约定测试(Are You There的回应)。
  • S1F1:主机询问设备是否在线。
  • S1F2:F1的响应,携带设备状态。
  • S1F13:建立通信请求。
  • S1F14:F13的响应(建立通信确认)。
  • S2F17:请求设备时间。
  • S2F18:F17的响应(设备上报时间)。
  • S2F41/42:主机请求设备列表,设备返回。
  • S5F1:设备主动上报报警。
  • S6F11:设备主动上报事件。
  • S6F12:F11的响应(事件报告确认)。

S1F13/S1F14特别值得单独说,它是SECS-II通信层“建立连接”的第一步。设备连上HSMS之后,主机端一般要先发S1F13协商通信是否建立,双方交换协议版本号、设备支持的功能块信息。如果在抓包日志里看到S1F13之后没有S1F14,说明通信建立失败,常见原因是设备端返回了错误代码(比如协议版本不支持)。这些“建立通信”消息是GEM最底层的基础,任何设备自动化项目联调第一天,就应该确认S1F13/S1F14能正常往返。

功能码还有一个细节:同一流的不同功能,可以带不同方向的“主/从”属性。比如S1F1是主机到设备的Primary,S1F2是设备回给主机的Secondary。理解主从关系,才能正确设置W位。调试时可以用工具主动发S1F1,观察设备是否回S1F2、System Bytes是否匹配、设备回的数据内容是否符合预期。这三步验证通过,说明SECS-II消息层的“收发链路”已经通了,可以开始更复杂的业务消息调试。

4. GEM标准:让设备“行为规范”起来的SOP

4.1 设备状态模型与通信状态模型

GEM(SEMI E30)把所有设备的自动化行为规范成一套标准状态模型,这是它最核心的贡献。没有GEM之前,每台设备的厂商状态五花八门:有的用0/1表示运行/停止,有的用英文字符串,主机端只能针对每台设备写专属逻辑,维护成本爆炸。GEM统一之后,设备状态被归纳成几个标准状态集合,比如设备状态(POWER_ON、IDLE、READY、RUNNING、STOPPED等)、报警状态、事件状态。

通信状态模型则描述主机与设备之间的“会话状态”:

  • COMM_NOT_ESTABLISHED:通信未建立。
  • COMMUNICATION_STARTED:主机已发出通信建立请求(S1F13)。
  • COMMUNICATION_ESTABLISHED:S1F14确认,通信正常。
  • COMMUNICATION_ABORTED:通信中断。

我特别要提醒一个状态切换细节:GEM规定,设备在COMMUNICATION_ESTABLISHED之前,不能向主机发送事件报告(S6F11),也不能接收远程命令(S2F41之类的)。很多设备软件在通信刚建立时,会立刻尝试发事件,结果主机还没准备好,消息直接出错。主机端处理时,最好在“通信已建立”事件触发后再启动事件订阅、时间同步等动作,给设备一点缓冲时间。

4.2 事件通知与数据收集

GEM的事件报告机制是设备自动化的“感觉神经”。设备状态发生变化、报警发生、工艺步骤切换,都会通过S6F11主动上报给主机。每条S6F11里有一个事件ID(CEID,Collection Event ID)和一组数据变量(DVVAL)。主机端只需提前配好“事件订阅表”,告诉设备“哪些事件发生后,报哪些变量”,之后就能实现实时监控。

事件收集的关键是“收集计划”(Collection Plan)。通过S2F33(定义数据收集计划)和S2F35(请求事件报告)来配置。操作中最大的坑是:设备端收集计划的数量是有限的(很多老设备只有8个或16个),配置多了设备会拒绝。而且不同事件ID对应的DVVAL列表,粒度很细,一个变量名对不上,设备端会返回错误代码。因此,建议在写配置前先拿设备手册核对一下事件ID和变量ID的映射表,不要凭空猜。

事件上报的W位也值得注意。S6F11默认W=0(不需要响应),但有些设备配置成W=1,要求主机回S6F12确认。主机端必须无条件支持这两种模式。如果主机没回S6F12而设备又等了超时,后续事件可能会被设备端缓存但不再发送,导致数据丢失,排查时看设备日志才能发现。

4.3 报警管理

报警上报走S5F1(设备主动上报报警)或S5F3(主机请求报警列表)。一条报警消息里包含报警代码(ALCD)、报警ID(ALID)、报警文本和报警时间戳。报警代码分4类:FATAL(致命)、ERROR、WARNING、INFO。GEM还定义了报警启用/停用机制(S5F3/S5F4),不是报警发生了就一定要主动报,而是取决于报警是否在“启用”状态。

我在项目里遇到过一次很典型的报警问题:设备发生了一次瞬时欠压报警,马上又恢复了,设备端发了S5F1然后又发“报警清除”,主机这边由于报警处理逻辑写得激进,直接把批次给Abort了。后来改成报警“确认+延迟”机制:报警发生后等待数秒,如果设备端报清除就不处理,只有持续报警才触发业务停机逻辑。设备工程师都说这个设计合理。处理设备报警,关键不是看到报警就慌,而是想清楚报警是“需要立即停止流程”还是“提醒”,两者在EAP里处理路径完全不同。

4.4 远程命令

GEM的远程命令机制是设备自动化的执行器官。主机通过S2F41发送一个远程命令(RCMD),命令名和参数都放在正文里。设备执行后回S2F42,携带完成状态(比如“命令完成”“命令拒绝”“参数错误”)。S2F41通常带W=1,要求强制响应。

远程命令的位置必须明确:远程命令是GEM规定的“主机控制设备”的通道。比如主机想让设备开始跑工艺(Process Start)、终止工艺、切换配方,都通过S2F41发送。为了能执行远程命令,设备端需要实现“命令解析→权限校验→执行→返回状态”的逻辑。联调时常见问题有:命令名大小写不敏感但设备端没有做标准化,导致主机发“ProcessStart”设备却要求“ProcessStart”或“PROCESSSTART”,完全匹配不上;命令参数的类型不匹配,比如主机传字符串“1”而设备期望整数1,也会被拒。调试时一定要把S2F41和S2F42的完整SML打出来对比,参数格式一个字符都不能差。

远程命令还有一个“可写设备状态”的交叉检查。GEM状态模型会定义某些命令只能在特定状态下执行,比如“开始工艺”只能在READY状态执行,如果设备处于IDLE或PAUSED,命令会被拒绝。主机端下发命令前,先查询设备状态,能省去大量尝试成本。

4.5 变量集(Vid)与追溯

GEM中设备有很多变量:SV(状态变量)、EV(事件变量)、DV(数据变量)、ECV(设备常量)。主机通过S2F13(请求变量查询)和S2F17(请求时间)来读取。变量ID(VID)是每个变量的唯一编号。不同设备厂商对VID的定义不同,但GEM会约定义一些通用VID:比如设备状态SV、工艺配方号SV等。实际项目里最常见的问题是“VID表维护不到位”。新设备上线、软件版本升级后,VID表经常变,主机端如果还按旧的VID去读,拿到的是空值或者错误类型。

追溯(Trace Data)是GEM里很实用的功能。通过S2F23(定义追溯请求),可以让设备周期性或者按指定条件上报一组变量。这个功能在做设备稼动率分析和工艺过程监控时非常香。举个例子,我做过一个项目的设备追溯采集,每500ms采集一次当前设备状态、运行模式、主腔体真空度等SV,设备端通过S2F24持续上报,主机端把数据灌进时序数据库,做成了实时曲线。效果比从设备日志里抓字符串强了一个档次。

追溯功能也会有性能隐患。采集周期太短(比如50ms)、变量数量太多,会挤爆网络和主机端的接收处理。建议做追溯前先估一下数据量:每个变量平均4字节×变量数×每秒采集次数,算一下带宽,超过5Mbps就危险。反正实际项目里因追溯配置过密导致网络拥堵的案例,我见过不止一两次。

5. GEM300:300mm时代的设备自动化扩展

5.1 从300mm需求到协议族扩展

300mm晶圆厂相比200mm,最大的变化是高度自动化、少人化。晶圆盒一个接一个通过AMHS运输,设备要能自动装卸、自动识别、自动做工艺。GEM标准面向的是“单台设备的自动化”,但300mm工厂需要的是“设备与物料搬运系统的联动”,这就催生了GEM300协议族。它不是单独一个标准,而是一捆:E84负责装载端口和搬运系统之间的通信,E87管理载具信息,E90做物料追踪,E40管工艺配方和流程控制,E94做控制作业调度。

GEM300的推进还有一个现实压力:300mm晶圆特别重,人工搬运不现实,必须靠自动化搬运设备。而搬运设备和工艺设备之间的接口,必须有统一规范,不能一家一个说法。这就像物流公司必须和仓库约定好托盘尺寸和扫描枪扫码格式,不然货根本卸不下来。

5.2 E84与装载端口通信

E84是GEM300里最核心也最容易出对接问题的协议。它定义了“搬运设备(如OHT/天车)与工艺设备装载端口(LoadPort)之间的通信方式”,使用光通信(SEMI E84光接口)在设备之间交换控制信号。通过E84,OHT会把载具放在装载端口上,然后装载端口执行“载具到达”的信号序列,工艺设备接收后的下一步动作是进行载具ID读取(自动条码扫描)和Mapping(晶圆位置映射)。

E84的通信模型非常精细,握手信号序列包括:

  • 搬运设备发出“载具放置请求”。
  • 装载端口确认“已就位”。
  • 搬运设备释放载具并升起。
  • 装载端口执行“载具就位检测”(CLAMP、FOUP presence switch)。
  • 设备侧开始载具ID读取和Mapping。

E84常见的问题集中在这几个方面:一是信号电平问题,光接口的发射/接收功率不达标,通信时断时续;二是GEM300标准版本不一致,设备固件老版本和新搬运设备的E84实现之间有兼容性差异;三是握手超时时间设置太短。有一次联调,OHT放FOUP的动作稍慢,E84握手序列跑到一半就超时,设备端报警“LoadPort Timeout”,工艺还没开始就停了。最后把超时时间从5秒放宽到15秒,问题再没出现。

E84另外一个“联动点”是Mapping报告。设备完成晶圆位置映射后,通过SECS-II消息把Mapping结果报给主机。Mapping错误(比如晶圆跨槽、缺片)会导致后续工艺执行异常,所以EAP里必须有明确的Mapping校验逻辑,一旦报告异常,立即阻止工艺释放并报警。

5.3 对象服务(E39/E40/E90等)简述

E39定义了“对象服务”,让主机能像操作对象一样管理设备里的实体:载具、配方、工艺批次、数据收集计划等。E39的引入,本质上是把设备内部的数据模型“对象化”,外部系统通过通用的创建、删除、修改、查询接口来操作它们。这对主机的开发很友好,因为不需要针对每台设备写一套资源管理逻辑,而是统一用“对象服务”的接口去访问。

E40是“工艺流程管理”,核心概念是Process Flow(工艺流),它把一套完整工艺定义为一个Flow,Flow里有多个Step,每个Step对应设备动作和配方参数。E40帮助EAP实现“一键下发工艺流、分步执行、实时反馈”的目标。实际效果有点像播放器里的播放列表,一份歌单(工艺流)定义了要播哪些歌(工艺步骤),每首歌有参数(配方)。E40的好处是让主机不需要知道设备内部具体的配方格式,只需要管理“工艺流”这个高层对象。

E90(设备追踪)是GEM300时代的“事件追踪升级版”,定义了设备和载具之间更细的关联关系。主机可以通过E90查询“哪个载具在哪个设备的哪个装载端口上,里面每个槽的晶圆状态是什么”。这对FAB的实时WIP追踪非常重要。和传统GEM的SV查询相比,E90是标准化的对象级查询,语义更清晰。

GEM300协议族数量多,要在项目里全实现是不现实的。绝大多数设备厂商会优先实现E84、E87、E39、E40的核心子集,后面的E90、E94看设备类型和客户需求。作为对接工程师,你最先要确认的是设备支持哪些协议版本、哪些GEM300功能块。我建议在设备采购技术协议里就写死这些标准版本和功能块清单,不然后期扯皮成本极高。

6. EAP:设备自动化的“粘合剂”与MES脑

6.1 EAP是谁,和MES什么关系

EAP(Equipment Automation Program)经常被误解为一个标准协议,其实它不是SEMI标准,而是一个系统模块。可以理解为“MES派到设备旁边的自动化代理人”。MES管的是业务订单层面:一批活什么时候投料、由哪台设备做、做完怎么流转。EAP管的是设备执行层面:哪台设备在线、当前做什么配方、做到哪一步了、遇到报警怎么处理,然后把执行结果回报给MES。

EAP和MES的交互才是主线。EAP接收MES下发的作业指令(比如“执行批次BatchA的某工艺Step”),把指令翻译成GEM/SECS-II消息,下发到设备端;设备端执行过程中的所有事件、报警、数据,EAP负责收集和过滤,再汇报给MES。MES不直接面对GEM设备,原因很实际:MES是面向生产管理的系统,如果让它去处理S1F13、S5F1、S6F11这些细碎消息,开发和维护成本不堪重负。EAP做了一层翻译和业务编排,让MES只关心生产业务,不关心设备通信细节。

6.2 EAP如何与GEM设备交互

EAP内部常见的模块划分是:通信层(负责SECS-I/HSMS连接、消息收发)、协议层(解析SECS-II、调用GEM功能)、业务层(实现EAP的逻辑,比如配方管理、作业调度、报警判定)、接口层(与MES集成,比如通过WebService、消息队列或文件接口)。

在实际项目中,EAP的关键能力是“多设备并发管理和状态机编排”。一个EAP实例可能同时管理十台甚至几十台设备,每台设备处于不同的通信状态、作业状态、报警状态。EAP需要一个设备状态机来管理每台设备的生命周期,还要有事务队列,确保每条命令都能得到匹配的响应。没有这些,一台设备触发大量事件时,其他设备的消息就会排队积压,业务逻辑被拖垮。

EAP和GEM设备之间的一个典型交互流程,以“配方下载并启动工艺”为例:

  1. MES向EAP下发“批次A、设备D、配方R启动”的指令。
  2. EAP先查询设备D的状态,确认设备在线且处于READY状态。
  3. EAP通过S2F41发送“RCMD=RecipeDownload”,参数里带配方ID和设备参数。
  4. 设备执行配方校验和加载,返回S2F42,状态OK。
  5. EAP再发送“RCMD=ProcessStart”。
  6. 设备开始工艺,EAP持续接收S6F11事件(工艺开始、工艺进行、工艺结束)。
  7. EAP收集到“工艺结束”事件后,通知MES批次完成,可流转到下一道工序。

这个流程里,EAP必须处理异常分支:配方下载失败、设备状态错误、事件超时未到、报警打断工艺等。真正成熟的EAP,最复杂的不是消息发送,而是“异常分支”的处理。这也是EAP开发中最耗时的地方。

EAP和GEM设备对不上时,排错的关键是“分层定位,逐层排查”:先确认TCP层通不通(能Ping通、HSMS连接正常),再确认SECS-II收发正不正常(S1F13/S1F14能通),然后才去查业务消息(S2F41/S6F11)。很多新人上来直接说“EAP和设备和MES数据对不上”,结果一查,HSMS连接都没建立,业务消息当然发不出去,白折腾半天。

7. 实战排错清单与踩坑心得

7.1 常见问题速查表

现象可能原因排查手段解决方向
设备始终离线TCP连接未建立检查IP/Port,Ping设备、Telnet端口修正IP配置,重启设备服务
S1F13发出无S1F14回复协议版本不匹配抓包看S1F13报文,对比设备协议版本调整主机协议版本到设备支持的版本
请求发出后超时System Bytes不匹配检查消息头的System Bytes,核对等待队列修正事务管理逻辑
事件上报丢失S6F11的W位处理不当确认设备端是否需要S6F12响应主机实现S6F12自动应答
远程命令被拒命令名或参数不匹配打印S2F41/S2F42完整SML校正命令名和参数格式
报警误处理报警等级理解偏差检查报警ID与ALCD代码调整EAP报警判定策略
E84握手失败信号异常或超时太短用光通信测试仪看序列调整超时时间,检查硬件灵敏度
追溯数据丢失采集频率过高统计网络带宽降低频率、减少变量数

这些坑,我每条都踩过。尤其是System Bytes匹配,几乎是所有新手的第一道坎。抓包工具打开后,能看到请求和响应两边的System Bytes是否一致,如果发现设备端回的是固定值而不是回显请求值,说明设备端的堆栈实现有bug,该找设备厂商开发聊。

7.2 联调工具与必备技能

做SECS/GEM联调,手头必须有趁手的调试工具。常见的有两种路线:商业工具如Ethernet SECS/GEM调试模拟器,支持SML编辑、消息收发、状态模拟;开源方案则是自己写一个基于SECS/GEM库的上位机,再加一个协议分析器抓包。商业工具的优点是上手快,但到了高级调试(比如自定义错误注入、大规模消息压力测试)还是得自己写脚本。

SML调试能力是必须练的。我建议任何做设备自动化的工程师,都花时间把SML的语法规则吃透,至少能做到:拿到一份SML能脑内转换成字节流,或者看到一段十六进制正文能大概还原出SML结构。这个能力在分析设备端异常报文时极其有用。还有一个小技巧:在调试工具里,把S6F11事件上报的SML全部打印出来,对照设备手册的变量表,一条条核对,绝大多数数据不匹配问题都能在十分钟内定位。

抓包工具方面,Wireshark肯定要装,但要让Wireshark正确解析SECS-II,你需要加载对应的解析插件或使用自定义Decoder(把TCP负载按HSMS头拆开,再看SECS-II消息格式)。没有解码器时,Wireshark只能看到TCP层,HSMS那几个字节还能勉强认出(搜索“Length”字段),再往里的SECS-II正文就全是天书了。实际干活,我常备两个工具:一个支持SML编辑的模拟器,一个能解析HSMS头的抓包器,配合使用效率最高。

7.3 我的三点经验建议

第一,协议补全太重要。联调一般不允许“边界情况”出现在现场,所以前期一定要把设备端的消息响应矩阵梳理清楚。怎么梳理?拿设备手册的功能块列表,逐项测试,造一份“设备行为确认表”,把每条消息的请求、响应、异常分支全过一遍。这个过程很枯燥,但能帮你提前发现80%的联调坑。

第二,版本管理要严格。SECS/GEM/GEM300标准年年更新,设备固件一升级,可能行为就变了。我遇到过设备从GEM版本A升级到B之后,S2F41的返回数据结构多了一个字段,旧EAP解析直接崩溃。设备升级前一定要做协议兼容性测试,最好在测试环境先跑一轮完整回归。

第三,日志必须分级且可回溯。生产环境里,协议层的日志应该分三级:ERROR(无法恢复的错误)、WARN(可疑但未中断流程)、DEBUG(每条消息的SML原文)。DEBUG日志默认关闭,排查问题时打开,并且要支持按设备、时间段、消息类型过滤。没有好用的日志系统,在几百台设备的FAB里排查协议问题,等于大海捞针。

我个人实际操作中最深的体会是,这套协议栈看着复杂,但一旦理解了分层思想和状态机,其实没有真正的难点。你只需要记住:物理层负责传输字节,消息层负责表达语义,GEM负责约束行为,EAP负责业务翻译。每一层出问题都有各自的排查工具和方法,别跨层乱猜,把层与层之间的接口看好,绝大多数坑都能稳步绕过去。后面如果再写,我打算把SML和HSMS的字节级解析单独拎出来,用一组真实抓包数据带着大家逐字节拆一遍,那个过程会特别过瘾。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询