3. GEM核心状态定义:INIT、DISABLED、ENABLED、LOCAL、REMOTE详解

GEM(Generic Equipment Model)状态机是设备与主机(Host)通信的行为骨架。设备在任何时刻都处于且仅处于一个GEM状态,该状态决定了设备是否接受远程命令、是否允许本地操作、以及是否上报事件。理解这五个核心状态是进行联调的基础。

核心原则: GEM状态机是一个有限状态机(FSM),状态迁移由设备内部条件或外部指令触发。错误的迁移逻辑会导致通信中断或数据丢失。

3.1 状态总览与对比

下表列出了五个核心状态的名称、代码、主要特征及典型应用场景:

状态名称 状态代码 是否允许远程控制 是否允许本地操作 典型场景
INIT 0 否 否 设备上电、初始化参数、自检
DISABLED 1 否 是(受限) 维护模式、安全互锁、手动调试
ENABLED 2 视LOCAL/REMOTE而定 视LOCAL/REMOTE而定 生产就绪,等待控制权分配
LOCAL 2 + LOCAL标志 否 是 操作员面板控制、配方编辑
REMOTE 2 + REMOTE标志 是 否(通常) 主机自动调度、自动化生产
注意: ENABLED 是一个复合状态,它必须与 LOCAL 或 REMOTE 组合使用。设备不可能处于“ENABLED但既不是LOCAL也不是REMOTE”的状态。

3.2 状态详解

3.2.1 INIT 状态(初始化)

INIT 是设备上电或复位后的第一个状态。在此状态下,设备执行内部初始化、加载配置、自检硬件。通信链路可能尚未建立,或仅能响应有限的消息。

  • 进入条件: 设备上电、硬件复位、看门狗超时复位。
  • 允许操作: 仅限内部初始化逻辑,不处理生产命令。
  • 退出条件: 初始化成功 → 自动迁移至 DISABLED 或 ENABLED(取决于配置)。
  • 常见问题: 初始化失败时设备应停留在 INIT 并上报错误,而非强制进入其他状态。

3.2.2 DISABLED 状态(禁用)

DISABLED 是设备的安全/维护状态。在此状态下,设备拒绝所有来自主机的远程控制命令,但允许本地操作员进行维护、校准或故障排除。

  • 进入条件: 从 INIT 迁移、操作员按下“维护”按钮、安全门打开、主机发送 S2F17 (Disable)。
  • 允许操作: 本地手动操作、参数查看、传感器校准。
  • 禁止操作: 远程启动、远程配方下载、自动搬运。
  • 退出条件: 操作员确认安全 → 迁移至 ENABLED;或主机发送 S2F15 (Enable)。
安全提示: 在 DISABLED 状态下,设备必须确保所有运动部件处于安全停止状态。联调时需验证主机无法通过远程命令绕过此状态。

3.2.3 ENABLED 状态(使能)

ENABLED 是设备生产就绪的基态。它本身不决定控制权,而是作为 LOCAL 和 REMOTE 的父状态。设备处于 ENABLED 时,通信链路正常,事件上报功能激活。

  • 进入条件: 从 DISABLED 迁移(通过 Enable 命令或本地操作)。
  • 子状态: 必须立即进入 LOCAL 或 REMOTE。
  • 关键行为: 设备开始上报 CEID(收集事件ID),状态机迁移事件也会上报。

3.2.4 LOCAL 状态(本地控制)

LOCAL 表示设备由本地操作员或面板控制。主机只能读取数据,不能发送控制命令。

  • 进入条件: 操作员通过面板选择“本地模式”;主机发送 S2F15 且设备配置允许本地优先。
  • 允许操作: 操作员启动/停止、修改配方、手动搬运。
  • 主机限制: 主机发送 S2F41 (Remote Command) 会被拒绝,返回 S2F42 错误码。
  • 退出条件: 操作员切换至远程;主机请求远程控制且设备策略允许。

3.2.5 REMOTE 状态(远程控制)

REMOTE 表示设备由主机(Host)完全控制。这是自动化生产的目标状态。

  • 进入条件: 主机发送 S2F15 (Enable Remote);设备从 LOCAL 切换。
  • 允许操作: 主机发送 S2F41 执行远程命令、下载配方、控制工艺参数。
  • 本地限制: 操作员面板通常被锁定,仅允许紧急停止。
  • 退出条件: 操作员强制切换至 LOCAL;主机发送 S2F17 (Disable);设备故障。

3.3 状态迁移图

下图展示了五个核心状态之间的标准迁移路径。箭头上的标签表示触发迁移的事件或命令。

GEM核心状态迁移图 GEM 核心状态迁移图 INIT DISABLED ENABLED LOCAL REMOTE 初始化完成 快速启动 S2F15 / 本地使能 S2F17 / 安全门 本地模式选择 远程模式选择 模式切换命令 图例说明 ● 蓝色:INIT 初始状态 ● 红色:DISABLED 禁用 ● 绿色:ENABLED 使能 ● 紫色:LOCAL / 橙色:REMOTE

3.4 状态机联调实战要点

在联调过程中,需要重点验证以下场景:

  1. 上电初始化: 确认设备上电后进入 INIT,并在 5 秒内迁移至 DISABLED 或 ENABLED。
  2. 远程使能/禁用: 使用 SECS 调试工具发送 S2F15 和 S2F17,观察设备状态是否按预期迁移。
  3. 本地/远程切换: 模拟操作员面板切换,验证主机是否收到 S6F11 事件上报(如 CEID=101 状态变更事件)。
  4. 异常处理: 在 REMOTE 状态下模拟通信中断,设备应自动回退至 LOCAL 或 DISABLED,并保持安全。
联调检查清单:
  • ✓ 每个状态迁移都触发对应的事件上报。
  • ✓ 主机在 DISABLED 状态下发送远程命令,设备返回 S2F42 错误码 0x0001(拒绝)。
  • ✓ 设备在 LOCAL 状态下,操作员面板的启动按钮有效;在 REMOTE 状态下无效。
  • ✓ 状态机迁移时间不超过 100ms(通常要求)。

3.5 状态机实现代码示例

以下是一个简化的 C 语言状态机实现片段,展示了状态迁移的核心逻辑:

typedef enum {
    GEM_STATE_INIT      = 0,
    GEM_STATE_DISABLED  = 1,
    GEM_STATE_ENABLED   = 2,
    GEM_STATE_LOCAL     = 3,
    GEM_STATE_REMOTE    = 4
} GemState;

GemState current_state = GEM_STATE_INIT;

void gem_state_machine(GemEvent event) {
    switch (current_state) {
        case GEM_STATE_INIT:
            if (event == EVENT_INIT_COMPLETE) {
                current_state = GEM_STATE_DISABLED;
                // 上报状态变更事件
                gem_report_event(CEID_STATE_CHANGE, current_state);
            }
            break;

        case GEM_STATE_DISABLED:
            if (event == EVENT_ENABLE) {
                current_state = GEM_STATE_ENABLED;
                // 默认进入 LOCAL
                current_state = GEM_STATE_LOCAL;
                gem_report_event(CEID_STATE_CHANGE, current_state);
            }
            break;

        case GEM_STATE_LOCAL:
            if (event == EVENT_REMOTE_REQUEST) {
                current_state = GEM_STATE_REMOTE;
                gem_report_event(CEID_STATE_CHANGE, current_state);
            }
            break;

        case GEM_STATE_REMOTE:
            if (event == EVENT_LOCAL_REQUEST) {
                current_state = GEM_STATE_LOCAL;
                gem_report_event(CEID_STATE_CHANGE, current_state);
            }
            if (event == EVENT_DISABLE) {
                current_state = GEM_STATE_DISABLED;
                gem_report_event(CEID_STATE_CHANGE, current_state);
            }
            break;

        default:
            break;
    }
}
实现建议: 实际产品中建议使用状态表(State Table)代替 switch-case,便于维护和扩展。同时,所有状态迁移必须记录日志,便于联调时追溯问题。

3.6 常见误区与避坑

误区 正确做法
认为 INIT 状态可以处理生产命令 INIT 状态只应处理初始化逻辑,所有生产命令必须延迟到 ENABLED 之后
DISABLED 状态下允许主机修改参数 DISABLED 应拒绝所有远程写操作,仅允许读取
ENABLED 状态不区分 LOCAL/REMOTE ENABLED 必须立即进入 LOCAL 或 REMOTE,不能悬空
LOCAL 和 REMOTE 切换不触发事件 每次切换必须上报 CEID,否则主机无法同步状态

掌握这五个核心状态的定义和迁移逻辑,是后续学习设备加工状态、报警管理、事件上报等功能的基础。在联调实战中,建议先用模拟器验证状态机逻辑,再接入真实设备。