plc_control/README.md

178 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`
## 当前实现特点
- 后端偏本地部署和现场控制使用
- 控制状态保存在内存中,重启后重置
- 前端和后端都围绕“实时控制 + 快速排障”设计