3. GEM 设备状态模型:核心状态定义
GEM(Generic Equipment Model)标准定义了半导体设备必须实现的一组有限状态机(Finite State Machine, FSM),用于规范设备在通信与自动化环境中的行为。设备状态模型是 GEM 功能验证的基石,所有 SECS 消息的收发、控制权限的切换、报警与事件的上报,都必须在正确的设备状态下执行。
核心概念: GEM 设备状态模型包含 5 个主要状态:INIT、NOT_READY、READY、LOCAL、REMOTE。其中 LOCAL 和 REMOTE 属于控制状态(Control State),INIT、NOT_READY、READY 属于通信状态(Communication State)。设备在任何时刻都同时处于一个通信状态和一个控制状态。
3.1 通信状态(Communication State)
通信状态描述设备与主机(Host)之间的连接与数据交换能力。GEM 定义了三种通信状态:
| 状态 | 缩写 | 定义 | 典型行为 |
|---|---|---|---|
| INIT | 初始态 | 设备上电或复位后的初始状态,尚未建立与主机的通信链路。 | 设备自检、加载配置;不响应 SECS 消息;等待连接建立。 |
| NOT_READY | 未就绪 | 设备已与主机建立连接,但尚未完成初始化协商或处于离线维护模式。 | 可接收部分管理消息(如 S1F13/F14);不处理生产相关指令。 |
| READY | 就绪 | 设备已完成初始化,与主机通信正常,可接收并执行所有 GEM 消息。 | 正常生产通信;支持数据收集、报警、远程控制等全部功能。 |
验证要点: 在 GEM 符合性测试中,必须验证设备能否在 INIT 状态下正确响应 S1F13(Establish Communications Request),并在收到 S1F14 后正确迁移到 NOT_READY 或 READY 状态。
3.2 控制状态(Control State)
控制状态决定设备操作权限的归属——是由本地操作员控制,还是由远程主机控制。GEM 定义了两种控制状态:
| 状态 | 定义 | 控制权归属 | 典型场景 |
|---|---|---|---|
| LOCAL | 本地控制 | 设备面板/本地操作员 | 设备调试、维护、手动操作;主机仅可读取状态,不可下发控制指令。 |
| REMOTE | 远程控制 | 主机(Host) | 自动化生产线;主机可下发启动、停止、参数设置等控制指令。 |
安全约束: 从 REMOTE 切换到 LOCAL 必须经过操作员确认(通常通过硬件钥匙开关或软件确认对话框),防止主机意外断开导致设备失控。GEM 标准要求设备在 REMOTE 状态下必须支持 S2F17/F18(Remote Command)消息。
3.3 状态组合与迁移
设备在任何时刻都处于一个通信状态与一个控制状态的组合。GEM 标准定义了 6 种有效组合(3 种通信状态 × 2 种控制状态),但实际设备通常只使用以下 4 种常见组合:
- INIT + LOCAL:上电初始,本地控制
- NOT_READY + LOCAL:连接建立但未就绪,本地维护
- READY + LOCAL:通信正常,本地操作
- READY + REMOTE:通信正常,远程自动化控制(生产模式)
以下 SVG 图展示了 GEM 设备状态机的核心状态迁移路径:
3.4 状态迁移触发条件
设备状态迁移由特定事件或 SECS 消息触发。以下是主要迁移路径的触发条件:
- INIT → NOT_READY:设备收到并响应 S1F13(Establish Communications Request),发送 S1F14 后进入 NOT_READY。
- NOT_READY → READY:设备完成内部初始化(如加载配方、校准传感器),自动迁移到 READY。
- READY → NOT_READY:设备发生严重故障、通信中断或收到 S1F15(Request OFF-LINE)消息。
- LOCAL → REMOTE:主机发送 S2F17(Remote Command)且设备允许远程控制。
- REMOTE → LOCAL:操作员在设备面板上切换控制模式(通常需要硬件确认)。
验证清单: 在 GEM 功能验证中,必须逐项测试以下状态迁移场景:
• 上电后设备是否进入 INIT+LOCAL
• 主机发送 S1F13 后设备是否迁移到 NOT_READY
• 设备初始化完成后是否自动进入 READY
• 在 READY 状态下主机能否通过 S2F17 切换到 REMOTE
• 操作员能否从 REMOTE 切换回 LOCAL
• 上电后设备是否进入 INIT+LOCAL
• 主机发送 S1F13 后设备是否迁移到 NOT_READY
• 设备初始化完成后是否自动进入 READY
• 在 READY 状态下主机能否通过 S2F17 切换到 REMOTE
• 操作员能否从 REMOTE 切换回 LOCAL
3.5 状态相关的 GEM 功能约束
不同设备状态下,GEM 功能的可用性有严格约束。以下表格总结了核心功能在各状态下的支持情况:
| GEM 功能 | INIT | NOT_READY | READY | LOCAL | REMOTE |
|---|---|---|---|---|---|
| 建立通信(S1F13/F14) | ✓ 必须 | — | — | — | — |
| 数据收集(S6F11/F12) | ✗ | ✗ | ✓ | ✓ | ✓ |
| 报警管理(S5F1/F2) | ✗ | ✓ 仅清除 | ✓ | ✓ | ✓ |
| 远程命令(S2F17/F18) | ✗ | ✗ | ✓ | ✗ | ✓ |
| 变量读取(S2F13/F14) | ✗ | ✓ 部分 | ✓ | ✓ | ✓ |
设计建议: 在设备软件架构中,建议将状态机实现为一个独立模块,所有 SECS 消息处理函数在执行前先检查当前设备状态。如果消息在当前状态下不允许,应返回 S9F1(Unrecognized Device ID)或 S9F5(Invalid Message Type)错误响应。
3.6 状态机实现示例(伪代码)
以下伪代码展示了设备状态机的基本实现框架:
// 设备状态枚举
enum CommState { INIT, NOT_READY, READY };
enum ControlState { LOCAL, REMOTE };
// 设备状态结构体
struct DeviceState {
CommState comm;
ControlState ctrl;
};
// 状态迁移函数
bool transitionTo(DeviceState& current, CommState newComm, ControlState newCtrl) {
// 验证迁移合法性
if (current.comm == INIT && newComm == NOT_READY) {
// 允许:收到 S1F13 响应
} else if (current.comm == NOT_READY && newComm == READY) {
// 允许:初始化完成
} else if (current.ctrl == LOCAL && newCtrl == REMOTE) {
// 允许:收到 S2F17 且设备支持远程
} else {
return false; // 非法迁移
}
// 执行迁移
current.comm = newComm;
current.ctrl = newCtrl;
// 触发状态变更事件
onStateChanged(current);
return true;
}
// SECS 消息处理示例
void handleS1F13(DeviceState& state) {
if (state.comm == INIT) {
transitionTo(state, NOT_READY, state.ctrl);
sendS1F14(); // 发送确认响应
} else {
sendS9F5(); // 发送错误响应
}
}
常见错误: 在 GEM 验证中,经常发现设备在 NOT_READY 状态下错误地执行了远程命令(S2F17),或者在 LOCAL 状态下响应了主机下发的控制指令。这些行为违反了 GEM 状态模型,会导致验证失败。务必在代码中实现严格的状态检查。