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 消息。

GEM 设备状态机迁移图 GEM 六状态迁移模型 DEVIDLE EQUIPMENT_OFF ATTEMPT_ONLINE HOST_CONNECT ONLINE_LOCAL ONLINE_REMOTE 初始化完成 自动上线请求 S1F13 发起 TCP 连接建立 S1F14 协商 → 本地模式 S1F14 协商 → 远程模式 S2F17 远程控制 S2F17 本地控制 说明: • 实线箭头表示正向迁移路径,虚线箭头(此处未展示)表示异常或强制复位路径。 • 从 ONLINE_LOCAL 或 ONLINE_REMOTE 可直接返回 EQUIPMENT_OFF(本地复位或主机断开)。

3.3 状态迁移的触发条件

每个状态迁移都由特定的 SECS 消息或设备内部事件触发。以下是关键迁移路径的详细说明:

  1. DEVIDLE → EQUIPMENT_OFF:设备完成内部初始化(如加载配置文件、自检通过),进入离线就绪状态。
  2. DEVIDLE → ATTEMPT_ONLINE:设备配置为自动上线模式,启动后立即发送 S1F13(Establish Communications Request)。
  3. EQUIPMENT_OFF → ATTEMPT_ONLINE:操作员按下“上线”按钮,或主机发送 S1F1(Are You There?)触发设备响应。
  4. ATTEMPT_ONLINE → HOST_CONNECT:TCP/IP 三次握手成功,设备收到主机确认。
  5. HOST_CONNECT → ONLINE_LOCAL / ONLINE_REMOTE:主机回复 S1F14(Establish Communications Response),其中包含控制模式参数(MDLN 和 SOFTREV 协商)。
  6. 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 更易于维护和扩展,特别是当需要支持自定义状态或迁移规则时。