从零搭建工业控制系统(八):工作流编排系统——把阶段串成流水线

从零搭建工业控制系统(八):工作流编排系统——把阶段串成流水线 工作流编排系统把阶段串成流水线这是「从零搭建工业控制系统」系列第8篇。前两篇讲了配方和序列——配方管参数序列管编排。但一个完整的生产流程不只是跑序列还有进料、预热、检测、出料等阶段。这篇讲最外层的工作流编排。序列不够用吗序列能编排配方循环、跳转、暂停取消都有了。为什么还需要更外层因为一个完整的生产流程不只是跑序列这一件事。真实场景操作员放好物料点开始设备要做的远不止跑工艺序列——进料— 检查物料到位、关门、密封预热— 加热器升温到目标温度等稳定完整性检测— 检查腔体密封性不漏气才能继续序列执行— 跑工艺序列这是前面讲的序列层清理— 安全关闭加工相关设备出料— 泄压、开门、提示取物料六个阶段一个接一个。序列层只管第4阶段其他五个阶段谁管如果硬塞进序列层序列配置里就得混入进料出料这些非工艺步骤。工艺工程师看序列配置时一脸懵——“这个步骤的recipe字段为什么是空的为什么有个type字段叫load”所以需要更外层。工作流层管全局阶段编排序列层管工艺配方编排各管各的。工作流配置工作流不是JSON配置驱动的——阶段是固定的不需要工艺工程师改。工作流是代码里定义的流程控制器工作流定义代码: 阶段1: 进料 阶段2: 预热 阶段3: 完整性检测 阶段4: 序列执行由操作员选哪个序列 阶段5: 清理 阶段6: 出料为什么工作流不做成配置因为阶段顺序是固定的工艺逻辑——进料必须在序列执行之前清理必须在序列执行之后。这不是工艺工程师该改的东西改了可能出安全事故。序列和配方做成配置是因为它们需要频繁调整——换产品、换工艺、调参数。工作流阶段基本不变做成配置反而增加复杂度。工作流执行逻辑执行工作流(序列名): 阶段1: 进料 检查物料到位信号 关闭腔体门 等待密封确认 失败 → 立即停止报错 阶段2: 预热 启动加热器 等待温度稳定轮询温度值 超时未稳定 → 停止报错 取消 → 跳到清理阶段 阶段3: 完整性检测 执行泄漏测试 判定是否合格 不合格 → 停止报错 阶段4: 序列执行 从注册表获取序列配置 调用序列执行器 失败 → 跳到清理阶段 阶段5: 清理 执行清理序列安全关闭设备 不管前面成功还是失败这步都要跑 阶段6: 出料 泄压到大气 开门 提示操作员取物料关键设计点任何阶段失败都跳到清理阶段而不是直接退出。设备不能停在加热中或真空状态就不管了必须安全关闭。阶段间的依赖与跳转不是所有阶段都直线往下走。有些阶段有条件分支完整性检测: 如果合格 → 继续阶段4 如果不合格 → 跳到清理然后停止序列执行: 如果成功 → 继续阶段5清理 如果取消 → 跳到阶段5清理 如果故障 → 跳到阶段5清理然后报警不管哪条路径清理阶段都会执行。这是安全设计——设备永远不能停留在不安全状态。有个设计决策清理阶段失败怎么办理论上清理失败意味着设备无法安全关闭这是严重故障。实际做法是清理失败触发最高级别报警灯塔转红灯蜂鸣器响通知操作员手动介入。工作流与序列的协作工作流层调用序列层时需要传递一些上下文序列名— 操作员在UI上选的取消令牌— 工作流的取消要传播到序列层进度回调— 序列层的进度要报告给工作流工作流再统一通知UI工作流执行阶段4: 获取序列配置从注册表 调用序列执行器传入取消令牌、进度回调 等待序列执行完成 根据返回结果决定下一步工作流不关心序列内部怎么跑配方、怎么循环。它只关心结果——成功还是失败。这就是分层的意义每层只跟相邻层打交道不跨层。进度报告三层叠加现在有三层执行进度报告也要三层叠加工作流进度阶段 4/6 — 序列执行 序列进度Step 2/5第1次循环共3次 配方进度Step 3/4 — 压力30加工60sUI上显示完整位置当前状态运行中 工作流阶段 4/6 — 序列执行 序列Step 2/51/3 配方Step 3/4操作员一眼就能看出当前在哪个阶段、跑到哪个序列步骤、配方执行到哪。如果卡住了也知道卡在哪一层。进度报告的实现是回调机制——每层执行时调用上层传入的进度回调上层再往上传工作流 → 序列执行器 → 配方执行器 ↑ ↑ ↑ 进度回调 进度回调 进度回调UI订阅最外层的进度事件收到通知后更新界面。工作流状态机工作流本身也有状态状态含义空闲没有在执行运行中某个阶段正在执行已完成所有阶段正常完成已取消操作员取消故障某阶段出错跟序列层的状态几乎一样。但工作流多一个空闲状态——序列执行完就结束了工作流是常驻的执行完回到空闲等下一次。UI上的开始按钮绑定工作流状态——只有空闲时才能点。运行中按钮变灰防止重复启动。多种工作流类型实际项目中不只有一种工作流。不同的操作对应不同的工作流工作流阶段用途主流程进料→预热→检测→序列→清理→出料完整生产流程仅加载进料→预热→检测只进料不加工仅卸载清理→出料只出料维护流程清理→检查维护模式操作员在UI上选工作流类型。不同工作流的阶段组合不同但每个阶段内部的逻辑是复用的——进料就是进料不管在哪个工作流里都一样。踩坑记录坑1预热阶段超时判定一开始预热阶段的超时设得太短。冬天车间温度低加热器从5度升到200度需要的时间比夏天长很多。操作员反映经常超时报错。后来把超时改成动态计算——根据当前温度和目标温度的差值估算需要时间再乘以1.5倍余量。坑2清理阶段执行两次序列执行失败时序列层自己触发了一次清理工作流层又触发了一次。两次清理导致有些阀门开关了两次设备状态混乱。后来明确职责序列层不触发清理清理是工作流层的职责。序列出错只返回错误码由工作流层决定是否清理。坑3工作流状态没复位某次故障后工作流状态卡在故障操作员点开始没反应——因为状态不是空闲。后来加了自动复位故障状态下操作员确认后状态自动回到空闲。本篇小结概念职责工作流Workflow完整生产流程的阶段编排六个阶段进料→预热→检测→序列→清理→出料安全设计任何阶段失败都跳到清理三层进度工作流序列配方三层叠加多种工作流主流程/仅加载/仅卸载/维护工作流状态空闲/运行中/已完成/已取消/故障工作流层的核心思想把完整的生产流程拆成固定阶段每个阶段独立执行失败时统一走清理。序列层管工艺编排工作流层管全局流程。下期预告第9篇报警系统设计工艺跑起来了万一设备出问题怎么报下一篇讲报警规则引擎、报警通知机制、报警历史持久化。