首页 / 资讯中心 / 文章详情

SECS/GEM通信状态机详解:从DISABLED到COMMUNICATING的握手与避坑

SECS/GEM通信状态机详解:从DISABLED到COMMUNICATING的握手与避坑 ★ FEATURED ARTICLE
简介这份PDF文档面向半导体设备自动化领域的工程师与开发人员系统讲解SECS/GEMSEMI设备通信标准/通用设备模型协议规范帮助读者理解设备与主机系统之间的标准化数据通信机制解决不同厂商设备互联互通的问题。文档以广州金南瓜科技的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 且 COMMACK0直接进 COMMUNICATING。设备发起侧则是收到 S1F14 且 COMMACK0 才算成功。COMMACK 这个单字节就是握手确认码0 表示接受非 0 表示拒绝比如设备正忙或配置不匹配。规格书里 COMMUNICATING 状态遇到通信失败时动作是“清空待发队列必要时进 spool 缓冲”和前面失败路径一致。这里有个实现层面的坑很多自研协议栈把“TCP 连接建立”当成 COMMUNICATING结果主机侧一发 S1F13 就收到一堆乱序消息。正确的做法是严格按状态机走TCP 只是承载S1F13/F14 握手才是逻辑通信的起点。规格书里还列了一个相关数据项 ECID描述是“建立通讯超时 EstablishCommunicationsTimeout”也就是 CommDelay 的配置来源。这个值设太短会导致重连风暴设太长会导致产线恢复慢实际项目里通常按主机侧的重连策略对齐而不是拍脑袋定。3. 控制状态模型OFF-LINE 为什么还要回 S1F173.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 Dictionary6.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导致恢复慢了一个周期产线那边看着就是“偶尔要等很久才连上”抓包才定位到。从那以后我每次对接新设备都强制先把状态转换表跑一遍再谈采集和远程控制。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站