2. 状态机基础:有限状态机(FSM)概念、SECS状态机模型、状态与事件驱动
在深入SECS/GEM通信链路的重连机制之前,必须首先理解其核心控制逻辑——有限状态机(FSM)。SECS/GEM协议栈的通信行为并非随意的函数调用,而是严格遵循一套预定义的状态转换规则。本章将建立FSM的理论基础,并映射到SECS状态机模型中。
2.1 有限状态机(FSM)核心概念
有限状态机是一种用于描述系统在有限个状态之间迁移行为的数学模型。它由以下四个核心要素构成:
| 要素 | 定义 | SECS/GEM中的实例 |
|---|---|---|
| 状态(State) | 系统在某一时刻所处的稳定情形,决定了系统对外部输入的响应方式。 | NOT COMMUNICATED、COMMUNICATING、WAIT CRA |
| 事件(Event) | 触发状态迁移的外部或内部输入信号。 | 收到S1F13、连接断开、超时T3到期 |
| 迁移(Transition) | 系统从一个状态转换到另一个状态的过程,通常伴随动作执行。 | 从NOT COMMUNICATED迁移到COMMUNICATING |
| 动作(Action) | 进入新状态时执行的操作,如启动定时器、发送报文。 | 发送S1F13、启动T5连接定时器 |
关键原则: FSM在任何时刻只能处于一个状态。状态迁移是原子性的,即迁移一旦开始,必须完成,不能停留在中间态。
下图展示了一个简化的两状态FSM模型,用于说明状态、事件与迁移的基本关系:
2.2 SECS/GEM状态机模型
SECS/GEM协议定义了设备通信的完整状态机模型。该模型是GEM标准(SEMI E30)的核心组成部分,用于管理主机(Host)与设备(Equipment)之间的通信会话。SECS状态机主要包含以下三个顶级状态:
- NOT COMMUNICATED(未通信):设备未与主机建立逻辑连接。设备可能处于离线模式,或物理链路已断开。
- COMMUNICATING(通信中):设备与主机已成功建立逻辑连接,可以正常收发SECS消息。
- WAIT CRA(等待通信请求确认):设备已发送通信请求(S1F13),正在等待主机的确认响应(S1F14)。这是一个临时过渡状态。
实践要点: 在异常恢复场景中,最常见的状态迁移路径是:COMMUNICATING → NOT COMMUNICATED → WAIT CRA → COMMUNICATING。理解这条路径上的每个事件和动作,是编写可靠重连逻辑的基础。
下表列出了SECS状态机中关键的状态、事件及对应的标准动作:
| 当前状态 | 触发事件 | 迁移动作 | 下一状态 |
|---|---|---|---|
| NOT COMMUNICATED | 物理连接建立 + 应用层发起连接 | 发送S1F13(通信请求) | WAIT CRA |
| WAIT CRA | 收到S1F14(通信确认) | 停止T3定时器,设置通信标志 | COMMUNICATING |
| WAIT CRA | T3超时(等待响应超时) | 重发S1F13或断开连接 | NOT COMMUNICATED |
| COMMUNICATING | 物理链路断开 / 收到S1F12 | 清理通信资源,停止所有定时器 | NOT COMMUNICATED |
| COMMUNICATING | 收到S1F15(离线请求) | 发送S1F16,进入离线模式 | NOT COMMUNICATED |
2.3 状态与事件驱动机制
SECS状态机是典型的事件驱动系统。这意味着状态迁移不是由轮询或时间片触发,而是由特定事件的发生来驱动。事件来源可分为三类:
- 报文事件:收到来自对端的SECS消息,如S1F13、S1F14、S6F11等。
- 定时器事件:系统内部定时器到期,如T3(等待响应超时)、T5(连接间隔定时器)。
- 系统事件:物理层状态变化,如TCP连接断开、网卡故障、应用层主动关闭。
下图展示了SECS/GEM标准状态机的完整结构,包含三个主要状态及其之间的迁移路径:
2.4 状态机在重连场景中的关键作用
在设备通信链路重连的上下文中,状态机提供了以下关键能力:
- 确定性行为:无论何种原因导致通信中断,状态机都能确保设备进入已知的NOT COMMUNICATED状态,避免出现“半连接”或“僵尸会话”。
- 事件序列化:所有外部事件(报文、定时器、系统中断)都被串行化送入状态机处理,避免了并发竞争条件。
- 可预测的恢复路径:重连逻辑只需关注从NOT COMMUNICATED到COMMUNICATING的迁移路径,无需处理通信中的复杂状态。
常见陷阱: 不要试图在状态机外部直接操作通信资源(如直接发送S1F13而不经过WAIT CRA状态)。这会导致状态不一致,使主机端无法正确解析设备状态,最终引发协议错误或通信死锁。