设备控制状态机:EQ 状态与子状态转换
设备控制状态机,说白了就是设备的大脑。它告诉设备现在该干什么,下一步能干什么。我见过不少工程师,一上来就盯着报警码查,结果绕了一大圈,最后发现是状态机卡住了。嗯,今天咱们就把 EQ 的四个主状态——INIT、IDLE、SETUP、PROCESSING,以及它们的子状态和转换逻辑,彻底捋清楚。
四个主状态,一个都不能少
先看这张图,把整体框架印在脑子里:
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(配方加载)触发。设备收到配方后,开始做三件事:
- 解析配方参数——温度、压力、时间、气体流量等
- 参数校验——检查是否在设备允许范围内
- 硬件预置——加热器预热、真空泵启动、气路切换
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,结果又下发了一个新配方,两台设备同时操作同一个腔室,差点造成硬件损坏。
实战排查思路
如果你在现场遇到状态机相关的问题,按这个顺序查:
- 看当前状态——发 S01F03 读设备状态,确认是哪个主状态和子状态
- 查最近一次转换——翻设备日志,看最后一次状态转换是由哪个指令触发的
- 检查子状态标志位——很多问题出在子状态内部的标志位没清干净
- 对比 Host 日志——Host 认为设备在什么状态?两边不一致就是失步
- 手动复位——如果确认是状态机卡死,发 S02F41 带空参数重置状态机
嗯,状态机这东西,看着简单,但坑都在细节里。你只要把每个状态的入口条件、出口条件、子状态逻辑都画清楚,故障定位就能快一大半。