3. 设备状态模型基础:GEM定义的设备状态机
GEM(Generic Equipment Model)协议为半导体设备定义了一套标准的状态机模型,用于描述设备在不同运行阶段的行为模式。理解这六个核心状态及其迁移规则,是实现设备模式切换与链路恢复的理论基础。
3.1 六种设备状态概述
GEM 将设备抽象为以下六种互斥状态,设备在任何时刻只能处于其中一种状态:
| 状态名称 | 缩写 | 核心含义 | 典型场景 |
|---|---|---|---|
| DEVIDLE | DI | 设备未初始化,通信链路未建立 | 设备首次上电、复位后未配置 |
| EQUIPMENT_OFF | EO | 设备已初始化但处于离线状态,不接受远程控制 | 设备维护模式、本地操作面板锁定 |
| ATTEMPT_ONLINE | AO | 设备正在尝试与主机建立在线连接 | 设备启动后自动发起 S1F13/F14 握手 |
| HOST_CONNECT | HC | 设备已与主机建立 TCP/IP 连接,但尚未完成 GEM 在线协商 | 物理链路已通,等待 S1F13 响应 |
| ONLINE_LOCAL | OL | 设备在线,但控制权在本地操作员手中 | 操作员在本地面板操作,主机仅监控 |
| ONLINE_REMOTE | OR | 设备在线,控制权完全由主机掌握 | 全自动化生产运行,主机下发配方 |
关键区分: ONLINE_LOCAL 与 ONLINE_REMOTE 的区别在于控制权的归属。前者允许本地操作员干预,后者则完全由主机控制。设备在 ONLINE_REMOTE 状态下,本地面板的某些操作会被锁定或需要主机授权。
3.2 状态机迁移图
下图展示了 GEM 定义的六种状态之间的标准迁移路径。箭头上的标签表示触发迁移的典型事件或 SECS 消息。
3.3 状态迁移的触发条件
每个状态迁移都由特定的 SECS 消息或设备内部事件触发。以下是关键迁移路径的详细说明:
- DEVIDLE → EQUIPMENT_OFF:设备完成内部初始化(如加载配置文件、自检通过),进入离线就绪状态。
- DEVIDLE → ATTEMPT_ONLINE:设备配置为自动上线模式,启动后立即发送 S1F13(Establish Communications Request)。
- EQUIPMENT_OFF → ATTEMPT_ONLINE:操作员按下“上线”按钮,或主机发送 S1F1(Are You There?)触发设备响应。
- ATTEMPT_ONLINE → HOST_CONNECT:TCP/IP 三次握手成功,设备收到主机确认。
- HOST_CONNECT → ONLINE_LOCAL / ONLINE_REMOTE:主机回复 S1F14(Establish Communications Response),其中包含控制模式参数(MDLN 和 SOFTREV 协商)。
- ONLINE_LOCAL ↔ ONLINE_REMOTE:通过 S2F17(Set Control Mode)消息切换,主机或本地均可发起请求。
实践要点: 在 ATTEMPT_ONLINE 状态,设备应设置超时定时器(通常为 10-30 秒)。若超时未收到主机响应,设备应返回 EQUIPMENT_OFF 并记录错误日志,避免无限等待。
3.4 状态与通信能力的映射
不同状态下,设备对 SECS 消息的处理能力不同。下表总结了各状态下的通信行为:
| 状态 | 可接收消息 | 可发送消息 | 是否允许数据处理 |
|---|---|---|---|
| DEVIDLE | 无(链路未建立) | 无 | 否 |
| EQUIPMENT_OFF | S1F1, S1F13 | S1F0, S1F2, S1F14 | 否 |
| ATTEMPT_ONLINE | S1F14, S1F0 | S1F13 | 否 |
| HOST_CONNECT | S1F14, S1F0 | S1F13 | 否 |
| ONLINE_LOCAL | 所有标准消息 | 所有标准消息 | 是(本地控制) |
| ONLINE_REMOTE | 所有标准消息 | 所有标准消息 | 是(远程控制) |
3.5 状态机与链路恢复的关系
设备状态机是链路恢复策略的核心依据。当通信链路中断时,设备的状态迁移路径决定了恢复行为:
- 链路中断发生在 ONLINE_REMOTE 或 ONLINE_LOCAL:设备应检测到心跳超时(S1F1/S1F2 无响应),自动迁移至 ATTEMPT_ONLINE 或 EQUIPMENT_OFF,并尝试重新建立连接。
- 链路中断发生在 ATTEMPT_ONLINE:设备应重置 TCP 连接,重新发起 S1F13 握手。
- 恢复成功:设备从 ATTEMPT_ONLINE → HOST_CONNECT → 回到之前的控制模式(LOCAL 或 REMOTE)。
- 恢复失败:设备应停留在 EQUIPMENT_OFF,等待人工干预或定时重试。
常见陷阱: 部分实现中,设备在链路恢复后默认进入 ONLINE_LOCAL 而非 ONLINE_REMOTE,导致主机无法自动下发配方。正确的做法是在 S1F14 协商时记录上次的控制模式,并在恢复后优先尝试恢复为 ONLINE_REMOTE。
3.6 状态机实现的代码示例
以下是一个简化的 C 语言状态机实现片段,展示状态迁移的核心逻辑:
typedef enum {
DEVIDLE,
EQUIPMENT_OFF,
ATTEMPT_ONLINE,
HOST_CONNECT,
ONLINE_LOCAL,
ONLINE_REMOTE
} DeviceState;
DeviceState current_state = DEVIDLE;
void handle_event(Event event) {
switch (current_state) {
case DEVIDLE:
if (event == INIT_COMPLETE) {
current_state = EQUIPMENT_OFF;
} else if (event == AUTO_ONLINE_REQ) {
current_state = ATTEMPT_ONLINE;
send_S1F13();
}
break;
case EQUIPMENT_OFF:
if (event == S1F13_RECEIVED) {
current_state = ATTEMPT_ONLINE;
send_S1F14();
}
break;
case ATTEMPT_ONLINE:
if (event == TCP_CONNECTED) {
current_state = HOST_CONNECT;
} else if (event == TIMEOUT) {
current_state = EQUIPMENT_OFF;
log_error("Online attempt timeout");
}
break;
case HOST_CONNECT:
if (event == S1F14_RECEIVED) {
if (control_mode == LOCAL) {
current_state = ONLINE_LOCAL;
} else {
current_state = ONLINE_REMOTE;
}
}
break;
case ONLINE_LOCAL:
if (event == S2F17_REMOTE) {
current_state = ONLINE_REMOTE;
} else if (event == LINK_LOST) {
current_state = ATTEMPT_ONLINE;
reconnect();
}
break;
case ONLINE_REMOTE:
if (event == S2F17_LOCAL) {
current_state = ONLINE_LOCAL;
} else if (event == LINK_LOST) {
current_state = ATTEMPT_ONLINE;
reconnect();
}
break;
}
}
设计建议: 实际产品中,建议将状态机与超时管理、重试计数器解耦。使用状态表驱动的方式(State Table)比 switch-case 更易于维护和扩展,特别是当需要支持自定义状态或迁移规则时。