Four remaining improvements for the dual-app split: 1. Migrate platform handlers (tag/page/source/point/equipment) to core 2. Add event namespace prefixes (platform.*/feeder.*/ops.*) 3. Register platform routes in ops app 4. Ops business logic (pending requirements) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| crates | ||
| docs | ||
| migrations | ||
| web | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
README.md
PLC Control
PLC Control 是一个面向 PLC / OPC UA 场景的本地控制与监控系统,提供设备建模、点位管理、控制单元自动控制、实时信号展示、日志追踪和文档查看能力。
核心功能
1. 数据源与点位管理
- 支持 OPC UA 数据源接入、重连和节点浏览
- 支持从节点批量创建点位
- 支持点位与设备、标签、信号角色的绑定
- 支持批量写点和实时值查看
2. 设备与控制单元建模
- 设备可按
unit_id归属到控制单元 - 点位可按
signal_role标记为start_cmd、stop_cmd、run、flt、rem等控制信号 - 控制单元通过时长参数描述启停节奏与累计运行逻辑
3. 自动控制引擎
- 后端为每个启用中的控制单元维护独立异步任务
- 支持
Stopped -> Running -> DistributorRunning状态流转 - 支持通信锁定、故障锁定、人工确认
- 支持单个和批量启动/停止自动控制
4. 手动控制与联锁
- 设备手动启停前会检查 REM、FLT、信号质量和单元运行时状态
- 自动控制启用时会阻止冲突的手动命令
fault_locked、comm_locked、manual_ack_required都会阻止自动启动
5. 前端双视图
Ops视图:- 展示控制单元状态
- 展示设备卡片和 REM/RUN/FLT 实时信号
- 提供设备启停和批量自动控制入口
Config视图:- 展示数据源、设备、点位、事件、图表
- 展示实时日志流
6. 实时通信
- WebSocket 推送点位实时值
- WebSocket 推送控制单元运行时变化
- SSE 推送日志增量
- 日志流默认跟随最新
app.log*文件,支持轮转切换
项目结构
plc_control/
Cargo.toml # Workspace root
crates/
plc_platform_core/ # 共享平台核心库(配置、数据库、连接、事件、WebSocket 等)
app_feeder_distributor/ # 投煤器布料机专用版
app_operation_system/ # 运转系统专用版
web/
core/ # 共享 HTML/CSS(数据源、点位、设备、图表、日志等)
feeder/ # 投煤器布料机页面 + JS
ops/ # 运转系统页面 + JS
共享平台核心库 (plc_platform_core)
model— 数据模型db— 数据库初始化connection— OPC UA 连接管理、订阅、轮询、批量写点service— 数据查询与写入封装control/command— 通用控制命令control/runtime— 运行时状态存储event— 事件信封与命名空间websocket— WebSocket 房间与消息广播telemetry— 点位遥测
业务应用
app_feeder_distributor— 投煤器/布料机控制引擎、业务 handler、业务事件app_operation_system— 运转系统控制逻辑(开发中)
构建
# 投煤器布料机
cargo build -p app_feeder_distributor --release
# 运转系统
cargo build -p app_operation_system --release
部署
将编译产物和 web/ 目录放在同一级目录下:
deploy/
app_feeder_distributor.exe
web/
core/
feeder/
控制引擎设计
控制引擎的几个关键点:
- 每个启用单元有一个独立任务
- 每轮循环都会重读单元配置和设备角色映射
- 设备/点位控制相关配置变更后,会主动唤醒对应单元任务
wait_phase使用sleep_until(deadline),保证阶段计时不会被中途轮询漂移
当前时长约束:
run_time_sec > 0stop_time_sec > 0acc_time_sec > 0bl_time_sec > 0acc_time_sec > run_time_sec
前端 Web 设计
前端采用原生 ES Module 和分片 HTML 结构,按应用拆分目录:
web/core/— 共享 HTML 面板(数据源、点位、设备、图表、日志、文档抽屉)和样式web/feeder/— 投煤器专用入口、运维面板、控制单元表单、全部 JS 模块web/ops/— 运转系统专用入口(开发中)
每个应用的 Axum 路由使用 ServeDir 回退链:先查应用目录,再查 core 目录,URL 路径无需变化。
实时日志设计
日志能力包含两部分:
GET /api/logs- 拉取日志内容
GET /api/logs/stream- SSE 增量推送
日志轮转行为:
- 如果未指定
file,后端总是跟随最新app.log* - 一旦轮转到新文件,SSE 流自动切换
- 前端会插入分隔提示,标识当前切换到了哪个日志文件
运行方式
主要依赖
- Rust
- Axum
- Tokio
- SQLx
- PostgreSQL
- async-opcua
关键环境变量
DATABASE_URLHOSTPORTWRITE_API_KEYSIMULATE_PLC
文档索引
- 投煤器布料机 API:
docs/api-feeder.md - 运转系统 API:
docs/api-ops.md - 双应用共享核心设计:
docs/superpowers/specs/2026-04-14-dual-app-shared-core-design.md - 控制引擎计划:
docs/superpowers/plans/2026-03-24-control-engine.md - 双视图前端计划:
docs/superpowers/plans/2026-03-25-dual-view-web.md
当前实现特点
- 后端偏本地部署和现场控制使用
- 控制状态保存在内存中,重启后重置
- 前端和后端都围绕“实时控制 + 快速排障”设计