plc_control/docs/运转系统实现方案.md

20 KiB
Raw Permalink Blame History

运转系统独立软件实现方案

文档日期2026-04-14 适用对象:运转系统独立软件立项、总体设计评审、实施拆解 参考来源:运转系统逻辑说明.doc、当前 plc_control 仓库实现

1. 背景与目标

根据《运转系统控制逻辑说明书》,目标系统需要覆盖整条运转链路的自动控制与联锁保护,包括:

  • 回转线空车回送系统
  • 前端码车道输送系统
  • 码车机械臂配合系统
  • 摆渡车转运系统
  • 1 号干燥窑运转系统
  • 1 号焙烧窑运转系统
  • 2 号干燥窑运转系统
  • 2 号焙烧窑运转系统
  • 窑尾下摆渡车及卸砖线系统
  • 卸砖机位及卸砖机配合系统

该说明书的核心控制原则不是“简单定时启停”,而是:

  • 顺序控制
  • 联锁保护
  • 检测信号闭环确认
  • 异常停机与人工恢复
  • 双窑线并行与公共段协同

因此,本次实现不建议继续把需求压缩进当前仓库已有的投煤器/布料机控制模型,而应按一个独立软件来设计和交付。同时,当前仓库中已经成熟的一部分通用能力可以直接复用,避免重复建设。

本方案的目标是:

  • 明确新软件的系统边界
  • 盘点当前仓库中可复用的通用能力
  • 设计适合运转系统的领域模型、控制引擎和前后端架构
  • 给出实施路径,兼顾首版交付和后续公共能力沉淀

2. 结论先行

推荐方案是:

  • 将运转系统作为独立软件建设
  • 保留自己的数据库模型、控制引擎、前端页面和业务配置
  • 复用当前 plc_control 仓库中已经验证过的通用基础能力
  • 不直接沿用当前仓库以 unit + run_time_sec + stop_time_sec + acc_time_sec + bl_time_sec 为核心的控制业务模型

换句话说,处理原则不是“在当前项目里继续叠加一个特殊模块”,而是:

  • 当前仓库作为技术参考和通用能力来源
  • 新软件作为运转系统业务主线
  • 通用能力先迁移复用,后续再视项目数量决定是否抽为共享模块

这是当前阶段风险最低、交付最稳、后续也最容易维护的路径。


3. 当前仓库能力盘点

3.1 已具备且适合复用的通用能力

结合 README.mdAPI.mdsrc/main.rs 以及当前代码结构,现仓库已经具备以下可复用能力。

3.1.1 数据源与点位接入层

  • OPC UA 数据源管理
  • 数据源重连
  • 节点浏览与保存
  • 点位实时订阅
  • 点位批量写入
  • 实时值与质量状态缓存

对应模块主要包括:

  • src/connection.rs
  • src/handler/source.rs
  • src/handler/point.rs
  • src/service/source.rs
  • src/service/point.rs

这些能力与具体业务无强绑定,适合作为新软件的接入底座。

3.1.2 设备/点位基础建模

当前仓库已经有较成熟的基础对象:

  • 数据源 source
  • 设备 equipment
  • 点位 point
  • 标签 tag
  • 页面 page

其中 equipmentpoint 作为“现场对象抽象”依然有复用价值,尤其适合承载:

  • 门机
  • 顶车机
  • 拉引机
  • 摆渡车
  • 步进机
  • 卸砖机
  • 机械臂状态点
  • 各工位检测点

3.1.3 实时事件与前后端通讯

当前仓库已经具备:

  • WebSocket 实时推送
  • SSE 日志流
  • 统一事件入口
  • 事件落库与查询

对应模块包括:

  • src/event.rs
  • src/websocket.rs
  • src/handler/log.rs

这些能力对运转系统同样成立,可用于:

  • 动作执行结果推送
  • 工位状态变化推送
  • 联锁阻断告警推送
  • 顺控步骤变化推送
  • 操作日志与异常追踪

3.1.4 基础 Web 与后端服务骨架

当前仓库已经具备:

  • Axum 路由骨架
  • PostgreSQL 持久化
  • SQLx 服务层
  • 中间件
  • 前端静态页宿主
  • 单实例运行与托盘集成

这些都是独立软件首版可直接借鉴或迁移的基础设施。

3.2 当前仓库不适合作为运转系统主模型的部分

当前控制模型围绕 control unit 展开,核心语义是:

  • 定时停止
  • 定时运行
  • 累计运行触发下一设备

这套模型适用于投煤器/布料机这类节拍式设备联动,但不适用于运转系统说明书中的整线逻辑,原因如下:

  • 无法表达“工位占用/空位”驱动的逐段流转
  • 无法表达“开门 -> 门开确认 -> 主动作 -> 复位 -> 关门 -> 门关确认”的段内动作链
  • 无法表达摆渡车定位、窑口交接、下摆渡车接车等空间位置过程
  • 无法表达机械臂安全区互锁
  • 无法表达动作完成必须由检测闭环确认的控制要求
  • 无法清晰表达故障停留在当前步骤、禁止跳步恢复的原则

因此,当前 unit 运行态和引擎逻辑可以借鉴实现方法,但不应直接作为运转系统的业务核心模型。


4. 新软件的定位与边界

4.1 新软件定位

新软件定位为:

  • 面向窑车运转系统的自动控制与监控平台
  • 以“工位流转 + 执行机构动作 + 联锁条件 + 完成确认 + 异常恢复”为核心
  • 支持双窑线并行与公共段共享
  • 支持自动、远程手动、就地切换下的系统行为约束

4.2 与当前仓库的关系

推荐关系如下:

  • 当前仓库不是运转系统的软件主体
  • 当前仓库是通用能力来源和技术参考
  • 首期开发可复制已有通用模块到新项目中使用
  • 后续如果存在多个同类项目,再考虑把共性抽为共享库

4.3 本次不建议的做法

不建议:

  • 在当前仓库里继续叠加大量运转系统特有表结构和控制逻辑
  • 把运转系统说明书中的流程强行映射为现有 unit 状态机
  • 一开始就为了“平台化”设计过度通用的规则解释器

首版目标应该是:既能落地当前项目需求,又不给后续维护制造过多历史包袱。


5. 推荐的总体架构

5.1 架构分层

建议将新软件分为四层:

第一层:接入层

职责:

  • 对接 OPC UA 或其他现场协议
  • 订阅实时点位
  • 写入控制命令
  • 管理连接状态和信号质量

该层优先复用当前仓库的实现思路与模块结构。

第二层:现场对象层

职责:

  • 管理设备
  • 管理点位
  • 管理工位
  • 管理运输段
  • 管理信号映射

该层负责把现场对象标准化,形成“控制引擎可理解的对象模型”。

第三层:顺控引擎层

职责:

  • 执行每一段顺控逻辑
  • 处理段内步骤推进
  • 校验联锁
  • 等待闭环确认
  • 处理超时、故障和恢复
  • 协调双窑线与公共段

这是新软件的核心,不适合直接沿用当前仓库的 unit 引擎,需要重新设计。

第四层:操作与监控层

职责:

  • 实时显示工位状态和设备状态
  • 展示当前步骤和阻断原因
  • 提供手动控制与自动启停入口
  • 展示报警、事件、操作记录和日志

5.2 核心设计思想

运转系统的控制对象不是“单台设备”,而是“工艺段中的动作序列”。

因此核心对象应该从“设备”提升到“流程段”。

建议将整套系统拆成若干独立但可协同的流程段,例如:

  • 回车线入口接车段
  • 回车线前移段
  • 前端码车位进车段
  • 机械臂码坯协同段
  • 码坯完成放车段
  • 前端摆渡分配段
  • 1 号干燥窑进口段
  • 1 号干燥窑内前移段
  • 1 号干燥窑出口段
  • 1 号焙烧窑进口段
  • 1 号焙烧窑内前移段
  • 1 号焙烧窑出口段
  • 2 号线对应各段
  • 窑尾摆渡接车段
  • 下摆渡车段
  • 卸砖线步进段
  • 卸砖机位协同段

每个段都遵循统一状态机模板,但参数、设备映射和检测点不同。


6. 领域模型设计

6.1 需要保留的基础对象

建议保留并延续以下基础对象概念:

  • source:现场数据源
  • equipment:执行机构或检测对象
  • point:点位

但需要扩展出新的运转系统领域对象。

6.2 新增领域对象建议

6.2.1 工位 station

表示产线上的一个位置或交接位,例如:

  • 码车位
  • 摆渡车前端接车位
  • 1 号干燥窑进口位
  • 1 号干燥窑某中间工位
  • 焙烧窑出口位
  • 窑尾摆渡接车位
  • 卸砖线入口位
  • 卸砖机位
  • 回车线入口位

建议字段:

  • id
  • code
  • name
  • line_code
  • segment_code
  • station_type
  • enabled
  • description

6.2.2 工位信号映射 station_signal

用于将工位和检测信号绑定起来,例如:

  • 有车检测
  • 空位判定
  • 到位确认
  • 允许接车
  • 完成信号

6.2.3 流程段 process_segment

表示一个可独立调度的控制段。

例如:

  • front_feed_to_load_station
  • robot_palletize
  • front_release_to_transfer_car
  • kiln1_dry_infeed
  • kiln1_dry_step
  • kiln1_dry_outfeed
  • tail_transfer_to_unload

建议字段:

  • id
  • code
  • name
  • segment_type
  • line_code
  • priority
  • enabled
  • mode

6.2.4 段步骤 segment_step

表示一个流程段内的顺控步骤。

建议字段:

  • id
  • segment_id
  • step_no
  • step_code
  • step_type
  • action_kind
  • timeout_ms
  • next_step_on_success
  • next_step_on_failure

6.2.5 联锁规则 interlock_rule

表示动作启动前或运行中的禁止条件、停机条件、允许条件。

规则类型可包括:

  • 启动允许
  • 启动禁止
  • 运行中停机
  • 完成判定
  • 复位判定

6.2.6 动作模板 action_template

用于描述典型动作,减少重复配置,例如:

  • 开门
  • 关门
  • 顶车前进
  • 顶车后退
  • 拉引启动
  • 拉引复位
  • 摆渡车定位到某站
  • 步进机执行一步
  • 发放机械臂允许

6.2.7 段运行态 segment_runtime

替代当前仓库的 unit runtime,记录:

  • 当前状态
  • 当前步骤
  • 当前阻断原因
  • 当前动作开始时间
  • 最近一次成功完成时间
  • 当前故障锁定状态
  • 当前人工确认需求

6.3 参数化双窑线

说明书明确指出 1 号窑线与 2 号窑线控制原则一致,仅设备编号和工位编号不同。

因此建议设计成:

  • 一套流程段模板
  • 两套配置实例

不要写两套硬编码逻辑。参数化维度包括:

  • 设备编号
  • 站位编号
  • 门机/顶车机/拉引机映射
  • 进出口工位
  • 信号点位绑定

7. 顺控引擎设计

7.1 总体原则

顺控引擎必须遵循说明书中的原则:

  • 上一步未完成,不能进入下一步
  • 动作完成不能只依赖时间,必须结合检测反馈
  • 完全联锁、故障联锁、门位联锁、机械臂联锁优先于普通顺控
  • 故障后保持当前步骤,不允许强行跳步恢复

7.2 段级状态机

建议每个 process_segment 使用统一状态机框架:

  • Idle
  • Checking
  • Executing
  • Confirming
  • Resetting
  • Completed
  • Blocked
  • Faulted
  • ManualInterventionRequired

这与说明书建议的步骤结构一致,可映射为:

  • Step 0等待
  • Step 1条件检查
  • Step 2执行动作
  • Step 3到位确认
  • Step 4复位确认
  • Step 5本段完成
  • Step 6故障处理

7.3 统一段内执行模型

每个段的执行循环建议统一为:

  1. 读取当前段配置
  2. 读取当前步骤定义
  3. 拉取关联设备和工位信号实时值
  4. 校验启动允许与禁止条件
  5. 发出动作命令
  6. 等待执行反馈
  7. 校验完成信号
  8. 校验复位信号
  9. 写入本段完成或转入异常状态

7.4 典型动作链模板

针对窑门相关段,建议内建标准动作模板:

  1. 开门
  2. 门开到位确认
  3. 主动作执行
  4. 主动作完成确认
  5. 执行机构复位
  6. 复位确认
  7. 关门
  8. 门关到位确认
  9. 段完成

这样可以直接匹配说明书中的:

  • 干燥窑进口段
  • 干燥窑出口段
  • 焙烧窑进口段
  • 焙烧窑出口段

7.5 公共段与并行段调度

整套系统存在以下并发特征:

  • 双窑线并行
  • 前端码车系统是公共资源
  • 窑尾摆渡和卸砖线是公共资源
  • 回车线是公共资源

因此调度层必须支持:

  • 段独立运行
  • 公共资源互斥
  • 基于优先级或空位状态的放行决策
  • 上下游交接信号驱动

建议在引擎中增加“资源占用”概念,用于控制:

  • 摆渡车一次只能服务一个目标位
  • 卸砖机位忙碌时禁止上游送车
  • 机械臂占用作业区时禁止码车道送车

8. 联锁与异常处理设计

8.1 联锁优先级

联锁优先级建议按以下顺序处理:

  1. 安全联锁
  2. 完全联锁
  3. 故障联锁
  4. 门位联锁
  5. 机械臂联锁
  6. 工艺允许条件
  7. 普通顺控条件

高优先级联锁一旦不满足,低优先级不再继续判断。

8.2 通用允许条件

任何动作启动前至少检查:

  • 目标工位空位
  • 本工位有车或动作前提成立
  • 执行机构原位
  • 相关门位正确
  • 设备无故障
  • 安全联锁正常
  • 信号质量正常
  • 当前资源未被占用

8.3 通用禁止条件

出现以下任一情况,应禁止动作启动:

  • 目标工位被占用
  • 执行机构不在原位
  • 门未开到位或门未关到位
  • 摆渡车未定位
  • 机械臂未退出安全区
  • 卸砖位忙碌
  • 信号冲突
  • 就地模式或远程未就绪

8.4 通用停机条件

运行中出现以下任一情况,应立刻停止并报警:

  • 设备故障
  • 动作超时
  • 门位异常
  • 定位信号丢失
  • 安全联锁动作
  • 检测信号矛盾

8.5 故障恢复原则

故障处理必须遵循:

  • 故障优先停止当前相关动作
  • 停机后保留当前步骤
  • 不允许自动跳到下一步骤
  • 故障解除后仍需满足复位条件
  • 对关键信号冲突场景,必须人工确认后恢复

建议引擎中明确区分:

  • fault_active
  • fault_latched
  • manual_ack_required
  • blocked_reason

9. 前后端功能设计

9.1 后端接口建议

除了基础 source / equipment / point 管理接口,新软件建议新增以下业务接口。

9.1.1 工位与段配置接口

  • GET /api/station
  • POST /api/station
  • PUT /api/station/{id}
  • DELETE /api/station/{id}
  • GET /api/process-segment
  • POST /api/process-segment
  • PUT /api/process-segment/{id}
  • GET /api/process-segment/{id}/detail

9.1.2 运行控制接口

  • POST /api/control/segment/{id}/start-auto
  • POST /api/control/segment/{id}/stop-auto
  • POST /api/control/segment/{id}/reset
  • POST /api/control/segment/{id}/ack-fault
  • POST /api/control/equipment/{id}/manual-action

9.1.3 运行态查询接口

  • GET /api/runtime/overview
  • GET /api/runtime/segment/{id}
  • GET /api/runtime/station/{id}
  • GET /api/alarm
  • GET /api/event

9.2 WebSocket 推送建议

建议至少推送以下消息:

  • 工位状态变化
  • 段运行态变化
  • 当前步骤变化
  • 联锁阻断变化
  • 报警创建与恢复
  • 设备动作结果

9.3 前端页面建议

9.3.1 总览页面

展示:

  • 整体流程图
  • 双窑线状态
  • 公共段状态
  • 关键堵点
  • 当前报警数

9.3.2 运转监控页面

展示:

  • 各工位有车/空位状态
  • 门位状态
  • 顶车机/拉引机/摆渡车/步进机状态
  • 当前正在执行的步骤
  • 当前阻断原因

9.3.3 自动控制页面

展示:

  • 各流程段自动状态
  • 步骤进度
  • 手动启停
  • 故障确认
  • 复位操作

9.3.4 配置页面

展示:

  • 设备管理
  • 点位管理
  • 工位管理
  • 段配置
  • 联锁规则配置
  • 日志与事件查看

10. 与当前仓库的复用策略

10.1 推荐策略

当前阶段推荐“先迁移复用,再视情况抽公共库”。

原因:

  • 首版交付更快
  • 现仓库已有能力已经过实际实现验证
  • 现在立即抽共享库,容易因为运转系统领域模型尚未稳定而反复修改

10.2 复用方式

建议按三类处理。

第一类:直接迁移复用

可直接迁移并少量改造:

  • OPC UA 接入与重连
  • 点位订阅与实时缓存
  • 批量写点
  • WebSocket 管理
  • 事件总线
  • 日志流
  • 通用工具模块

第二类:保留设计思路,重新实现

不建议直接复制,但可以借鉴结构:

  • 控制引擎调度模型
  • 运行态缓存
  • 控制前置校验
  • 事件落库方式

第三类:不继承旧业务模型

建议不继承:

  • 当前 unit 业务语义
  • run_time_sec / stop_time_sec / acc_time_sec / bl_time_sec 这一套参数
  • 当前围绕投煤器/布料机定义的设备类型约定

10.3 后续公共化路径

如果后续存在多个类似项目,可分阶段抽象:

第一阶段:

  • 新软件独立交付
  • 复用代码以复制迁移为主

第二阶段:

  • 抽出 plc_common 之类的公共 Rust crate
  • 抽出前端通用实时组件
  • 统一数据源接入、事件总线、实时推送和写点命令封装

第三阶段:

  • 再考虑更高层的流程引擎模板是否值得平台化

11. 实施阶段建议

阶段一:独立项目初始化

目标:

  • 建立新仓库
  • 迁移通用接入层和实时通讯层
  • 跑通基础框架

工作内容:

  • 初始化新项目结构
  • 迁移 source / equipment / point 基础能力
  • 跑通 OPC UA 数据源接入
  • 建立事件、WebSocket、日志链路

阶段二:领域模型与配置能力

目标:

  • 建立工位、流程段、联锁规则等核心模型

工作内容:

  • 设计数据库表
  • 建立后端模型与服务层
  • 建立配置接口
  • 搭建配置页面

阶段三:顺控引擎首版

目标:

  • 跑通一条主流程

建议先实现:

  • 前端码车位进车
  • 机械臂码坯协同
  • 码坯完成放车
  • 摆渡车前端分配
  • 2 号干燥窑进口段

先打通单条链路,验证段模型和联锁模型是否足够。

阶段四:双窑线与公共段扩展

目标:

  • 完成双窑线、窑尾和回车线全流程

工作内容:

  • 参数化复制 1 号线和 2 号线
  • 接入窑尾摆渡、卸砖线、回车线
  • 完善资源互斥与阻塞处理

阶段五:监控、报警与恢复完善

目标:

  • 提升可运维性

工作内容:

  • 完善报警分类
  • 增加报警确认和恢复记录
  • 增加动作追踪与步骤历史
  • 增加现场调试辅助页面

12. 风险与注意事项

12.1 最大风险不是接入,而是流程建模

当前仓库已经证明接入和基础实时能力不是主要风险。真正的风险在于:

  • 工位划分是否清晰
  • 流程段切分是否合理
  • 联锁规则是否完整
  • 公共资源互斥是否严谨

因此实现前必须先完成工艺段拆分和信号清单整理。

12.2 不要过早追求全配置化

首版不要把所有逻辑都做成自由拼装规则引擎。更合理的做法是:

  • 先定义少量固定动作模板
  • 先定义少量固定规则类型
  • 用“模板 + 参数”的方式覆盖当前项目

这样既能交付,也能控制复杂度。

12.3 需要形成明确的 I/O 对照表

说明书描述了大量逻辑关系,但软件落地前必须补足:

  • 每个工位对应哪些检测点
  • 每个执行机构对应哪些命令点和反馈点
  • 每个完成条件由哪些信号组成
  • 哪些联锁是硬联锁,哪些是软联锁

没有这份映射表,软件方案再完整也无法落地。


13. 最终建议

综合当前需求和现仓库现状,最终建议如下:

  • 运转系统按独立软件建设
  • 当前 plc_control 仓库只复用其通用基础能力
  • 业务核心模型改为“工位 + 流程段 + 步骤 + 联锁 + 完成确认”
  • 双窑线按模板参数化实现
  • 首版采用“先迁移复用、后沉淀公共模块”的策略

这样做可以同时满足三件事:

  • 不破坏当前仓库已经成型的业务语义
  • 能完整承接运转系统说明书中的实际工艺需求
  • 为后续形成公共能力保留演进空间

14. 后续建议产出物

在本方案基础上,建议下一步继续形成以下文档:

  • 运转系统软件功能清单
  • 工位与执行机构 I/O 对照表
  • 流程段拆分表
  • 联锁规则明细表
  • 数据库表设计文档
  • 顺控引擎详细设计
  • 前端页面原型

如果继续推进实施,下一份最关键的文档应是:

  • 《运转系统流程段与 I/O 建模设计》

这份文档将直接决定后端模型和顺控引擎如何落地。