☰
SECS/GEM通信状态机详解:从DISABLED到COMMUNICATING的握手与避坑
2026/10/31 8:18:09 网站建设 项目流程

简介:这份PDF文档面向半导体设备自动化领域的工程师与开发人员,系统讲解SECS/GEM(SEMI设备通信标准/通用设备模型)协议规范,帮助读者理解设备与主机系统之间的标准化数据通信机制,解决不同厂商设备互联互通的问题。文档以广州金南瓜科技的SECS/GEM方案为实施案例,内容涵盖通讯状态模型、控制状态模型与设备处理状态,并逐项展开主机发起场景、事件通知、在线识别、动态事件报告配置、变量与跟踪数据采集、报警管理、远程控制、设备常数及过程程序管理等设备能力,同时涉及TCP/IP通讯超时与变量命令实现等细节。资源包共1个PDF文件,约1006KB,篇幅紧凑、目录结构完整,便于按章节检索查阅。目前已有746人学习下载,适合需要快速掌握SECS/GEM规范要点、对照实施设备接口或进行自动化产线集成的技术人员参考。

1. 通讯状态机:为什么设备上电后不是立刻“在线”

很多人第一次接触半导体设备通信,会默认一个直觉:网线插上、TCP 通了,设备就该“在线”了。但真正跑过产线的人都知道,物理链路通和逻辑通信建立是两回事。SECS/GEM 里最容易被低估的设计,就是把“通信”本身拆成了一个显式状态机——DISABLED、ENABLED、NOT COMMUNICATING、COMMUNICATING,每一层都有独立的进入条件和超时定时器。这套状态模型解决的核心问题是:在自动化产线上,主机和设备来自不同厂商,谁先发起、失败后怎么退避、消息在断连期间往哪放,必须有确定答案,否则一条线上几十台设备同时重连就是一场灾难。搞懂这套状态机,你才能理解后面事件报告、变量采集、远程控制为什么都建立在“通信已建立”这个前提之上,也才能看懂那份规格说明书里大量状态转换表的真正价值。

2. 通信状态模型:S1F13 与 CommDelay 定时器如何决定谁先开口

2.1 DISABLED 与 ENABLED:一个被忽略的“总闸”

规格书里把 DISABLED 定义为“SECS-II 与主机不存在通信”,并且特别强调:操作员从 ENABLED 切到 DISABLED 时,所有 SECS-II 通信立即停止。这句话看着平淡,实际是一条硬约束——它不是“暂停发送新消息”,而是连正在排队的消息都不再走。常见的实现思路是,在协议栈最外层放一个 enable 标志位,所有发送路径在入队前先检查它,一旦为 false 就直接丢弃并记录,而不是缓存等待。这样做的动机很现实:DISABLED 通常对应设备维护、安全联锁或产线停机,此时任何自动化的远程控制消息都不该被悄悄积压,等恢复后一次性涌出去,那才是真正的翻车现场。

ENABLED 之下又分 COMMUNICATING 和 NOT COMMUNICATING 两个子状态。注意这里的层级关系:ENABLED 是“允许通信”,NOT COMMUNICATING 是“还没建立”。系统初始化时默认进哪个状态,规格书留了口子——默认可以是 DISABLED 也可以是 ENABLED,由设备厂商配置。这个取舍背后是产线习惯差异:有的厂希望设备上电后完全静默,等操作员确认;有的厂希望设备主动找主机。理解这一点,你就明白为什么同一份 GEM 规范,不同设备的“上电表现”可以完全不同,这不是实现偷懒,而是标准故意留的配置空间。

2.2 NOT COMMUNICATING 里的 AND 子状态:主机发起与设备发起并存

NOT COMMUNICATING 状态有两个 AND 子状态:HOST-INITIATED CONNECT 和 EQUIPMENT-INITIATED CONNECT,规格书明确说“当设备不通信时,这两个子状态都是有效的”。这是 Harel 记法里 AND 状态的含义——不是二选一,而是同时活跃。换句话说,设备在等待主机发 S1F13 的同时,自己也在按 CommDelay 定时器周期性地发 S1F13。这种“双向主动”设计是 SECS/GEM 能跨厂商互操作的关键:你永远不知道对面那台主机是主动轮询型还是被动响应型,那就两边都准备着。

设备发起侧的状态转换表值得逐条看。进入 EQUIPMENT-INITIATED CONNECT 时,动作是“初始化通信、把 CommDelay 定时器置为 expired、发送 S1F13”,也就是第一次不等定时器,立刻发。如果连接事务失败,转到 WAIT DELAY,动作是“初始化 CommDelay 定时器、清空所有待发消息队列,必要时按生成顺序放入 spool 缓冲、等待定时器到期”。这里有两个细节:一是失败后不是立刻重试,而是退避一个 CommDelay 周期,避免网络抖动时疯狂重连把主机打挂;二是被清出队列的消息不是丢掉,而是进 spool 缓冲——这就是后面要讲的“后悔药”机制,断连期间产生的事件报告不会凭空消失。

WAIT DELAY 到期后回到 WAIT CRA 再发 S1F13。还有一个容易被忽略的转换:在 WAIT DELAY 期间如果收到一条不是 S1F13 的消息,动作是“丢弃该消息、不回复、把 CommDelay 置为 expired、立即发 S1F13”。这条规则的意思是,只要对面有动静但又不是建立通信的握手,就视为“建立通信的机会来了”,马上主动出击。我一般会这么理解:这是在用最小的状态信息做最快的收敛,而不是死等定时器。

2.3 主机发起侧与 COMMACK:一个字节决定成败

主机发起侧简单得多:进入 HOST-INITIATED CONNECT 后进 WAIT CR FROM HOST,什么都不做,等主机发 S1F13。收到后回 S1F14 且 COMMACK=0,直接进 COMMUNICATING。设备发起侧则是收到 S1F14 且 COMMACK=0 才算成功。COMMACK 这个单字节就是握手确认码,0 表示接受,非 0 表示拒绝(比如设备正忙或配置不匹配)。规格书里 COMMUNICATING 状态遇到通信失败时,动作是“清空待发队列,必要时进 spool 缓冲”,和前面失败路径一致。

这里有个实现层面的坑:很多自研协议栈把“TCP 连接建立”当成 COMMUNICATING,结果主机侧一发 S1F13 就收到一堆乱序消息。正确的做法是严格按状态机走,TCP 只是承载,S1F13/F14 握手才是逻辑通信的起点。规格书里还列了一个相关数据项 ECID,描述是“建立通讯超时 EstablishCommunicationsTimeout”,也就是 CommDelay 的配置来源。这个值设太短会导致重连风暴,设太长会导致产线恢复慢,实际项目里通常按主机侧的重连策略对齐,而不是拍脑袋定。

3. 控制状态模型:OFF-LINE 为什么还要回 S1F17

3.1 OFF-LINE 的响应规则:不是装死,是选择性应答

控制状态模型定义主机和设备之间的协作级别。规格书对 OFF-LINE 的描述很精确:设备对主机发来的任何 primary message,除了 S1F13 和 S1F17,一律回 Sx,F0;而 S1F13 和 S1F17 会被正常处理和响应。Sx,F0 是“中止事务”的通用否定应答,意思是“我现在不接这个活”。这条规则的设计动机是让主机能明确区分“设备离线”和“设备故障”——离线时你发采集命令会收到结构化的拒绝,而不是超时干等。

S1F17 的用途是主机请求设备切到 ON-LINE。也就是说,即使设备处于 OFF-LINE,主机仍然有一条标准通道把它拉回在线,而不需要人去现场按按钮。这个设计在自动化产线里非常实用:夜班无人时主机检测到某台设备掉线,可以直接发 S1F17 尝试恢复。但注意,OFF-LINE 下 S1F13 也要正常响应,因为通信建立和控制状态是两层独立模型——你可以通信已建立但控制上仍离线,这两者不能混为一谈。很多新手把“通信状态”和“控制状态”当成一个东西,结果在 OFF-LINE 时把 S1F13 也拒了,主机侧就永远建不起连接,排查半天以为是网络问题。

3.2 控制状态与通信状态的解耦:两层模型的价值

把通信状态机和控制状态机分开,是 GEM 里一个很值得琢磨的设计取舍。如果合成一个状态机,状态数会爆炸,而且语义会纠缠:通信断了算不算控制离线?设备维护时通信还通不通?分开之后,通信状态只管“消息能不能收发”,控制状态只管“设备听不听主机的操作指令”。这样设备可以在通信正常的情况下保持 OFF-LINE(比如操作员在本地操作面板上锁定了远程控制),也可以在通信断开时本地继续生产。

常见的实现思路是,协议栈收到消息后先过通信状态机(不在 COMMUNICATING 就按规则丢弃或排队),再根据消息类型过控制状态机(OFF-LINE 下只放行 S1F13/S1F17)。两层各自有独立的转换触发条件,互不越权。这种分层在源码里通常表现为两个独立的 state 对象加一个消息分发器,而不是一个大 switch。我见过把两者揉在一起的实现,后期加一个“设备本地锁定”需求就要改十几处判断,血泪经验就是:标准把模型拆开是有道理的,别自作聪明合并。

3.3 设备处理状态:被“错误!未定义书签”掩盖的一层

规格书目录里 2.2 下面有一行“设备处理状态 Equipment Processing States”,后面跟着“错误!未定义书签”。这其实是文档编辑遗留,但从 GEM 标准本身看,设备处理状态是第三层模型,描述设备在加工流程中的状态(比如 idle、processing、paused)。它和控制状态的区别是:控制状态回答“谁在控制”,处理状态回答“设备在干什么”。在实现上,处理状态通常由设备自身的业务逻辑驱动,通过事件报告(Event Notification)上报给主机,而不是靠主机命令直接切换。

这一层的价值在于,主机不需要轮询设备“你在干嘛”,而是订阅事件,设备状态一变就主动推。规格书第 3 章“设备能力及实施”里列的事件通知、变量数据采集、状态数据采集,本质上都是围绕这层处理状态做观测。理解了三层模型的分工,你再看那份 GEM 适应性表里一长串 Yes/No,就知道每一项对应的是哪一层的哪块能力,而不是一堆孤立的勾选框。

4. 事件报告与数据采集:动态配置背后的“订阅”机制

4.1 动态事件报告配置:主机为什么能改设备的报告规则

规格书 3.4 节叫“动态事件报告配置 Dynamic Event Report Configuration”,这是 GEM 里最像“订阅系统”的部分。基本模型是:设备侧有一组预定义的事件(Collection Event)和一组数据变量(Data Variable),主机通过消息把“哪些事件触发时、上报哪些变量”绑定成一个报告(Report),再把报告挂到事件上。关键在于“动态”——这套绑定关系不是烧死在设备里的,主机可以在线增删改。

为什么这么设计?因为不同主机、不同工艺段关心的数据不一样。同一台设备卖给不同产线,如果报告规则固定,要么上报太多冗余数据把网络打满,要么漏掉关键变量。动态配置把“采什么”的决定权交给主机,设备只负责提供事件和变量的清单(Namelist)。规格书 7.3 节列了一串场景:Data Variable Namelist Request、Collection Event Namelist Request、Host Requests Report、Host Initiates Trace Report,就是主机先问“你有哪些变量和事件”,再按名字组装报告。这套“先发现、再订阅”的流程,和现代消息系统里的 topic 发现机制思路一致,只是它跑在 SECS-II 的消息语义上。

实现上,设备侧通常维护三张表:事件表、变量表、报告定义表,外加事件到报告的映射。主机发来的配置消息本质是对这几张表的增删改,改完要保证原子性——要么全生效要么全不生效,否则主机以为配好了、设备只配了一半,后面采集到的数据就对不上。这是排查时的高频问题,后面避坑章节会展开。

4.2 变量、跟踪、状态三类采集的边界

规格书把数据采集拆成三块:Variable Data Collection(变量数据采集)、Trace Data Collection(跟踪数据采集)、Status Data Collection(状态数据采集)。很多人分不清它们的区别,其实从触发方式就能看出设计意图。变量采集是事件驱动的——某个 Collection Event 发生时,把绑定的变量值打包上报,适合“工件进腔”“工艺完成”这类离散时刻。跟踪采集是周期性的——主机指定一个采样周期和一组变量,设备按周期连续上报,适合温度、压力这类随时间变化的曲线数据。状态采集是快照式的——主机主动请求当前状态变量值,适合“你现在什么状态”这种即时查询。

这三者的底层数据结构不同:变量采集依赖事件到报告的映射,跟踪采集依赖一个带定时器的采样任务,状态采集依赖一张可随时读取的状态变量表。规格书 5.1 到 5.3 节分别列了“已实现的事件采集”“已实现的变量数据”“已实现的状态变量”,这就是设备厂商在 GEM 适应性声明里承诺的能力清单。看一份设备规格书,先翻这三节,比看前面一堆状态图更快判断它到底能给你什么数据。

4.3 SML 与消息格式:数据在线上长什么样

规格书 6.2 节提到 SML 语言,6.2.1 是 Data Item Dictionary,6.2.2 是 Data Format。SML 是 SECS Message Language,一种人类可读的消息表示法,用来在文档里描述消息结构,而不是线上传输格式。线上跑的是 SECS-II 的二进制编码,每个数据项带格式字节和长度字节。Data Item Dictionary 定义了这个设备用到的所有数据项的名字、格式和含义,Data Format 则给出具体消息的组装方式。

为什么要有 SML 这一层?因为 SECS-II 的二进制消息直接看是一串十六进制,人和文档都没法维护。SML 把一条消息写成类似S1F13 W加若干列表结构的形式,文档里描述场景时用它,开发时也常拿它做日志的可读化。常见的实现思路是协议栈内部用结构化对象表示消息,序列化时转二进制,日志输出时转 SML,两边共用同一份数据项定义。这样文档里的 SML 示例和实际抓包能对上,排查时不用在二进制和文档之间来回翻译。规格书 7 章那一堆场景(建立通讯、动态报告配置、警报管理、远程控制、处理程序管理、时钟、终端服务),每个场景本质就是几条 SML 消息的时序,看懂 SML 就等于看懂了整份规格书的场景部分。

5. 避坑与排查:SECS/GEM 联调里最常见的五个翻车点

5.1 现象:TCP 通了但主机一直显示设备离线

原因:把 TCP 连接建立当成 COMMUNICATING,没有走 S1F13/S1F14 握手,或者设备侧在 NOT COMMUNICATING 状态下把 S1F13 也按“非握手消息”丢弃了。规格书的转换表写得很清楚,WAIT DELAY 下收到非 S1F13 消息才丢弃,S1F13 本身是要处理的。解决:抓包确认 S1F13 是否发出、S1F14 的 COMMACK 是否为 0;检查状态机是否严格按表转换,别用 TCP 状态替代逻辑状态。

5.2 现象:断网恢复后主机收到一堆过期事件,时间戳全乱

原因:断连期间消息没有进 spool 缓冲,或者进了缓冲但恢复后没按生成顺序重放。规格书在失败路径里明确要求“按生成顺序放入 spool 缓冲”。解决:检查 spool 实现是否保序、是否有容量上限导致静默丢弃;恢复后先确认通信状态进 COMMUNICATING 再放 spool,别在握手完成前就往外灌。

5.3 现象:主机配了报告但采不到数据,Namelist 里明明有

原因:动态报告配置不是原子生效,事件到报告的映射只配了一半;或者变量名大小写、空格和 Namelist 返回的不一致。SECS-II 的 ASCII 数据项对内容敏感,主机侧拼名字时多一个空格就匹配不上。解决:配置后回读报告定义做校验;变量名统一从 Namelist 响应里取,不要手写。

5.4 现象:OFF-LINE 下主机发采集命令全部超时,不是收到 Sx,F0

原因:设备侧在 OFF-LINE 下把消息直接丢了,没有按规格书回 Sx,F0。规格书明确 OFF-LINE 下除 S1F13/S1F17 外要回 Sx,F0。解决:检查控制状态机的消息分发分支,确保否定应答走的是标准 Sx,F0 而不是静默丢弃;主机侧也要能识别 Sx,F0 并区分于超时。

5.5 现象:CommDelay 调小后设备频繁重连,主机侧连接数暴涨

原因:EstablishCommunicationsTimeout 设得太短,失败退避周期不够,设备在 WAIT CRA 和 WAIT DELAY 之间高频震荡。解决:按主机侧的重连窗口对齐这个值,通常要留出主机处理握手的时间;观察抓包里 S1F13 的发送间隔,确认退避真的生效而不是定时器没启动。

6. 设计取舍:为什么 GEM 把“简单”留给了消息,把“复杂”留给了状态

回头看这套规范,一个很明显的取舍是:消息层尽量简单,状态层承担复杂度。SECS-II 的消息就是“流+功能号+数据项”,没有复杂的路由、没有内嵌的会话管理;而通信状态机、控制状态机、处理状态机三层把“什么时候能发、发了算不算数、设备听谁的”全部显式化。这个取舍的动机不难推:半导体设备生命周期长,主机侧软件换了一代又一代,消息格式必须稳定到几十年不变;而状态语义可以按设备能力裁剪,GEM 适应性表里那些 Yes/No 就是裁剪声明。

代价也很明显——状态机的正确性极难靠读文档保证。规格书里大量转换表用 Harel 记法画,AND 子状态、进入动作、定时器初始化这些细节,实现时漏一条就是线上事故。我的习惯是,拿到任何一份 GEM 规格书,先把通信状态转换表逐行抄成测试用例,每条转换至少构造一个触发场景,跑通了再碰业务消息。这套笨办法救过我好几次:有一次设备发起侧在 WAIT DELAY 收到非 S1F13 消息后忘了把 CommDelay 置 expired,导致恢复慢了一个周期,产线那边看着就是“偶尔要等很久才连上”,抓包才定位到。从那以后我每次对接新设备,都强制先把状态转换表跑一遍再谈采集和远程控制。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询