3. 状态管理入门

在批次控制系统中,状态管理是连接“工艺意图”与“设备动作”的核心枢纽。一个批次从创建到完成,本质上就是一组状态在时间轴上的迁移过程。如果状态定义模糊、生命周期边界不清、持久化策略缺失,系统就会出现重复投料、阀门误动、批次卡死甚至无法追溯的严重问题。本节从状态的定义出发,逐步展开状态生命周期、状态转换图以及状态持久化方式,为后续异常恢复打下基础。

一、状态的定义:不只是“当前在哪一步”

在批次控制语境中,状态(State)是对一个对象在某一时刻所处条件的结构化描述。它至少包含三个要素:状态标识、进入条件、退出条件。状态标识是唯一名称,例如 IDLE、CHARGING、HEATING、HOLD、COMPLETE;进入条件描述“什么事件或条件允许进入该状态”;退出条件描述“满足什么条件必须离开”。

状态与“步骤”不同。步骤是工艺配方中的顺序单元,而状态是设备或批次单元在运行时的实际条件。一个步骤可能对应多个状态,例如“加热”步骤在设备层面可能经历 HEATING、HOLD、COOLING 等状态。状态必须可观测、可判定、可记录,否则无法用于控制与恢复。

状态定义的最小集合:状态名、所属对象(批次/单元/设备)、进入条件、退出条件、允许的转移目标、超时时间、持久化标志。

二、状态生命周期:从创建到归档

状态生命周期描述一个状态实例从产生到消亡的完整过程。典型生命周期包括:创建(Created)、激活(Active)、挂起(Suspended)、恢复(Resumed)、完成(Completed)、归档(Archived)。在批次控制中,生命周期管理的关键在于“状态不会凭空消失”,每一次迁移都必须有事件、时间和操作者记录。

  • 创建:批次启动或单元初始化时,生成初始状态实例,通常为 IDLE 或 READY。
  • 激活:满足进入条件后,状态变为当前活动状态,控制系统开始执行该状态对应的动作。
  • 挂起:因操作员暂停、联锁触发或上游物料未就绪,状态进入 HOLD 或 SUSPENDED,设备保持安全位置。
  • 恢复:挂起原因消除后,按预定路径回到原状态或进入新状态,必须校验恢复条件。
  • 完成:退出条件满足,状态标记为完成,并触发下一状态的进入判断。
  • 归档:批次结束后,状态历史写入数据库或日志,供追溯与审计。

生命周期中最重要的原则是“单向可追溯”:任何状态迁移都必须记录迁移前状态、迁移后状态、触发事件、时间戳和操作来源。缺少这些信息,异常恢复就失去了依据。

三、状态转换图:把控制逻辑画清楚

状态转换图(State Transition Diagram)是描述状态迁移关系的最有效工具。图中节点表示状态,有向边表示迁移,边上的标签表示触发事件或条件。对于批次控制,建议按“批次级—单元级—设备级”分层绘制,避免一张图过于复杂。

下面这张图展示了一个典型的反应釜批次单元状态转换关系,包含空闲、进料、加热、保温、冷却、出料、暂停和完成等状态,以及它们之间的主要迁移路径。

批次反应釜单元状态转换图 节点=状态 边=迁移 标签=触发事件/条件 IDLE 空闲 CHARGING 进料 HEATING 加热 HOLD 保温 COOLING 冷却 DISCHARGE 出料 COMPLETE 完成 HOLD 暂停 启动批次 进料完成 温度达标 保温结束 冷却达标 出料完成 批次归档 联锁/操作暂停 恢复条件满足 超温联锁 异常复位 图例说明 正常工艺迁移 暂停/恢复迁移 异常/联锁迁移 迁移记录必须包含:源状态、目标状态、触发事件、时间戳、操作来源、批次号。

绘制状态转换图时,应遵循三条规则:第一,每个状态必须有明确的进入和退出条件;第二,不允许出现“无标签边”,即任何迁移都必须有触发原因;第三,异常迁移与正常迁移用不同颜色或线型区分,便于排障时快速定位。

四、状态持久化方式:让状态“活过”重启

状态持久化是指将状态数据写入非易失存储,使系统在断电、重启或故障恢复后仍能恢复到正确状态。批次控制中常见的持久化方式有以下几类:

持久化方式 典型载体 写入时机 优点 局限
内存变量 PLC 内部寄存器 状态迁移时 速度快、实时性好 断电丢失,不能单独用于恢复
文件快照 CSV/JSON 文件 周期性或迁移时 易读、易调试 并发写入需加锁,实时性一般
关系数据库 MySQL/PostgreSQL 事务提交时 支持查询、审计、回滚 写入延迟较高,需连接管理
时序数据库 InfluxDB/TDengine 按时间序列写入 适合状态历史与趋势分析 不适合频繁更新当前状态
事件日志 Kafka/文件日志 每次迁移追加 可重放、可追溯 恢复时需重放逻辑,复杂度高

实际工程中通常采用“内存 + 事件日志 + 数据库快照”的组合策略:内存保存当前状态以保证实时控制;事件日志按迁移追加,保证不丢事件;数据库定期保存快照,加速恢复。恢复时先加载最近快照,再重放快照之后的事件日志,即可重建当前状态。

状态持久化记录示例(JSON):
{
  "batch_id": "B20240612-007",
  "unit": "R-101",
  "state": "HOLD",
  "previous_state": "HEATING",
  "event": "INTERLOCK_TEMP_HIGH",
  "timestamp": "2024-06-12T14:23:07+08:00",
  "operator": "system",
  "persisted": true
}

五、案例与误区复盘

案例:某精细化工批次在加热阶段因超温联锁进入 HOLD,操作员处理后点击“恢复”。若系统只保存了当前状态为 HOLD,却没有保存“从 HEATING 进入 HOLD”的迁移记录,恢复时就无法判断应回到 HEATING 还是进入 COOLING。正确做法是持久化迁移事件,并在恢复逻辑中校验恢复条件,例如温度已降至安全范围才允许回到加热。

常见误区:把状态当成一个字符串变量,只存“当前值”,不存“怎么来的”。这会导致恢复时路径丢失,只能人工判断,极易造成误操作。状态管理的核心不是“当前在哪”,而是“如何到达、能否返回、返回需要什么条件”。

实践建议:为每个状态定义超时时间,超时未迁移则触发报警;为每次迁移生成唯一事件 ID;恢复逻辑必须幂等,即重复执行恢复不会造成重复投料或重复动作。

总结来看,状态定义解决“是什么”,状态生命周期解决“从哪来、到哪去”,状态转换图解决“怎么走”,状态持久化解决“断电后还能不能走对”。四者缺一不可,共同构成批次控制状态管理的入门基础。