二次供水泵房的核心控制逻辑其实不复杂,但工程细节不少:恒压PID、多泵加减与轮换、小流量保压休眠、故障自投。本文用Python搭一个简化仿真,把这套逻辑跑一遍,便于理解工业控制器威泰普IntBoxIO内部到底在做什么——实际工程中这些功能块在控制器里已内置,零代码组态即可,不需要自己写代码。
一、控制对象与目标
目标:维持出水压力恒定在设定值 P_set(如0.45MPa)。
手段:一台变频泵调速,工频泵辅助加减;用水量大时加泵,用水量小时减泵并休眠。
二、简化代码
import time

class Pump:
def init(self, name):
self.name = name
self.running = False
self.runtime = 0 # 累计运行时长,用于轮换
self.fault = False
def repr(self):
return f"{self.name}(运行={self.running}, 累计={self.runtime:.0f}s)"

class ConstantPressure:
def init(self, p_set=0.45, n_pumps=3):
self.p_set = p_set
self.pumps = [Pump(f"#{i+1}泵") for i in range(n_pumps)]
self.freq = 0.0 # 变频泵频率 Hz
self.kp, self.ki = 120.0, 8.0
self.integral = 0.0
self.sleep = False

def pid(self, p_now, dt=1.0):
    err = self.p_set - p_now
    self.integral += err * dt
    out = self.kp*err + self.ki*self.integral
    self.freq = max(20.0, min(50.0, self.freq + out*0.02))
    return self.freq

def pick_pump(self):
    # 选累计运行时间最短、无故障的泵,均衡磨损
    avail = [p for p in self.pumps if not p.fault]
    return min(avail, key=lambda x: x.runtime) if avail else None

def step(self, flow, p_now, dt=1.0):
    # 1) 故障自投:运行泵故障,立刻切到备用泵
    for p in self.pumps:
        if p.running and p.fault:
            p.running = False
            backup = self.pick_pump()
            if backup: backup.running = True

    # 2) 小流量保压/休眠:流量极小且压力达标,变频泵休眠
    if flow < 0.5 and p_now >= self.p_set - 0.01:
        self.sleep = True
        for p in self.pumps: p.running = False
        return "休眠保压"
    if self.sleep and (flow > 1.0 or p_now < self.p_set - 0.03):
        self.sleep = False     # 用水恢复,唤醒

    # 3) PID 调变频
    f = self.pid(p_now, dt)

    # 4) 加减泵:频率到顶仍欠压则加泵;到底且超压则减泵
    running = [p for p in self.pumps if p.running]
    if f >= 49.5 and p_now < self.p_set - 0.02 and len(running) < len(self.pumps):
        p = self.pick_pump(); p.running = True
    elif f <= 21.0 and p_now > self.p_set + 0.02 and len(running) > 1:
        for p in reversed(running): p.running = False; break

    # 至少保证变频泵在跑
    if not self.sleep and not any(p.running for p in self.pumps):
        self.pick_pump().running = True
    for p in self.pumps:
        if p.running: p.runtime += dt
    return f"频率{f:.1f}Hz, 运行泵={[p.name for p in self.pumps if p.running]}"

模拟一天用水波动

ctrl = ConstantPressure()
p_now = 0.40
for t in range(0, 60, 5):
flow = 8 - 6*(0.5+0.5*((t//20)%2)) # 模拟用水大小波动
p_now += (ctrl.p_set - p_now)0.3 - flow0.004
print(f"t={t:2d} 流量={flow:.1f} 压力={p_now:.3f} -> {ctrl.step(flow, p_now)}")
三、关键工程点说明

  1. 多泵轮换: 代码用累计运行时间选泵,工程上叫"均衡磨损",避免一台泵先坏。IntBoxIO内置该策略,还支持按固定周期轮换。
  2. 加减泵回差(死区): 必须设阈值回差,否则压力在临界点会频繁加减泵(抖动),代码用0.02MPa的偏差带就是这个目的。
  3. 小流量休眠与唤醒: 夜间几乎不用水时让泵休眠保压,用水一来立即唤醒,是二次供水节能的关键。
  4. 故障自投: 运行泵故障先置位,再从无故障泵里选备用,保证不断水。真实工程还要采集热继电器、变频器故障字。
  5. 水锤防护: 加减泵和启停要做软启软停、延时,代码从略,工程控制器内置。
    四、从仿真到工程
    实际泵房不会用Python做实时控制,而是把这套逻辑固化在工业控制器里。威泰普IntBoxIO通过零代码Web组态把PID参数、加减泵阈值、轮换周期、休眠唤醒条件做成可配置项,同时接入余氯浊度做水质联锁、接入环境安防做无人值守报警,可靠性和实时性远高于脚本方案。仿真的意义在于帮你理解逻辑、调试参数、和现场工程师对得上话。
Logo

一站式 AI 云服务平台

更多推荐