Procházet zdrojové kódy

docs: 扬杰二厂泵站业务流程梳理归档

DESKTOP-74CLTRG\Leol před 1 měsícem
rodič
revize
f0b6897758
1 změnil soubory, kde provedl 232 přidání a 0 odebrání
  1. 232 0
      docs/扬杰二厂业务流程梳理.md

+ 232 - 0
docs/扬杰二厂业务流程梳理.md

@@ -0,0 +1,232 @@
+# 扬杰二厂泵站 业务流程梳理
+
+> 依据:`docs/扬杰二厂泵站需求.md`、`projects/yangjie2.json`、`AutoControlService.cs` 等现有实现
+> 梳理日期:2026-09-06
+
+---
+
+## 一、项目概况
+
+| 项 | 值 |
+|---|---|
+| 工艺场景 | 扬杰二厂**集水池排污泵站**(1 个集水池 + 3 台排污泵) |
+| PLC | 西门子 S7(S7-200 Smart),地址 I/Q/M/VD |
+| 控制方式 | **中控(上位机)/ 屏控(现场触摸屏)二选一**,由 M\*.0 位决定 |
+| 监测量 | 液位、压力、流量、日流量、3 台泵电流、日台时 |
+| 前端模板 | `PumpStation`(泵站专用视图) |
+
+---
+
+## 二、核心业务流程
+
+### 1️⃣ 数据采集流程(每轮询周期,默认 1s)
+
+```
+PlcPollingService 定时轮询
+   │
+   ├─ 读模拟量 VD62(液位) / VD6600(压力) / VD6604(流量)
+   │         VD50/54/58(泵电流) / VD884(日流量) / VD950+VD10(日台时)
+   │
+   ├─ 读数字量 Q0.1~Q0.3(泵运行) / I0.1~I0.3(变频器故障) / M2.6/M5.6/M8.6(手自动)
+   │
+   ├─ 读控制参数 VD500/504/508/528/962(液位阈值) / VD6700/6704(压力阈值)
+   │
+   └─ 发布 DataUpdated 事件 → 触发下游所有业务
+        ├─ AlarmService       → 报警检测
+        ├─ AutoControlService  → 液位自动启停泵
+        ├─ DeviceStateMachineManager → 设备状态机转换
+        ├─ DataLoggingService  → 历史数据入库
+        └─ UI ViewModel       → 界面刷新
+```
+
+### 2️⃣ 控制模式判定(每台泵独立)
+
+```
+读 M*.0(中控/屏控选择位)
+   ├─ M*.0 = 0 → 中控模式:上位机启停命令【有效】
+   └─ M*.0 = 1 → 屏控模式:上位机【只监视】,写命令无效
+```
+
+### 3️⃣ 液位自动控制(核心业务,`AutoControlService`)
+
+```
+每个轮询周期:
+  读集水池液位 VD62
+       │
+       ▼
+  计算需要泵数 requiredCount:
+  ┌─────────────────────────────────────────────┐
+  │ 液位 > VD962(保护液位)  → 3台全启(紧急排污)│
+  │ 液位 > VD528(停止液位)  → 0台(全部停止)    │
+  │ 液位 < VD508(启3台位)   → 3台               │
+  │ 液位 < VD504(启2台位)   → 2台               │
+  │ 液位 < VD500(启1台位)   → 1台               │
+  │ 其余(滞后区间)        → 维持现状           │
+  └─────────────────────────────────────────────┘
+       │
+       ▼
+  防抖延迟:
+    启泵条件需持续 ≥ 3 秒 (StartDelaySeconds)
+    停泵条件需持续 ≥ 5 秒 (StopDelaySeconds)
+       │
+       ▼
+  选泵策略 (SelectPumpsToRun):
+    ① 剔除故障泵
+    ② 按日台时(累计运行时长)升序 → 优先选运行时间最短的泵
+    ③ 时长相同时用轮换索引打破平局(均衡磨损)
+       │
+       ▼
+  执行启停(对每台泵):
+    目标开 & 未运行 & 无故障 & 距上次启动 ≥ 60秒
+        → 点动写 M*.3 (置ON 200ms → OFF)
+    目标关 & 运行中 & 距上次停止 ≥ 60秒
+        → 点动写 M*.4
+```
+
+**要点**:`requiredCount` 只在越限时变化,滞后区间防止液位在阈值附近抖动导致频繁启停。
+
+### 4️⃣ 手动控制流程(操作员在中控执行)
+
+```
+操作员点击 启动/停止 按钮 (ViewA / ProjectView)
+   │
+   ▼
+权限检查 (AuthService.HasPermission ≥ Operator)
+   │
+   ▼
+写入点动命令位: 启动 M*.3 / 停止 M*.4 (ON 200ms → OFF)
+   │  (命令是否生效取决于该泵当前是中控模式 M*.0=0)
+   ▼
+下一轮询周期读回 Q0.x 验证运行状态 → 界面刷新
+   │
+   └─ 审计日志记录 (AuditService.Log)
+```
+
+### 5️⃣ 报警流程
+
+```
+每周期 AlarmService.CheckAlarms:
+  ┌────────────────────────┬──────┬──────────────────────┐
+  │ 条件                    │ 级别 │ 动作                  │
+  ├────────────────────────┼──────┼──────────────────────┤
+  │ 压力 < VD6700(低压设定) │ 警告 │ 日志 + 界面提示       │
+  │ 压力 > VD6704(高压设定) │ 警告 │ 日志 + 界面提示       │
+  │ 泵变频器故障 I0.1~I0.3  │ 严重 │ 报警记录 + 通知       │
+  │ PLC 断连                │ 提示 │ PLC_Connection 报警   │
+  └────────────────────────┴──────┴──────────────────────┘
+       │
+       ├─ 报警延迟 3 秒 + 死区 2.0(防抖)
+       ├─ 通过 Channel 异步入库 alarm_records
+       ├─ 升级机制: 未确认超 10 分钟 → 升级 + 通知
+       └─ 操作员确认 → 更新 IsConfirmed/ConfirmedBy
+```
+
+### 6️⃣ 设备状态机流程(每台泵)
+
+```
+PLC 信号驱动 Stateless 状态机:
+  Q0.x 运行 + I0.x 无故障 → Running
+  Q0.x 停止 + 无故障      → Stopped
+  I0.x = 1 (变频器故障)   → Fault(触发设备报警)
+       │
+       └─ 状态每次变化持久化到 equipment_statuses 表
+```
+
+### 7️⃣ 数据统计与留存
+
+```
+持续: 轮询数据 → analog_records / flow_records(360天保留)
+每日: DataRetentionService 清理过期记录(24h 周期)
+每日: BackupService 启动备份 + 24h 定时备份(WAL checkpoint + VACUUM INTO)
+日台时: 读 VD950+VD10 等(PLC 累计),M19.4 点动清零
+日流量: 读 VD884,M19.3 点动复位
+```
+
+---
+
+## 三、PLC 点位速查
+
+### 3.1 数字量 I/O
+
+| 地址 | 名称 | 方向 |
+|------|------|------|
+| I0.0 | 预留 | 读 |
+| I0.1 | 泵1变频器故障 | 读(1=故障) |
+| I0.2 | 泵2变频器故障 | 读(1=故障) |
+| I0.3 | 泵3变频器故障 | 读(1=故障) |
+| Q0.1 | 1#泵启停 | 写 |
+| Q0.2 | 2#泵启停 | 写 |
+| Q0.3 | 3#泵启停 | 写 |
+
+### 3.2 模拟量
+
+| 地址 | 名称 |
+|------|------|
+| VD62 | 即时液位 |
+| VD50 | 泵1电流 |
+| VD54 | 泵2电流 |
+| VD58 | 泵3电流 |
+| VD6600 | 即时压力 |
+| VD6604 | 即时流量 |
+| VD884 | 日流量(累计) |
+
+### 3.3 液位控制参数
+
+| 地址 | 名称 |
+|------|------|
+| VD500 | 启动1台泵液位 |
+| VD504 | 启动2台泵液位 |
+| VD508 | 启动3台泵液位 |
+| VD528 | 停止液位 |
+| VD962 | 保护液位 |
+
+### 3.4 泵控制位
+
+| 功能 | 泵1 | 泵2 | 泵3 |
+|------|-----|-----|-----|
+| 中控/屏控选择 | M1.0 | M4.0 | M7.0 |
+| 上位手动启动 | M1.3 | M4.3 | M7.3 |
+| 上位手动停止 | M1.4 | M4.4 | M7.4 |
+| 上位自动命令 | M2.2 | M5.4 | M8.4 |
+| 上位手动命令 | M2.1 | M5.3 | M8.3 |
+| 手自动状态 | M2.6 (1=自动) | M5.6 (1=手动) | M8.6 (1=手动) |
+| 故障信号 | M3.1 | M6.1 | M9.1 |
+
+### 3.5 日台时 / 日流量
+
+| 功能 | 泵1 | 泵2 | 泵3 |
+|------|-----|-----|-----|
+| 日台时-小时 | VD950 | VD954 | VD958 |
+| 日台时-分钟 | VD10 | VD18 | VD28 |
+| 日台时清零 | M19.4 | M19.4 | M19.4 |
+| 日流量复位 | M19.3 | — | — |
+
+---
+
+## 四、⚠️ 已知风险点(待确认)
+
+| # | 问题 | 现状 | 影响 |
+|---|------|------|------|
+| 1 | **泵1 与泵2/3 的手自动状态位极性相反**(M2.6: 1=自动;M5.6/M8.6: 1=手动) | 档案照抄点位表,未做极性归一 | 控制逻辑判断可能出错 |
+| 2 | 日台时/日流量清零由谁触发(定时 or 手动) | 未实现自动清零 | 统计数据可能不准 |
+| 3 | 保护液位触发后是否需人工复位 | 未实现复位确认 | 安全逻辑待确认 |
+| 4 | 点动持续时间(当前写死 200ms) | 需现场联调确认 | 需现场验证 |
+| 5 | 故障泵是否自动顶替 | 选泵时自动剔除故障泵 ✅ | 已覆盖 |
+| 6 | 泵1故障信号位(M3.1/M6.1/M9.1)与 I0.1~I0.3 是否重复 | 需确认 PLC 程序 | 报警逻辑可能重复 |
+
+---
+
+## 五、与当前代码的对应关系
+
+| 需求 | 对应代码 | 状态 |
+|------|---------|------|
+| PLC 地址重映射 | `projects/yangjie2.json` + `PlcConfig` | ✅ 已完成 |
+| 液位自动控制 | `AutoControlService.cs` | ✅ 已完成 |
+| 中控/屏控切换 | 需在写命令前检查 M*.0 | ⏳ 待实现 |
+| 压力监测 | `AlarmService.CheckAlarmsFromProfile` | ✅ 已完成 |
+| 泵电流监测 | `yangjie2.json` 中 currentAddress 已配置 | ✅ 读取已有 |
+| 3台泵状态 | `DeviceStateMachineManager` | ✅ 已完成 |
+| 日台时统计 | 读取地址已配置,UI 待展示 | ⏳ 部分 |
+| 日流量统计 | VD884 读取已配置 | ✅ 读取已有 |
+| 报警逻辑 | `AlarmService` | ✅ 已完成 |
+| 设备状态机 | `DeviceStateMachine`(Stateless) | ✅ 已完成 |