178 lines
5.1 KiB
Markdown
178 lines
5.1 KiB
Markdown
# 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*` 文件,支持轮转切换
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
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` — 运转系统控制逻辑(开发中)
|
||
|
||
## 构建
|
||
|
||
```powershell
|
||
# 投煤器布料机
|
||
cargo build -p app_feeder_distributor --release
|
||
|
||
# 运转系统
|
||
cargo build -p app_operation_system --release
|
||
```
|
||
|
||
## 部署
|
||
|
||
将编译产物和 `web/` 目录放在同一级目录下:
|
||
|
||
```text
|
||
deploy/
|
||
app_feeder_distributor.exe
|
||
web/
|
||
core/
|
||
feeder/
|
||
```
|
||
|
||
## 控制引擎设计
|
||
|
||
控制引擎的几个关键点:
|
||
|
||
- 每个启用单元有一个独立任务
|
||
- 每轮循环都会重读单元配置和设备角色映射
|
||
- 设备/点位控制相关配置变更后,会主动唤醒对应单元任务
|
||
- `wait_phase` 使用 `sleep_until(deadline)`,保证阶段计时不会被中途轮询漂移
|
||
|
||
当前时长约束:
|
||
|
||
- `run_time_sec > 0`
|
||
- `stop_time_sec > 0`
|
||
- `acc_time_sec > 0`
|
||
- `bl_time_sec > 0`
|
||
- `acc_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_URL`
|
||
- `HOST`
|
||
- `PORT`
|
||
- `WRITE_API_KEY`
|
||
- `SIMULATE_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`
|
||
|
||
## 当前实现特点
|
||
|
||
- 后端偏本地部署和现场控制使用
|
||
- 控制状态保存在内存中,重启后重置
|
||
- 前端和后端都围绕“实时控制 + 快速排障”设计
|