设备控制状态机:EQ 状态与子状态转换

设备控制状态机,说白了就是设备的大脑。它告诉设备现在该干什么,下一步能干什么。我见过不少工程师,一上来就盯着报警码查,结果绕了一大圈,最后发现是状态机卡住了。嗯,今天咱们就把 EQ 的四个主状态——INIT、IDLE、SETUP、PROCESSING,以及它们的子状态和转换逻辑,彻底捋清楚。

四个主状态,一个都不能少

先看这张图,把整体框架印在脑子里:

设备控制状态机(EQSM)主状态与转换 INIT IDLE SETUP PROCESSING 初始化完成 S02F41 建立配方 SETUP 完成 S07F01 启动加工 加工结束 / 异常终止 注意 INIT 只能进入 IDLE IDLE 可跳 SETUP SETUP 可回 IDLE PROCESSING 只能回 IDLE

INIT:设备刚醒来的状态

设备上电后,第一站就是 INIT。这时候设备在干嘛?自检、加载参数、初始化硬件。说白了,就是设备在「伸懒腰」。

INIT 状态下的关键行为:

  • 设备不响应加工指令,只响应控制类指令(S01、S02 等)
  • 内部变量全部复位,通信端口初始化
  • 完成后自动发 S01F01 给 Host,然后跳转到 IDLE
我的经验: 如果设备卡在 INIT 超过 30 秒,八成是硬件自检没通过。我遇到过一台刻蚀机,每次上电都卡 INIT,查了三天发现是冷却水流量传感器信号线松了。别急着怀疑软件,先看硬件反馈。

IDLE:待命状态,但别小看它

IDLE 是设备最常待的状态。设备准备好了,但没干活。这时候 Host 可以发指令查询状态、修改参数、下发配方。

IDLE 的子状态,我习惯叫它「空闲中的小状态」:

子状态 含义 典型场景
IDLE_READY 设备就绪,可接收配方 刚完成初始化,无异常
IDLE_WAITING 等待外部条件满足 等待安全门关闭、等待真空度达标
IDLE_ALARM 存在未清除的报警 前一次加工残留报警未复位
避坑指南: 我曾经遇到一个案例,设备一直报 IDLE_ALARM,但报警列表是空的。后来发现是状态机内部有一个「报警残留标志位」没清掉。Host 发了 S05F01 清除报警,但设备没响应。最后手动发 S02F41 重置状态机才解决。记住:IDLE_ALARM 不等于一定有报警,可能是状态机内部脏数据。

SETUP:配方的加载与验证

从 IDLE 到 SETUP,通常由 S02F41(配方加载)触发。设备收到配方后,开始做三件事:

  1. 解析配方参数——温度、压力、时间、气体流量等
  2. 参数校验——检查是否在设备允许范围内
  3. 硬件预置——加热器预热、真空泵启动、气路切换

SETUP 也有子状态:

  • SETUP_LOADING:正在加载配方数据,此时设备不响应其他指令
  • SETUP_VERIFY:参数校验中,如果参数超限,会报 S05F01 并回退到 IDLE
  • SETUP_READY:配方加载完成,等待启动信号

关键点: SETUP 完成后,设备可以回 IDLE(比如操作员取消),也可以进 PROCESSING(收到 S07F01)。但不能从 SETUP 直接跳回 INIT,这是协议不允许的。如果看到这种跳转,说明状态机代码有 bug。

PROCESSING:真正干活的状态

设备进入 PROCESSING,意味着晶圆开始被加工了。这个状态最复杂,也最容易出问题。

PROCESSING 的子状态,我按实际项目经验整理如下:

子状态 说明 常见故障
PROC_START 启动加工,发送 S07F03 给 Host Host 没收到开始事件
PROC_RUNNING 加工进行中,设备按配方步骤执行 参数漂移、超时
PROC_PAUSE 暂停加工(如安全门打开) 恢复后状态机卡住
PROC_ABORT 异常终止,设备紧急停止 报警未正确上报
PROC_COMPLETE 加工完成,发送 S07F05 完成事件丢失
我的习惯: 调试 PROCESSING 状态时,我会在 Host 端同时抓 S07F03(开始)和 S07F05(完成)两个事件。如果只收到开始没收到完成,那问题大概率在设备端的状态机里。有一次我排查了整整两天,最后发现是 PROC_COMPLETE 子状态里少发了一条 S07F05 的响应。

状态转换的常见故障模式

说几个我现场遇到过的真实案例:

  • INIT 卡死:设备上电后一直发 S01F00,但 Host 没回应。检查发现是网线插错了交换机端口。
  • IDLE 无法跳 SETUP:Host 发了 S02F41,设备没反应。原因是设备内部有一个「配方锁」标志位没释放,需要先发 S02F40 解锁。
  • SETUP 回退 IDLE 后丢参数:配方加载到一半被取消,再加载时发现参数不全。我建议在 SETUP_LOADING 子状态里加一个「配方缓存区」,取消时不直接清空,而是保留最后一份完整数据。
  • PROCESSING 无法正常结束:加工完成后设备一直停在 PROC_RUNNING。查日志发现是某个步骤的「完成标志位」没置位,原因是传感器信号抖动导致状态机漏判了一个 edge。
重要提醒: 状态机转换必须严格遵循 SEMI E30 定义的合法路径。任何非法跳转(比如 PROCESSING 直接回 INIT)都会导致 Host 和设备失步。我见过最严重的后果是——设备在加工中,Host 以为它还在 IDLE,结果又下发了一个新配方,两台设备同时操作同一个腔室,差点造成硬件损坏。

实战排查思路

如果你在现场遇到状态机相关的问题,按这个顺序查:

  1. 看当前状态——发 S01F03 读设备状态,确认是哪个主状态和子状态
  2. 查最近一次转换——翻设备日志,看最后一次状态转换是由哪个指令触发的
  3. 检查子状态标志位——很多问题出在子状态内部的标志位没清干净
  4. 对比 Host 日志——Host 认为设备在什么状态?两边不一致就是失步
  5. 手动复位——如果确认是状态机卡死,发 S02F41 带空参数重置状态机

嗯,状态机这东西,看着简单,但坑都在细节里。你只要把每个状态的入口条件、出口条件、子状态逻辑都画清楚,故障定位就能快一大半。