# 扬杰二厂泵站 业务流程梳理 > 依据:`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) | ✅ 已完成 |