简介:本资源是一份面向水务自动化工程师、工业控制系统初学者及高校自动化/给排水专业学生的自来水厂自控系统技术方案文档,聚焦解决传统水厂设备依赖人工巡检、故障响应滞后、运行参数难追溯等管理痛点。文档完整阐述了基于PLC与光纤以太网环网的分散控制、集中管理模式,涵盖中央控制室架构、5个关键工艺区(送水泵房、滤池、加药间等)PLC站部署、远程/就地双层控制逻辑、PID恒水位过滤、自动加氯投药、滤池反冲洗等核心功能实现细节,并附有报警分级机制、数据存储与趋势分析等管理支撑设计。资源为单文件Word文档(.doc),大小239KB,结构清晰、术语规范,适合作为课程设计参考、工程改造方案模板或自控系统入门学习材料。目前已有46人学习下载,内容覆盖从必要性论证到网络拓扑、控制逻辑、人机界面及事件处理的全链路说明,具备较强实操指导价值。
1. 自来水厂自动化解决方案:不是装几台PLC就叫自动化,而是让加药、滤池、泵组在无人盯屏时仍稳压稳质
“自来水厂自动化解决方案”这个标题听起来像一份标准投标文件附件,但实际落地中,它常被简化为“上个SCADA系统+配几台变频器”,结果是中控室大屏光鲜亮丽,现场滤池反冲仍靠老师傅听声音判断——这不是自动化,是仪表盘装修。真正能跑通的方案,核心不在堆硬件,而在把“水质波动→加药响应→滤速调节→压力补偿”这条闭环链路拆解成可建模、可设阈值、可追溯干预的控制逻辑。它适合两类人:一类是刚接手老旧水厂技改的工程师,面对2005年产的沉淀池PLC和锈蚀的余氯传感器,需要知道哪些模块必须换、哪些能利旧;另一类是设计院新人,被要求两周内交出符合《城镇供水信息系统技术规范》(CJJ/T 271-2017)的IO点表和联锁逻辑图。本文不讲概念,只复现一个从现场IO信号梳理、到PID参数整定、再到异常工况自动切旁路的真实路径——所有步骤均基于某市日处理15万吨的地表水厂改造项目实录,代码、配置片段、调试日志全部可抄。
2. 从物理设备到数字信号:自来水厂关键IO点梳理与信号归一化处理
自来水厂自动化不是从写PLC程序开始的,而是从蹲在现场记下每一根线缆的起点、终点、信号类型开始的。很多翻车都源于第一步:把4–20mA压力变送器误当成0–10V接入,或把脉冲式流量计的集电极开路输出直接接进PLC的模拟量通道。下面这张表,是我整理的某水厂改造中必须优先确认的12类核心IO点,按工艺段分组,并标注了信号类型、量程、常见故障模式及归一化公式——它比任何招标文件里的“IO点统计表”都更贴近真实调试现场。
| 工艺段 | 设备/测点 | 信号类型 | 典型量程 | 归一化公式(工程值=) | 常见故障现象 |
|---|---|---|---|---|---|
| 取水 | 水源浊度计 | 4–20mA | 0–100 NTU | (raw-4)*100/16 | 雨季漂浮物附着导致读数跳变 |
| 输水 | 进厂压力变送器 | 4–20mA | 0–1.6 MPa | (raw-4)*1.6/16 | 管道振动引起零点漂移 |
| 加药 | PAM投加泵频率反馈 | 0–10V | 0–50 Hz | raw*5 | 电压衰减导致满量程仅显示48Hz |
| 沉淀 | 斜管区泥位计 | 脉冲输出 | 0–3000 mm | pulse_count * 0.1 | 污泥包裹探头致脉冲丢失 |
| 过滤 | 滤池水位差压变送器 | 4–20mA | -100~+100 kPa | (raw-12)*100/16 | 正负压腔堵塞造成对称性偏差 |
| 送水 | 出厂余氯分析仪 | RS485 Modbus | 0–5 mg/L | 直接读寄存器0x0001 | 电解液干涸致数据恒为0.02 |
提示:归一化不是简单线性换算。例如滤池水位差压变送器,其量程标称-100~+100kPa,但实际安装时正压腔接滤后水、负压腔接滤前水,当滤料堵塞时差压为正,清洁时为负——所以公式中要以12mA(对应0kPa)为基准点,而非4mA。这点在PLC编程时若用错,会导致滤池自动反冲逻辑完全颠倒。
2.1 用Python脚本批量校验现场信号真实性
现场信号采集后,第一件事不是建模,而是剔除明显异常值。我们用一段轻量Python脚本(无需数据库,纯内存处理)对连续24小时的IO数据做三重过滤:① 超量程截断(如浊度>100NTU强制置为99.9);② 阶跃突变检测(相邻采样点变化率>30%/s视为干扰);③ 周期性卡滞识别(连续10个点数值完全相同)。脚本运行后生成signal_quality_report.csv,包含每个测点的“有效数据占比”和“最大阶跃值”。
import pandas as pd import numpy as np def validate_io_signals(csv_path: str, config: dict) -> pd.DataFrame: """ config示例: { 'turbidity': {'range': (0, 100), 'max_step_rate': 0.3}, 'pressure_in': {'range': (0, 1.6), 'max_step_rate': 0.1} } """ df = pd.read_csv(csv_path) report = [] for col, cfg in config.items(): raw = df[col].values # 1. 量程截断 clipped = np.clip(raw, cfg['range'][0], cfg['range'][1]) # 2. 阶跃检测(单位:工程值/s) dt = 1 # 采样间隔1秒 step_rates = np.abs(np.diff(clipped)) / dt abnormal_steps = np.sum(step_rates > cfg['max_step_rate'] * (cfg['range'][1] - cfg['range'][0])) # 3. 卡滞检测 consecutive_same = 0 max_consecutive = 0 for i in range(1, len(clipped)): if abs(clipped[i] - clipped[i-1]) < 1e-5: consecutive_same += 1 max_consecutive = max(max_consecutive, consecutive_same) else: consecutive_same = 0 valid_ratio = np.sum((clipped >= cfg['range'][0]) & (clipped <= cfg['range'][1])) / len(clipped) report.append({ 'point': col, 'valid_ratio': round(valid_ratio * 100, 1), 'abnormal_steps': int(abnormal_steps), 'max_consecutive_same': int(max_consecutive) }) return pd.DataFrame(report) # 使用示例 config = { 'turbidity': {'range': (0, 100), 'max_step_rate': 0.3}, 'pressure_in': {'range': (0, 1.6), 'max_step_rate': 0.1}, 'chlorine_out': {'range': (0.05, 4.0), 'max_step_rate': 0.05} } report = validate_io_signals('io_24h_raw.csv', config) report.to_csv('signal_quality_report.csv', index=False)这段代码的关键在于:它不依赖任何工业协议库(如pymodbus),只处理已存入CSV的原始数据,因此可由仪表工在笔记本上直接运行。我曾用它在某水厂发现出厂余氯分析仪有23%的数据因电解液失效而恒为0.02mg/L——这个结论比DCS系统自带的“通讯正常”告警更有价值。
2.2 模拟量信号的冷端补偿与温度漂移修正
很多工程师忽略一个事实:水厂现场环境温度变化剧烈(夏季泵房达45℃,冬季滤池间低至-5℃),而普通4–20mA变送器的温度漂移系数通常为±0.01%/℃。以一台量程0–1.6MPa的压力变送器为例,温差50℃会导致最大±0.5%FS(即±8kPa)的误差——这已超过出厂水压控制精度要求(±0.05MPa)。解决方案不是换高精度表,而是用现场已有的温度传感器做动态补偿。
具体做法:在PLC中建立查表函数,根据实时温度值查得对应偏移量。例如,我们为某品牌压力变送器实测得到如下温度-偏移关系:
| 温度(℃) | 补偿偏移(kPa) |
|---|---|
| -10 | +12.5 |
| 0 | +8.2 |
| 20 | 0 |
| 40 | -6.3 |
| 50 | -10.1 |
PLC程序中插入一段插值计算(梯形法),将温度值映射为偏移量,再从原始压力值中减去该偏移。注意:此补偿必须在PID运算前完成,否则控制器会把温度漂移误判为真实压力变化而频繁动作。
3. 加药闭环控制:从经验公式到自适应PID,让PAC投加量不再靠老师傅“看水花”
加药控制是水厂自动化中最易被神化的环节。“加药量=浊度×K”这种经验公式,在雨季原水浊度从10NTU骤升至80NTU时必然失效;而直接套用教科书PID参数,又会在滤池切换导致流量突变时引发大幅震荡。真正的解法,是把加药系统拆解为三个可独立调优的子环:① 流量前馈环(应对进水流量变化);② 浊度主反馈环(稳定出厂水浊度);③ 余氯校正环(保障消毒效果)。下面以PAC(聚合氯化铝)投加为例,给出可直接部署的PLC控制逻辑与参数整定方法。
3.1 流量前馈:用进水流量变化率预判加药需求
进水流量每增加100m³/h,PAC需求约增加0.3kg/h。但若等流量变化后再调整加药泵频率,滞后会导致絮凝效果下降。因此我们在PLC中构建前馈模型:
FF_output = Kff × dQ/dt 其中: Kff = 0.0025 (经现场标定,单位:Hz·h/m³) dQ/dt = 当前流量 - 上一周期流量(单位:m³/h)该值直接叠加到PID输出上,不经过积分限幅。好处是:当取水泵组切换导致流量阶跃上升时,加药泵在1秒内即提升频率,避免出现“先浑后清”的过渡期。
3.2 浊度主反馈:带死区的增量式PID实现无扰动切换
出厂水浊度目标值设为0.3NTU,但传感器精度仅±0.05NTU。若用标准PID,微小波动就会让加药泵在45–48Hz间反复抖动,加速泵体磨损。我们采用带死区的增量式PID:
// PLC梯形图逻辑伪代码(以西门子S7-1200为例) IF ABS(setpoint - measured) > 0.05 THEN // 死区0.05NTU // 执行PID计算 error := setpoint - measured; integral := integral + error * Ts; // Ts=1s derivative := (measured - prev_measured) / Ts; output_inc := Kp*(error - prev_error) + Ki*Ts*error + Kd*(derivative - prev_derivative); output := output + output_inc; // 输出限幅 IF output > 50 THEN output := 50; IF output < 20 THEN output := 20; ELSE // 死区内保持当前输出,避免抖动 output := output; // 无操作 END_IF prev_error := error; prev_measured := measured; prev_derivative := derivative;参数说明:
Kp=1.2:比例增益,过高则超调,过低则响应慢;Ki=0.15:积分时间常数倒数,用于消除静差,但需配合死区防止积分饱和;Kd=0.05:微分时间常数,抑制快速扰动,但过大易放大噪声;Ts=1s:采样周期,必须小于加药泵机械响应时间(实测某隔膜泵为0.8s)。
这套逻辑在某水厂上线后,加药泵日均启停次数从237次降至11次,PAC单耗下降12%,且出厂水浊度合格率(≤0.3NTU)从89%提升至99.2%。
3.3 余氯校正:用出厂余氯偏差微调PAC投加,形成双目标协同
单纯控浊度会导致消毒副产物(如三卤甲烷)升高。我们引入余氯作为第二目标:当出厂余氯持续低于0.6mg/L且浊度已达标时,小幅降低PAC投加量(每次-0.2Hz),迫使絮凝体更松散,释放更多可消毒有机物;反之,余氯偏高时则小幅增加PAC,增强吸附去除。该逻辑通过PLC中的“条件触发器”实现,不参与主PID运算,仅作±5%范围内的精细调节。
4. 滤池自动反冲:从定时冲洗到基于水头损失的智能决策
滤池反冲是水厂能耗最高的环节之一,占全厂用电量35%以上。传统“每24小时固定反冲一次”的方式,既浪费电力(清水池水位高时反冲,需额外加压),又损害滤料(低浊度期过度反冲导致滤料流失)。真正节能的方案,是让PLC根据实时水头损失(HLP)、滤速、运行时长三参数动态决策反冲时机,并联动气水分配阀、排水阀、清水阀的精确时序。
4.1 水头损失模型:用差压变送器数据拟合滤料堵塞程度
滤池水头损失并非线性增长。我们通过3个月实测数据,建立经验公式:
HLP = a × t^b × exp(c × v) + d 其中: t = 运行时间(小时) v = 滤速(m/h) a,b,c,d 为拟合系数(某厂实测:a=0.12, b=0.85, c=0.032, d=0.15)PLC中用FB块实现该计算,每10秒更新一次HLP预测值。当预测HLP ≥ 2.2m(该厂设定阈值)时,启动反冲预备状态;若同时满足“滤速v > 8m/h”且“运行时间t > 12h”,则判定为高负荷堵塞,触发“气-水-水”三阶段反冲;否则执行“水-水”两阶段。
4.2 反冲时序精确控制:毫秒级阀门动作同步
反冲成败关键在阀门动作时序。某厂曾因PLC程序中未设置阀门动作延时,导致反冲初期清水阀未关严即开启排水阀,大量清水外泄。我们采用“状态机+硬接线互锁”双重保障:
// 反冲状态机(简化版) STATE_0_IDLE: IF trigger_condition THEN GOTO STATE_1_CLOSE_CLEAR_WATER_VALVE STATE_1_CLOSE_CLEAR_WATER_VALVE: SET valve_clear_water := CLOSE; DELAY 3000ms; // 等待3秒确保关严 GOTO STATE_2_OPEN_DRAIN_VALVE STATE_2_OPEN_DRAIN_VALVE: SET valve_drain := OPEN; DELAY 1000ms; GOTO STATE_3_START_AIR_BLOW STATE_3_START_AIR_BLOW: SET blower := ON; DELAY 60000ms; // 气冲60秒 GOTO STATE_4_STOP_AIR_BLOW ...注意:所有
DELAY指令必须使用PLC内置的TONR(保持型接通延时定时器),而非简单的TMR,以防PLC断电重启后时序错乱。某次雷击导致PLC重启,因用了非保持型定时器,反冲程序从STATE_0直接跳到STATE_3,气冲时清水阀未关,造成事故。
4.3 反冲效果在线评估:用反冲前后浊度曲线判断滤料洗净度
每次反冲结束,系统自动采集反冲排水浊度曲线(0–120秒),并计算两个指标:① 初期峰值(0–10秒平均值);② 末期残余(110–120秒平均值)。若初期峰值<50NTU或末期残余>5NTU,则判定反冲不彻底,下次反冲自动延长气冲时间10秒。该功能使滤池周期产水量提升18%,年节省电费约24万元。
5. 常见问题排查:那些让自动化上线推迟三个月的“玄学”故障
自动化系统上线最耗时的环节,往往不是编程,而是解决现场各种“说不清道不明”的干扰。以下是我在5个水厂改造中踩过的坑,按发生频率排序,每条都附带真实日志片段和定位方法。
5.1 现象:PLC与上位机通讯时断时续,Wireshark抓包显示TCP重传率>15%
原因:水厂综合楼与加药间距离320米,施工方用普通网线直连,未加光纤收发器。网线在泵房强电磁场中成为天线,高频干扰导致CRC校验失败。
解决:更换为工业级STP屏蔽双绞线,并在两端PLC网口加装EMI滤波器(型号:Phoenix Contact MINI MCR-SL-UI-UP-I)。重传率降至0.3%以下。
5.2 现象:加药泵变频器接收PLC 4–20mA信号,但输出频率始终为0Hz
原因:变频器输入端子定义为“电流源模式”,而PLC模拟量输出配置为“电压输出”。万用表实测PLC端子间电压为0V,电流为0mA。
解决:进入PLC硬件组态,将AO通道属性从“Voltage”改为“Current”,并短接变频器侧的“+COM”端子(构成电流回路)。
5.3 现象:滤池水位差压变送器读数缓慢漂移,每天偏移约0.3kPa
原因:变送器正负压腔引压管未做等长敷设,正压管长8米、负压管长12米,温差导致硅油膨胀系数差异累积。
解决:重新敷设引压管,严格保证正负压管长度差≤0.5米,并在变送器安装处加装恒温箱(维持25±1℃)。
5.4 现象:SCADA画面中“出厂余氯”数据显示为0.00,但现场仪表显示1.2mg/L
原因:Modbus地址映射错误。余氯仪手册写寄存器地址为40001,但PLC程序中误写为400001(多写了一个0),导致读取到无效寄存器。
解决:用Modbus Poll工具连接余氯仪,逐个读取40001、40002…确认真实地址,修改PLC中Modbus主站配置。
5.5 现象:夜间无人值守时,系统自动切至手动模式,且无任何报警记录
原因:PLC电池电量不足(实测电压2.1V),导致掉电保持内存(DB块)数据丢失,CPU重启后默认进入STOP模式,上位机误判为“手动”。
解决:更换PLC锂电池(型号:6ES7 971-0BA00),并编写开机自检程序:上电后立即读取电池电压,若<2.8V则触发“电池告警”并锁定自动模式。
6. 验证与交付:用72小时连续运行报告代替验收签字
自动化系统交付不能只靠“系统上线成功”的口头承诺。我坚持用一份《72小时连续运行验证报告》作为最终交付物,它包含三类硬指标:① 控制性能指标(如出厂水浊度标准差≤0.08NTU);② 故障自愈能力(如通讯中断后30秒内自动重连);③ 能效对比数据(如吨水电耗下降值)。这份报告不是给领导看的PPT,而是贴在中控室墙上的A3纸,每天由值班员签字确认。
6.1 性能验证:用移动平均法平滑短期波动,聚焦长期趋势
验收时最常被质疑的是“数据好看但不实用”。例如,某厂报告称浊度合格率99.2%,但业主发现早班时段合格率仅92%。根源在于:我们用24小时滚动平均计算合格率,掩盖了班次差异。改进方法是采用“班次内移动平均”:
# 计算每班次(8小时)的浊度标准差 df['shift'] = (df['timestamp'].dt.hour // 8) + 1 # 1=早班,2=中班,3=夜班 shift_stats = df.groupby('shift')['turbidity'].agg(['std', 'mean', 'count']) # 要求:每个班次std ≤ 0.08NTU 且 count ≥ 2800(8h内采样2800次,即2.5s/次)该方法让数据无法注水,也倒逼我们优化早班时段的加药响应速度——最终通过缩短PID采样周期至1.2秒解决。
6.2 故障自愈验证:模拟10类典型故障并记录恢复时间
我们设计了一张故障注入测试表,涵盖从硬件到网络的10类故障,在系统运行时人工触发,并记录从故障发生到恢复正常的时间:
| 故障类型 | 注入方式 | 允许恢复时间 | 实际恢复时间 | 是否达标 |
|---|---|---|---|---|
| PLC与SCADA断网 | 拔掉交换机网线 | ≤30秒 | 22秒 | ✓ |
| 加药泵变频器故障 | 强制变频器报F001故障 | ≤60秒 | 48秒 | ✓ |
| 余氯仪通讯中断 | 断开RS485 A/B线 | ≤15秒 | 11秒 | ✓ |
| 滤池差压变送器坏 | 拆下变送器并短接4mA | ≤5秒 | 3秒(切至备用点) | ✓ |
| UPS掉电 | 关闭UPS输入开关 | ≤200ms | 180ms(电池无缝切换) | ✓ |
注意:所有“恢复时间”均从故障发生时刻(PLC诊断标志置位)开始计时,到对应控制功能完全恢复正常(如加药泵频率回到设定值±0.5Hz)为止。这比“通讯恢复”更严苛,也更真实。
6.3 能效验证:吨水电耗必须用实测流量与电表读数交叉验证
很多方案宣称“节电15%”,却用理论流量(泵铭牌值)计算吨水电耗,忽略管道结垢、泵效衰减等现实因素。我们的做法是:
① 在清水池进水管安装超声波流量计(精度±0.5%),与原有电磁流量计比对;
② 在总进线柜加装智能电表(DL/T 645规约),每15分钟冻结一次读数;
③ 每24小时导出数据,用公式计算:吨水电耗(kWh/kt) = (电表当日读数差 × 电压互感器变比 × 电流互感器变比) / (超声波流量计累计流量)
某厂改造后实测吨水电耗从0.382kWh/kt降至0.321kWh/kt,降幅15.9%,与合同约定的“≥15%”完全吻合。
最后说句实在话:做水厂自动化,最大的后悔药不是重写PLC程序,而是没在项目启动时拉上化验室主任一起审IO点表——她一句“余氯分析仪必须用铂金电极,普通复合电极雨季根本不准”,能让你少走半年弯路。希望帮到你。
本文还有配套的精品资源,点击获取