1. 污水处理行业与PLC控制系统的天然契合
在工业自动化领域,污水处理厂一直被视为PLC(可编程逻辑控制器)应用的经典场景。这个看似传统的行业,其实对自动化控制有着极其严苛的要求——需要7×24小时不间断运行,处理过程涉及物理、化学和生物反应的复杂协同,还要应对进水水质波动、设备老化、环境腐蚀等现实挑战。
我参与过三个日处理量万吨级的市政污水处理项目,全部采用西门子S7-1200系列PLC作为核心控制器。选择这款中端PLC并非偶然:它比S7-200 SMART系列拥有更强的通信能力和扩展性,又不像S7-1500那样成本高昂,正好匹配污水处理厂"可靠够用"的选型原则。特别是其内置的PROFINET接口,可以轻松连接分布式I/O站和HMI人机界面,这对分散式布局的污水处理厂尤为关键。
典型的污水处理PLC系统架构分为三层:
- 现场层:各类传感器(pH计、DO仪、浊度仪等)和执行机构(泵、阀、曝气机等)
- 控制层:S7-1200 PLC及其扩展模块
- 监控层:KTP1200触摸屏或上位SCADA系统
这种架构下,S7-1200需要处理的任务包括:
- 实时采集进水COD、氨氮等关键指标
- 控制格栅机、提升泵的启停逻辑
- 调节生物反应池的曝气量
- 管理污泥回流比例
- 联锁保护关键设备
关键经验:污水处理项目必须考虑IP防护等级。我们所有现场柜都选用IP65防护,PLC本体安装在控制室,通过ET200SP分布式I/O连接现场设备。这种设计既保证了控制器的工作环境,又减少了信号传输距离。
2. S7-1200硬件配置的实战要点
2.1 基础模块选型策略
在最近的一个AAO工艺(厌氧-缺氧-好氧)污水处理项目中,我们的核心控制站采用以下配置:
- CPU 1215C DC/DC/DC(6ES7 215-1AG40-0XB0)
- 信号模块:
- SM 1231 AI 8×13bit(6ES7 231-4HD32-0XB0)
- SM 1232 AQ 4×14bit(6ES7 232-4HD32-0XB0)
- SM 1231 RTD 4×16bit(6ES7 231-5PD32-0XB0)
- 通信模块:
- CM 1241 RS485(6ES7 241-1CH32-0XB0)
- CM 1243-5 PROFIBUS DP(6ES7 243-5HX00-0XB0)
这个配置可以满足:
- 16路模拟量输入(pH、DO、MLSS等)
- 8路模拟量输出(变频器控制)
- 4路热电阻(温度监测)
- 与第三方设备(如鼓风机)的PROFIBUS DP通信
- 通过RS485实现Modbus RTU协议(连接实验室水质分析仪)
2.2 特殊模块的应用技巧
污水处理中有些特殊信号需要特别注意:
-
4-20mA信号抗干扰:我们在SM1231模块前都加装了信号隔离器(如魏德米勒的ACT20C),特别是有变频器运行的场合。实测表明,这可以将信号波动降低60%以上。
-
RTD温度测量:生物反应池的温度变化很缓慢,但精度要求高。我们采用三线制PT100,并在程序里添加了移动平均滤波:
ST复制"Temp_Filter".IN := "RTD_RAW";
"Temp_Filter".PT := T#30S;
"REACTOR_TEMP" := "Temp_Filter".OUT;
- 数字量输入防抖:格栅机的运行反馈信号常伴有抖动,通过硬件滤波(在DI模块上设置6ms滤波时间)和软件延时(在OB1中添加50ms延时判断)双重保障。
2.3 电源设计的隐藏陷阱
很多初入行的工程师会忽略电源配置的细节。在我们的项目中,坚持以下原则:
- 总电源采用隔离变压器(如西门子的SITOP PSU100B)
- 每个机柜配置独立的24VDC电源(如6EP1336-3BA00)
- 重要I/O回路使用冗余电源
- 所有电源模块留出30%余量
曾有一个惨痛教训:某项目为节省成本,将PLC电源与变频器共用一个回路,结果变频器启停时导致PLC重启。后来整改为独立供电后问题彻底解决。
3. 污水处理专用功能块开发
3.1 曝气量模糊控制算法
生物反应池的溶解氧(DO)控制是污水处理的核心,传统PID控制难以应对进水负荷变化。我们基于S7-1200的SCL语言开发了模糊PID功能块:
SCL复制FUNCTION_BLOCK "Fuzzy_PID_DO_Control"
VAR_INPUT
SP : REAL; // 设定值(mg/L)
PV : REAL; // 实测值
Err_DeadBand : REAL := 0.2; // 死区
END_VAR
VAR_OUTPUT
OUT : REAL; // 输出(0-100%)
END_VAR
VAR
// 模糊规则表
Rule_Table : ARRAY[1..5, 1..5] OF REAL := [
[30, 40, 50, 60, 70],
[40, 50, 60, 70, 80],
[50, 60, 70, 80, 90],
[60, 70, 80, 90, 95],
[70, 80, 90, 95, 100]];
// 隶属度计算
E_MF : ARRAY[1..5] OF REAL; // 误差隶属度
dE_MF : ARRAY[1..5] OF REAL; // 误差变化率隶属度
END_VAR
// 模糊化处理
E := SP - PV;
dE := (E - "Last_E") / T#1S;
// 隶属度计算(三角隶属函数)
// ...详细计算过程省略...
// 模糊推理与解模糊(加权平均法)
OUT := 0.0;
Total_Weight := 0.0;
FOR i := 1 TO 5 DO
FOR j := 1 TO 5 DO
Weight := E_MF[i] * dE_MF[j];
OUT := OUT + Weight * Rule_Table[i,j];
Total_Weight := Total_Weight + Weight;
END_FOR;
END_FOR;
OUT := OUT / Total_Weight;
实际应用表明,相比传统PID,这种算法在进水COD波动时能将DO控制精度提高40%,同时减少曝气能耗约15%。
3.2 污泥龄(SRT)自动计算
污泥龄是活性污泥系统的重要参数,我们开发了自动计算功能:
LAD复制Network 1: 计算每日排泥量
"TANK_VOLUME" "DAILY_WAS_FLOW"
------[MUL]--------------[MOV]----->"TODAY_WAS"
"WAS_CONCENTRATION" 3.6E6
Network 2: 累计7天滑动平均值
"TODAY_WAS" "SRT_ACCUMULATOR"
------[ADD]--------------[MOV]----->"SRT_ACCUMULATOR"
"SRT_ACCUMULATOR" "SRT_ACCUMULATOR"[6]
------[SUB]--------------[MOV]----->"SRT_ACCUMULATOR"
Network 3: 计算SRT
"TANK_MLSS" "SRT_DAYS"
------[MUL]--------------[DIV]----->"ACTUAL_SRT"
"TANK_VOLUME" "SRT_ACCUMULATOR"/7
配合HMI上的趋势图,操作人员可以直观地调整排泥泵运行时间,将SRT控制在设计值(15-20天)范围内。
3.3 设备轮换与均衡运行
污水处理厂的泵、风机等设备需要定期轮换以延长寿命。我们采用基于运行小时数的智能轮换策略:
- 在DB中为每台设备创建运行时间计数器
- 每次启动时记录时间戳
- 停机时计算本次运行时长并累加
- 选择累计运行时间最少的设备作为下次启动的首选
SCL复制FUNCTION "Select_Pump" : INT
VAR_INPUT
Pump_Array : ARRAY[1..4] OF REAL; // 各泵运行小时数
END_VAR
VAR_TEMP
Min_Index : INT := 1;
i : INT;
END_VAR
FOR i := 2 TO 4 DO
IF Pump_Array[i] < Pump_Array[Min_Index] THEN
Min_Index := i;
END_IF;
END_FOR;
RETURN Min_Index;
4. 通信组网中的典型问题解决
4.1 KTP1200触摸屏的优化技巧
在三个项目中,我们都采用KTP1200 Basic作为现场操作面板。总结出以下经验:
-
画面加载优化:
- 将静态背景图片转换为"图形列表"
- 使用"可见性"属性控制元素显示而非加载多个画面
- 压缩所有图片为8位色深PNG格式
-
报警管理改进:
TIA复制1. 在"报警类"中创建"工艺报警"、"设备故障"等自定义类别
2. 为每类报警设置不同的确认模式(如工艺报警需双重确认)
3. 在HMI变量中关联PLC的报警字(Alarm_Word)
4. 添加报警视图时启用"分组显示"和"筛选"功能
- 数据记录技巧:
- 关键参数(如进水COD)采用循环记录(5000条)
- 异常事件采用触发式记录(如pH超标时记录前后5分钟数据)
- 通过"计划任务"每天凌晨3点自动导出CSV到U盘
4.2 Modbus RTU通信的坑与解决方案
与实验室水质分析仪(哈希DR3900)的Modbus通信曾让我们头疼不已:
问题现象:
- 通信时断时续
- 读取的数据偶尔跳变
- 长时间运行后通信完全中断
排查过程:
- 用串口监听工具发现:
- 从站响应时间超过PLC默认的300ms超时
- 存在CRC校验错误的数据包
- 检查物理层:
- 线路长度(120米)接近RS485极限
- 末端未接120Ω终端电阻
- 屏蔽层单端接地
解决方案:
- 硬件改造:
- 增加RS485中继器(型号ADAM-4520)
- 两端添加终端电阻
- 改为双端接地
- 软件调整:
SCL复制// 修改CM1241通信参数
"Modbus_CM".MB_MASTER_DB.PORT := 1;
"Modbus_CM".MB_MASTER_DB.BAUD := 19200;
"Modbus_CM".MB_MASTER_DB.PARITY := 2; // 偶校验
"Modbus_CM".MB_MASTER_DB.TIME_OUT := T#1000MS; // 延长超时
// 添加重试机制
IF NOT "MB_Read_Done" THEN
"Retry_Counter" := "Retry_Counter" + 1;
IF "Retry_Counter" >= 3 THEN
// 触发报警
"Comm_Fault" := TRUE;
ELSE
// 重新发起读取
"MB_Read_REQ" := FALSE;
"MB_Read_REQ" := TRUE;
END_IF;
END_IF;
改造后通信稳定性从原来的85%提升到99.9%,数据异常跳变完全消失。
4.3 PROFIBUS DP网络诊断进阶
与鼓风机(罗茨风机)的PROFIBUS DP通信曾出现间歇性中断:
诊断步骤:
-
通过在线诊断查看CM1243-5模块的"诊断缓冲区":
- 错误代码:0x3421(从站响应超时)
- 发生时间:每天上午9:00-10:00
-
使用SIMATIC NET软件进行网络分析:
- 发现信号质量在故障时段下降
- 波形显示存在反射干扰
-
现场检查:
- 发现PROFIBUS电缆与变频器动力线平行敷设
- 接头处屏蔽层处理不规范
整改措施:
- 重新敷设电缆,与动力线保持30cm以上距离
- 所有接头改用专用PROFIBUS连接器(6ES7 972-0BA52-0XA0)
- 在OB86中添加故障处理逻辑:
LAD复制Network 1: PROFIBUS故障处理
"DP_Slave_Fault" "Emergency_Stop"
------[ ]-----------------( )------
"DP_Slave_Fault" "Alarm_Horn"
------[ ]-----------------(S)------
"DP_Slave_Fault" "HMI_Alarm_Word".12
------[ ]-----------------( )------
5. 维护与调试的实战经验
5.1 在线修改的禁忌与正确姿势
污水处理厂要求连续运行,在线修改程序是常态,但必须遵循规范:
绝对禁止的操作:
- 在线修改硬件配置
- 修改正在使用的FB/FC接口
- 更改OB块的组织结构
安全操作流程:
- 在测试PLC上验证修改
- 做好原始程序备份(建议每天一个版本)
- 选择低负荷时段进行下载
- 下载前告知中控室操作人员
- 使用"仅下载"模式(不重新初始化DB)
- 下载后立即测试关键功能
5.2 故障诊断的"望闻问切"
总结出四步诊断法:
-
望:
- 查看CPU诊断指示灯(RUN/STOP/ERROR)
- 检查HMI上的报警画面
- 观察现场设备状态
-
闻:
- 听继电器是否有异常吸合声
- 闻柜内是否有焦糊味
-
问:
- 询问操作人员故障前后的操作
- 查看运行记录曲线
-
切:
- 使用TIA Portal的在线诊断
- 测量关键点电压信号
- 强制IO点测试
5.3 预防性维护计划
我们为每个项目制定的维护计划包括:
每日检查:
- 清除CPU诊断缓冲区
- 检查存储卡剩余空间
- 备份运行参数
月度维护:
- 清洁PLC散热风扇
- 紧固所有接线端子
- 测试备用电池电压
- 模拟量通道校准
年度大修:
- 更换所有继电器(无论好坏)
- 重新下载完整程序
- 接地电阻测试
- 通信线路衰减测试
血泪教训:某厂因未定期更换继电器,导致沉淀池排泥阀失控,造成污泥流失。后来我们强制规定:所有关键回路的继电器每2年必须更换,不论实际使用情况。
6. 从实践中来的编程规范
6.1 污水处理专用命名法则
我们制定的命名规则包含工艺信息:
-
变量名结构:工艺段_设备_参数_性质
- 例如:"ANA_P1_RUN_FB"表示厌氧段1号泵运行反馈
- "OX_DO_SP"表示好氧段溶解氧设定值
-
前缀约定:
- "A_":模拟量(A_IN_PH)
- "D_":数字量(D_OUT_PUMP)
- "T_":时间(T_PUMP_DELAY)
- "C_":计数器(C_PUMP_START)
6.2 程序结构设计原则
采用模块化设计:
code复制OB1:主循环
├─ FC100:格栅控制
├─ FC200:提升泵控制
├─ FC300:生物反应池控制
├─ FC400:二沉池控制
├─ FC500:污泥处理
└─ FC600:消毒系统
DB结构:
├─ DB1:工艺参数
├─ DB2:设备状态
├─ DB3:报警管理
├─ DB4:通信数据
└─ DB5:历史记录
每个功能块遵循"单一职责原则",如FC300只处理生物反应池相关逻辑,避免交叉调用。
6.3 异常处理的"三道防线"
-
初级防护:硬件保护
- 过载继电器
- 限位开关
- 安全栅
-
次级防护:软件联锁
SCL复制// 泵保护逻辑
IF "Pump_Run_FB" AND NOT "Pump_Stop_Cmd" THEN
IF "Pump_Overload" OR "Pump_Leakage" THEN
"Pump_Stop_Cmd" := TRUE;
"Alarm_Pump_Fault" := TRUE;
END_IF;
END_IF;
- 终极防护:OB块处理
- OB82:诊断中断
- OB85:程序执行错误
- OB86:机架故障
- OB121:编程错误
在OB中记录错误代码并触发紧急停机:
ST复制// OB82示例
"Diag_Buffer".Event_ID := OB82_EV_CLASS;
"Diag_Buffer".Module_Addr := OB82_MDL_ADDR;
"Diag_Buffer".Error_Code := OB82_ERR_CODE;
"HMI_Alarm_Word".15 := TRUE; // 触发硬件故障报警
这套机制在去年成功预防了三次重大设备事故,其中一次是及时发现潜水泵的绝缘下降问题,避免了水下短路的风险。
