3. 状态管理入门
在批次控制系统中,状态管理是连接“工艺意图”与“设备动作”的核心枢纽。一个批次从创建到完成,本质上就是一组状态在时间轴上的迁移过程。如果状态定义模糊、生命周期边界不清、持久化策略缺失,系统就会出现重复投料、阀门误动、批次卡死甚至无法追溯的严重问题。本节从状态的定义出发,逐步展开状态生命周期、状态转换图以及状态持久化方式,为后续异常恢复打下基础。
一、状态的定义:不只是“当前在哪一步”
在批次控制语境中,状态(State)是对一个对象在某一时刻所处条件的结构化描述。它至少包含三个要素:状态标识、进入条件、退出条件。状态标识是唯一名称,例如 IDLE、CHARGING、HEATING、HOLD、COMPLETE;进入条件描述“什么事件或条件允许进入该状态”;退出条件描述“满足什么条件必须离开”。
状态与“步骤”不同。步骤是工艺配方中的顺序单元,而状态是设备或批次单元在运行时的实际条件。一个步骤可能对应多个状态,例如“加热”步骤在设备层面可能经历 HEATING、HOLD、COOLING 等状态。状态必须可观测、可判定、可记录,否则无法用于控制与恢复。
状态定义的最小集合:状态名、所属对象(批次/单元/设备)、进入条件、退出条件、允许的转移目标、超时时间、持久化标志。
二、状态生命周期:从创建到归档
状态生命周期描述一个状态实例从产生到消亡的完整过程。典型生命周期包括:创建(Created)、激活(Active)、挂起(Suspended)、恢复(Resumed)、完成(Completed)、归档(Archived)。在批次控制中,生命周期管理的关键在于“状态不会凭空消失”,每一次迁移都必须有事件、时间和操作者记录。
- 创建:批次启动或单元初始化时,生成初始状态实例,通常为
IDLE或READY。 - 激活:满足进入条件后,状态变为当前活动状态,控制系统开始执行该状态对应的动作。
- 挂起:因操作员暂停、联锁触发或上游物料未就绪,状态进入
HOLD或SUSPENDED,设备保持安全位置。 - 恢复:挂起原因消除后,按预定路径回到原状态或进入新状态,必须校验恢复条件。
- 完成:退出条件满足,状态标记为完成,并触发下一状态的进入判断。
- 归档:批次结束后,状态历史写入数据库或日志,供追溯与审计。
生命周期中最重要的原则是“单向可追溯”:任何状态迁移都必须记录迁移前状态、迁移后状态、触发事件、时间戳和操作来源。缺少这些信息,异常恢复就失去了依据。
三、状态转换图:把控制逻辑画清楚
状态转换图(State Transition Diagram)是描述状态迁移关系的最有效工具。图中节点表示状态,有向边表示迁移,边上的标签表示触发事件或条件。对于批次控制,建议按“批次级—单元级—设备级”分层绘制,避免一张图过于复杂。
下面这张图展示了一个典型的反应釜批次单元状态转换关系,包含空闲、进料、加热、保温、冷却、出料、暂停和完成等状态,以及它们之间的主要迁移路径。
绘制状态转换图时,应遵循三条规则:第一,每个状态必须有明确的进入和退出条件;第二,不允许出现“无标签边”,即任何迁移都必须有触发原因;第三,异常迁移与正常迁移用不同颜色或线型区分,便于排障时快速定位。
四、状态持久化方式:让状态“活过”重启
状态持久化是指将状态数据写入非易失存储,使系统在断电、重启或故障恢复后仍能恢复到正确状态。批次控制中常见的持久化方式有以下几类:
| 持久化方式 | 典型载体 | 写入时机 | 优点 | 局限 |
|---|---|---|---|---|
| 内存变量 | 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;恢复逻辑必须幂等,即重复执行恢复不会造成重复投料或重复动作。
总结来看,状态定义解决“是什么”,状态生命周期解决“从哪来、到哪去”,状态转换图解决“怎么走”,状态持久化解决“断电后还能不能走对”。四者缺一不可,共同构成批次控制状态管理的入门基础。