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