3、GEM状态模型:设备状态模型、控制状态模型、处理状态模型

GEM 协议里最绕人的,就是这三套状态模型。我刚接触的时候也懵过——设备一个状态,控制一个状态,处理又一个状态,它们到底谁管谁?

说白了,这三套模型分别回答了三个问题:

  • 设备状态模型:设备现在能不能干活?
  • 控制状态模型:谁有权限让设备干活?
  • 处理状态模型:设备正在干什么活?

你想想看,一台半导体设备在产线上,必须同时回答这三个问题,才能被 MES 系统正确调度。下面我一个一个拆开讲。

3.1 设备状态模型

设备状态模型描述的是设备整体的「可用性」。它只有三个状态,但每个状态之间的跳转逻辑,我在项目里踩过不少坑。

状态 含义 典型场景
EQUIPMENT_STATE_OFF 设备断电或完全不可用 设备关机、维护中、故障断电
EQUIPMENT_STATE_IDLE 设备已上电,但未开始生产 待机、等待配方、等待物料
EQUIPMENT_STATE_RUNNING 设备正在执行生产任务 正在加工晶圆、正在传输

关键跳转规则:

  • OFF → IDLE:设备上电自检完成,上报 ONLINE 事件。
  • IDLE → RUNNING:收到 START 命令,开始处理。
  • RUNNING → IDLE:处理完成或异常停止,上报 IDLE 事件。
  • 任何状态 → OFF:设备断电或发生不可恢复故障。

我曾经在一个项目中,设备在 IDLE 状态下收到了非法命令,结果状态机卡死了。后来我养成了一个习惯——所有状态跳转都要做合法性校验,不合法的命令直接返回错误码,绝不执行。

3.2 控制状态模型

控制状态模型解决的是「权限」问题。GEM 协议里,设备可以被三种角色控制:

  • 本地控制(Local):操作员在设备面板上操作。
  • 远程控制(Remote):MES 或上位机通过 GEM 协议控制。
  • 自动控制(Auto):设备内部逻辑自动运行。
控制状态 说明 谁有操作权
LOCAL 本地控制模式 操作员面板
REMOTE 远程控制模式 MES / 上位机
AUTO 自动控制模式 设备内部逻辑

我的经验: 控制状态模型最容易出问题的地方是「状态切换时的命令冲突」。比如设备在 LOCAL 模式下,MES 发来一个 START 命令,设备应该直接拒绝还是先切换模式?我建议的做法是:先检查当前控制状态,如果不匹配,返回 COMMAND_NOT_ACCEPTABLE,让 MES 先发 SET_CONTROL_STATE 切换模式。

3.3 处理状态模型

处理状态模型描述的是设备当前正在执行的「具体任务」。它比设备状态模型更细粒度,通常包含以下状态:

  • PROCESS_STATE_IDLE:空闲,等待任务。
  • PROCESS_STATE_SETUP:正在加载配方或参数。
  • PROCESS_STATE_PROCESSING:正在加工。
  • PROCESS_STATE_PAUSED:暂停(可恢复)。
  • PROCESS_STATE_ABORTED:中止(不可恢复)。
  • PROCESS_STATE_COMPLETE:任务完成。

注意: 处理状态模型和设备状态模型是「父子关系」。设备状态为 RUNNING 时,处理状态可以是 PROCESSING、PAUSED 或 COMPLETE。但设备状态为 IDLE 时,处理状态只能是 IDLE 或 SETUP。我曾经见过一个项目,设备状态是 IDLE,但处理状态却是 PROCESSING,这明显是状态机实现有 bug。

3.4 三模型关系图

下面这张图展示了三个状态模型之间的层级关系和数据流向。我建议你把它打印出来贴在工位上。

GEM 三状态模型关系图 GEM 三状态模型关系图 设备状态模型 OFF IDLE RUNNING 设备可用性 控制状态模型 LOCAL REMOTE AUTO 操作权限 处理状态模型 IDLE SETUP PROCESSING PAUSED COMPLETE 具体任务 说明:设备状态决定「能不能干活」,控制状态决定「谁让干活」,处理状态决定「在干什么活」。 三者独立但协同,共同构成 GEM 状态机核心。

3.5 状态同步与事件上报

状态模型不是静态的,它们需要实时同步给 MES。GEM 协议通过事件(Event)来通知状态变化。

常用事件列表:

  • ONLINE:设备从 OFF 变为 IDLE。
  • OFFLINE:设备从任何状态变为 OFF。
  • START:设备从 IDLE 变为 RUNNING。
  • IDLE:设备从 RUNNING 变为 IDLE。
  • CONTROL_STATE_CHANGE:控制状态切换。
  • PROCESS_STATE_CHANGE:处理状态切换。

我记得有一次,设备上报了 PROCESS_STATE_CHANGE 事件,但 MES 没收到,导致产线以为设备还在加工,实际上已经完成了。后来我强制要求:所有状态变化事件必须等待 MES 的 ACK 确认,超时重发 3 次,否则报警。

3.6 状态机实现要点

如果你要自己实现 GEM 状态机,下面这几点是我用真金白银换来的教训:

  1. 状态表驱动:不要用 if-else 硬编码状态跳转,用状态表 + 事件驱动的方式,方便后期维护。
  2. 状态合法性校验:每个状态跳转前,检查当前状态是否允许该跳转。
  3. 事件队列:状态变化事件要放入队列,按顺序发送,避免并发问题。
  4. 超时机制:MES 没响应时,设备不能一直等,要有超时重试和报警逻辑。
  5. 日志记录:每次状态变化都要记录时间戳、旧状态、新状态、触发源,方便排查问题。

我的习惯: 我会在设备启动时,把三套状态模型的初始值都打印到日志里。这样一旦出问题,我能立刻知道设备是从什么状态开始跑的,省去很多猜测时间。

3.7 常见问题与避坑

问题 原因 解决方案
设备状态与处理状态不一致 状态机实现有遗漏 增加状态一致性校验
MES 收不到状态变化事件 网络丢包或事件未排队 引入事件队列 + ACK 机制
控制状态切换失败 权限冲突或命令顺序错误 先检查当前状态,再执行切换
状态机卡死 非法命令未处理 所有命令做合法性校验

嗯,状态模型这部分内容比较多,但它是 GEM 协议的骨架。你只要把这三套模型的关系理清楚,后面的通信、数据处理、异常处理都会顺很多。我个人建议你先把这张关系图背下来,再去看代码实现,会事半功倍。