# 扬杰二厂泵站 — 业务逻辑规格书 > 版本: v2.0 > 日期: 2026-09-08 > 依据: 现场 PLC 点位确认表 > 状态: 已确认,待实施 --- ## 一、项目定位 | 项 | 值 | |---|---| | 工艺场景 | 扬杰二厂 **集水池排污泵站**(1 个集水池 + 3 台排污泵) | | PLC | 西门子 S7-200 Smart | | 上位机角色 | **中控室监控** — 只监不控(自动逻辑由 PLC 执行) | | 控制模式 | 屏控(现场触摸屏)↔ 中控(远程上位机)| | 前端模板 | `PumpStation` | ### 核心原则 > **自动控制由现场 PLC 完成,上位机不自动启停泵。** > > 上位机仅在 **中控 + 手动** 模式下允许远程手动启停泵。 --- ## 二、控制模式与安全联锁 ### 2.1 两级模式切换 远程操作泵启停需要满足 **两级条件**,缺一不可: ``` 第一步: 切换到「中控模式」 ModeSelectAddress = 0 → 中控(上位机可操作) ModeSelectAddress = 1 → 屏控(现场控制,上位机只监视) │ ▼ 第二步: 切换到「手动模式」 AutoStateAddress = 0 → 手动(允许远程启停) AutoStateAddress = 1 → 自动(PLC 自动逻辑运行中,远程不可干预) │ ▼ ✅ 可以操作泵启停 ``` ### 2.2 联锁判定表 | ModeSelect (中控/屏控) | AutoState (自动/手动) | 上位机可启停泵? | 说明 | |:---:|:---:|:---:|------| | 屏控 (1) | 自动 (1) | ❌ | 现场自动运行,上位机纯监视 | | 屏控 (1) | 手动 (0) | ❌ | 现场手动操作,上位机纯监视 | | 中控 (0) | 自动 (1) | ❌ | 上位机监控,PLC 自动逻辑执行 | | **中控 (0)** | **手动 (0)** | **✅** | **唯一允许远程启停的状态** | ### 2.3 上位机启停泵前置检查流程 ``` 操作员点击 启动/停止 按钮 │ ▼ ① 权限检查: AuthService.HasPermission ≥ Operator │ ▼ ② 项目配置检查: profile.Control.AllowManualControl == true │ ▼ ③ 模式联锁检查: ├─ 读 ModeSelectAddress → 必须 = 0 (中控) │ └─ 否则: 提示 "当前为屏控模式,无法远程操作" └─ 读 AutoStateAddress → 必须 = 0 (手动) └─ 否则: 提示 "当前为自动模式,请切换到手动" │ ▼ ④ 执行点动写入: 启动 → WriteBool(StartAddress, true) → 200ms → WriteBool(StartAddress, false) 停止 → WriteBool(StopAddress, true) → 200ms → WriteBool(StopAddress, false) │ ▼ ⑤ 审计日志 + 下一轮询验证运行状态 ``` --- ## 三、PLC 点位表(已确认) ### 3.1 基本监控 — 模拟量读取 | # | 名称 | 地址 | 数据类型 | 方向 | JSON 字段 | |---|------|------|---------|:----:|----------| | 1 | 1#泵电流 | VD50 | REAL | 读 | `pumps[0].currentAddress` | | 2 | 2#泵电流 | VD54 | REAL | 读 | `pumps[1].currentAddress` | | 3 | 3#泵电流 | VD58 | REAL | 读 | `pumps[2].currentAddress` | | 4 | 即时压力 | VD6600 | REAL | 读 | `gauges[0].valueAddress` | | 5 | 即时流量 | VD6604 | REAL | 读 | `gauges[1].valueAddress` | | 6 | 总流量 | VD7000 | REAL | 读 | `sensors[0].address` | | 7 | 即时液位 | VD62 | REAL | 读 | `tanks[0].levelAddress` | ### 3.2 基本监控 — 数字量读取 | # | 名称 | 地址 | 数据类型 | 方向 | JSON 字段 | |---|------|------|---------|:----:|----------| | 1 | 1#泵运行状态 | Q0.1 | 开关量 | 读 | `pumps[0].runAddress` | | 2 | 2#泵运行状态 | Q0.2 | 开关量 | 读 | `pumps[1].runAddress` | | 3 | 3#泵运行状态 | Q0.3 | 开关量 | 读 | `pumps[2].runAddress` | ### 3.3 故障监控 — 数字量读取 | # | 名称 | 地址 | 数据类型 | 方向 | JSON 字段 | |---|------|------|---------|:----:|----------| | 1 | 低液位报警 | M19.5 | 开关量 | 读 | `digitalInputs` (新增) | | 2 | 高压报警 | M30.1 | 开关量 | 读 | `digitalInputs` (新增) | | 3 | 泵1过流报警 | M17.1 | 开关量 | 读 | `pumps[0].faultAddress` | | 4 | 泵2过流报警 | M17.2 | 开关量 | 读 | `pumps[1].faultAddress` | | 5 | 泵3过流报警 | M17.3 | 开关量 | 读 | `pumps[2].faultAddress` | | 6 | 变频器1报警 | M3.1 | 开关量 | 读 | `digitalInputs` | | 7 | 变频器2报警 | M6.1 | 开关量 | 读 | `digitalInputs` | | 8 | 变频器3报警 | M9.1 | 开关量 | 读 | `digitalInputs` | | 9 | 复位按钮 | M30.0 | 开关量 | **脉冲写** | `digitalOutputs` | ### 3.4 参数设置 — 模拟量读写 | # | 名称 | 地址 | 数据类型 | 方向 | JSON 字段 | |---|------|------|---------|:----:|----------| | 1 | 启动1台泵液位 | VD500 | REAL | 读写 | `tanks[0].startPump1LevelAddress` | | 2 | 启动2台泵液位 | VD504 | REAL | 读写 | `tanks[0].startPump2LevelAddress` | | 3 | 启动3台泵液位 | VD508 | REAL | 读写 | `tanks[0].startPump3LevelAddress` | | 4 | 停止液位 | VD528 | REAL | 读写 | `tanks[0].stopLevelAddress` | | 5 | 保护液位 | VD962 | REAL | 读写 | `tanks[0].protectionLevelAddress` | | 6 | 高压设置 | VD6704 | REAL | 读写 | `gauges[0].highSetAddress` | | 7 | 低压设置 | VD6700 | REAL | 读写 | `gauges[0].lowSetAddress` | ### 3.5 泵控制 — 模式与操作 | 功能 | 1#泵 | 2#泵 | 3#泵 | JSON 字段 | |------|:----:|:----:|:----:|----------| | 中控/屏控选择 (读) | M1.0 | M4.0 | M7.0 | `modeSelectAddress` | | 手自动状态 (读) | M2.6 | M5.6 | M8.6 | `autoStateAddress` | | 手动启动 (脉冲写) | M1.3 | M4.3 | M7.3 | `startAddress` | | 手动停止 (脉冲写) | M1.4 | M4.4 | M7.4 | `stopAddress` | | 切手动命令 (脉冲写) | M2.1 | M5.3 | M8.3 | `manualCommandAddress` | | 切自动命令 (脉冲写) | M2.2 | M5.4 | M8.4 | `autoCommandAddress` | ### 3.6 日台时(运行时间统计) | 功能 | 1#泵 | 2#泵 | 3#泵 | 数据类型 | JSON 字段 | |------|:----:|:----:|:----:|:--------:|----------| | 台时-小时 (读) | VD950 | VD954 | VD958 | DINT | `dailyHoursAddress` / `dailyHoursDataType` | | 台时-分钟 (读) | VD10 | VD18 | VD28 | DINT | `dailyMinutesAddress` / `dailyMinutesDataType` | | 台时清零 (脉冲写) | M19.4 | M19.4 | M19.4 | - | `dailyResetAddress` | --- ## 四、上位机功能清单 ### 4.1 实时监控(只读) | 功能 | 数据来源 | 刷新频率 | |------|---------|---------| | 集水池液位 + 趋势曲线 | VD62 | 1s | | 3 台泵运行状态 (运行/停止/故障) | Q0.1-3 + M17.1-3 | 1s | | 3 台泵电流 + 负荷比 | VD50/54/58 | 1s | | 即时压力 + 刻度 | VD6600 | 1s | | 即时流量 | VD6604 | 1s | | 总流量 | VD7000 | 1s | | 中控/屏控模式显示 | M1.0/M4.0/M7.0 | 1s | | 手自动状态显示 | M2.6/M5.6/M8.6 | 1s | | 日台时 (时+分) | VD950+VD10 等 | 1s | | 故障报警 (低液位/高压/过流/变频器) | M19.5/M30.1/M17.x/M3.1/M6.1/M9.1 | 1s | ### 4.2 手动控制(需 中控+手动 模式) | 操作 | 前置条件 | PLC 写入 | |------|---------|---------| | 远程启动泵 | ModeSelect=0 AND AutoState=0 | 点动 StartAddress (200ms) | | 远程停止泵 | ModeSelect=0 AND AutoState=0 | 点动 StopAddress (200ms) | | 日台时清零 | 无 | 点动 DailyResetAddress (200ms) | ### 4.3 参数同步(写入 PLC) | 操作 | PLC 写入地址 | |------|-------------| | 设置启泵液位阈值 | VD500 / VD504 / VD508 | | 设置停泵液位 | VD528 | | 设置保护液位 | VD962 | | 设置压力高限 | VD6704 | | 设置压力低限 | VD6700 | | 一键全量同步 | 以上所有 | ### 4.4 报警管理 | 操作 | 行为 | |------|------| | 报警确认 | 标记 IsConfirmed + 记录操作人 | | 报警复位(单条) | 清除活跃状态 + 点动 M30.0 | | 报警复位(全部) | 清除所有活跃状态 + 点动 M30.0 | | 报警通知 | 级别 ≥ 3 的报警触发桌面通知 | ### 4.5 中控/远程 (Hub 命令) | 命令 | 行为 | |------|------| | `query_mode` | 查询当前控制模式 | | `sync_params` | 远程触发参数全量同步 | | `reset_alarm` | 远程复位指定报警 | | `reset_all_alarms` | 远程复位所有报警 | | `start_pump` / `stop_pump` | 远程启停泵(需 AllowManualControl) | --- ## 五、项目配置(ControlConfig) ```json { "control": { "enableAutoControl": false, "controlModeDescription": "PLC自动(上位机仅监控)", "allowManualControl": true, "allowParameterSync": true } } ``` | 字段 | 含义 | 本项目值 | |------|------|---------| | `enableAutoControl` | 上位机是否执行自动启停逻辑 | `false` — PLC 自行处理 | | `controlModeDescription` | UI 显示用的模式描述 | "PLC自动(上位机仅监控)" | | `allowManualControl` | 是否允许远程手动启停泵 | `true` — 需联锁检查 | | `allowParameterSync` | 是否允许写参数到 PLC | `true` | --- ## 六、数据采集流程 ``` PlcPollingService 定时轮询 (默认 1s) │ ├─ 读模拟量: VD62(液位) / VD6600(压力) / VD6604(流量) │ VD50/54/58(泵电流) / VD7000(总流量) │ VD950+VD10 / VD954+VD18 / VD958+VD28(日台时) │ ├─ 读数字量: Q0.1-3(泵运行) / M17.1-3(泵过流) │ M3.1/M6.1/M9.1(变频器故障) │ M19.5(低液位报警) / M30.1(高压报警) │ M1.0/M4.0/M7.0(中控/屏控) / M2.6/M5.6/M8.6(手自动) │ ├─ 读控制参数: VD500/504/508/528/962(液位阈值) │ VD6700/6704(压力阈值) │ └─ 发布 DataUpdated 事件 ├─ AlarmService → 报警检测 + 报警显示 ├─ ProjectViewModel → UI 刷新 (模式显示、泵状态、液位趋势) ├─ DataLoggingService → 历史数据入库 └─ (AutoControlService → 不激活,因 enableAutoControl=false) ``` **注意**: `AutoControlService` 在 `enableAutoControl=false` 时不会订阅 `DataUpdated`,不向 PLC 写入任何启停命令。 --- ## 七、报警逻辑 ### 7.1 报警源 | 报警类型 | 触发条件 | 来源 | 级别 | |---------|---------|------|------| | 低液位报警 | M19.5 = 1 | PLC 数字量 | 警告(2) | | 高压报警 | M30.1 = 1 | PLC 数字量 | 严重(3) | | 泵1过流 | M17.1 = 1 | PLC 数字量 | 严重(3) | | 泵2过流 | M17.2 = 1 | PLC 数字量 | 严重(3) | | 泵3过流 | M17.3 = 1 | PLC 数字量 | 严重(3) | | 变频器1故障 | M3.1 = 1 | PLC 数字量 | 严重(3) | | 变频器2故障 | M6.1 = 1 | PLC 数字量 | 严重(3) | | 变频器3故障 | M9.1 = 1 | PLC 数字量 | 严重(3) | | 压力超高限 | 压力 > VD6704 | 上位机计算 | 警告(2) | | 压力超低限 | 压力 < VD6700 | 上位机计算 | 警告(2) | | PLC 断连 | 通信超时 | 上位机检测 | 紧急(4) | ### 7.2 报警处理 ``` 报警触发 → 记录到 alarm_records 表 → UI 弹出 → 桌面通知 │ ├─ 确认: 操作员点击确认 → 标记 IsConfirmed └─ 复位: 操作员点击复位 → 清除活跃状态 + 点动 M30.0 → PLC 侧复位报警输出 ``` ### 7.3 报警特性 | 特性 | 值 | |------|-----| | 延迟触发 | 3 秒(防止瞬间波动误报) | | 死区防抖 | ±2(防止在阈值边界反复触发) | | 升级机制 | 未确认 10 分钟自动升到级别 4 | | 异步入库 | Channel 有界队列 (200),不阻塞轮询 | --- ## 八、与旧版差异(v1 → v2 变更摘要) | # | 变更项 | v1 (旧) | v2 (新) | |---|--------|---------|---------| | 1 | 上位机角色 | 自动启停泵 (AutoControlService) | **仅监控**,PLC 处理自动逻辑 | | 2 | 故障地址 | I0.1/I0.2/I0.3 (I区物理输入) | M17.1/M17.2/M17.3 (泵过流) + M3.1/M6.1/M9.1 (变频器) | | 3 | 低液位报警 | 无 | **M19.5** (新增) | | 4 | 高压报警 | 无 | **M30.1** (新增) | | 5 | 总流量 | VD884 (日流量) | **VD7000** (总流量) | | 6 | 操作联锁 | 无 | **中控+手动** 双重检查 | | 7 | 参数同步 | 无 | **可写** 7 个阈值到 PLC | | 8 | 报警复位 | 仅确认 | 确认 + **复位** (软件清除 + M30.0 脉冲) | | 9 | 模式显示 | 无聚合 | **中控/屏控/混合** 模式徽章 | | 10 | 按项目配置 | 无 | **ControlConfig** 按项目决定是否自动控制 |