去年接手了一个老旧小区供水改造项目,原本以为就是简单的设备更换,结果发现高层供水系统的水压控制比想象中复杂得多。特别是当早晚上下班高峰期,低层用户一开水龙头,高层住户的热水器就直接罢工,物业每天接到的投诉电话能打爆。为了解决这个问题,我决定先用仿真系统摸清规律,再上真机调试。
变频恒压供水系统听起来高大上,其实核心原理就是通过PLC控制水泵转速,让管网压力保持恒定。但实际调试中发现,光是理解"恒压"这两个字就够喝一壶的——到底是在哪个位置恒压?泵出口?管网末端?还是每层楼的分支管道?这些细节直接关系到PID参数的整定效果。有次我把压力传感器装错了位置,结果系统疯狂震荡,水泵差点被玩坏。
理解水压变化规律是调试的基础。我把小区18层的供水管网简化成电阻电容模型:水管是电阻,水箱和管道存水是电容。早高峰时低层用户集中用水(相当于并联电阻突然减小),会导致高层支路压降剧增。通过MATLAB仿真发现,当6层以下同时有10户开水龙头时,18层的水压会从0.28MPa骤降到0.15MPa以下——这正是热水器罢工的临界点。
关键发现:压力传感器必须装在管网最不利点(通常是最高层的最远端),否则无法反映真实用水工况。我们最初装在泵房出口的压力表读数很稳,但顶楼住户照样没水用。
采用三泵组阶梯控制+单泵PID调速的方案:
PID参数整定有个小技巧:先关闭微分项,把比例系数从0.5开始逐步上调,直到出现轻微震荡,然后取该值的60%作为最终参数。我们的经验值是P=1.2, I=180s, D=15s,这个组合在多数工况下都能稳定控制。
st复制// 主OB块中的压力控制逻辑
IF "自动模式" THEN
"设定压力" := "压力设定值" + "夜间补偿值";
"PID_DB".PV := "实际压力"; // 来自最不利点传感器
"PID_DB".SP := "设定压力";
"PID_Output" := "PID_DB".LMN;
// 泵组控制逻辑
IF "PID_Output" > 75.0 AND NOT "泵2运行" THEN
"启动泵2" := TRUE;
ELSIF "PID_Output" < 30.0 AND "泵2运行" THEN
"停止泵2" := TRUE;
END_IF;
END_IF;
压力采样滤波:采用移动平均滤波,窗口宽度设为10秒,避免水锤干扰
st复制// FB501滤波算法
"采样缓冲区"["当前指针"] := "原始压力值";
"当前指针" := ("当前指针" + 1) MOD 10;
"滤波后压力" := SUM("采样缓冲区") / 10.0;
水泵轮换控制:每24小时自动切换主备泵,均衡磨损
st复制IF "系统时钟".HOUR = 0 AND "系统时钟".MINUTE < 5 THEN
IF NOT "轮换完成标志" THEN
"当前主泵" := ("当前主泵" + 1) MOD 3;
"轮换完成标志" := TRUE;
END_IF;
ELSE
"轮换完成标志" := FALSE;
END_IF;
第一次调试时把传感器装在泵出口,结果出现严重振荡:
夜间用水量小于5m³/h时出现的问题:
突然停泵导致管道巨响的排查:
st复制IF "停止命令" THEN
FOR "i" := 100 DOWNTO 30 BY -5 DO
"变频器频率" := "i";
DELAY 500ms;
END_FOR;
"接触器断开" := TRUE;
END_IF;
通过触摸屏设置分时段压力:
加装电表采集三相电流,计算实时能耗:
st复制"单泵功率" := SQRT(3) * "电压" * "电流" * 0.85 / 1000; // kW
"系统总能耗" := RECORD_SUM("功率历史", 24h);
通过OPC UA将数据转发到云平台:
这套系统运行半年后,小区水压投诉归零,每月节电约800度。最让我意外的是,通过分析用水曲线,物业还发现了3户长期偷水的业主——因为他们的夜间用水模式明显异常。看来自动化系统不仅能解决问题,还能当侦探用。