污水处理项目西门子1200PLC实战:通讯、PID与调试避坑指南
发布时间:2026/9/9 13:24:41 作者:尧图编辑部 阅读量:1,286

做污水处理的项目控制方案十有八九会落到西门子1200PLC上。前阵子我正好把一个完整项目从电气设计、程序编写、现场调试跟到验收里面用了不少“骚操作”——不是野路子而是在常规做法里绕开坑、提高效率的实用手段。今天把整个项目的关键思路和踩坑记录整理出来希望能给做水务、环保项目的同行一点参考。很多人一听到“骚操作”会觉得是不按规范来、靠临时小聪明解决表面问题。但在自动化工程里真正高价值的骚操作往往是把规则和手册吃透之后针对现场实际情况做的灵活处理。这次项目涉及1台1214C做主站、3台smart200做分站、多台变频器和RS485仪表中间还经历了“TCP只能重启后连上一分钟”这种典型故障。我把这些过程全部拆开讲清楚每一步为什么这么做坑出在哪里。1. 先说说为什么奔着1200PLC去1.1 污水处理工艺要什么自动化污水处理厂的设备和仪表分布很散进水泵房的粗格栅、细格栅要靠液位差自动启停提升泵房里几台泵要按液位轮换运行生化池需要曝气风机维持溶解氧浓度加药间、污泥脱水间还有加药泵、螺杆泵和各类阀门。现场仪表数量也多超声波液位计、电磁流量计、DO分析仪、pH计、MLSS计4-20mA模拟量加起来就有几十路RS485通讯的设备也不少。控制逻辑分两大类。一类是顺序控制比如“液位到了高限开泵到了低限停泵”“格栅前后的液位差超过设定值就启动格栅”另一类是连续调节比如“根据溶解氧数值自动调节变频风机的转速”。这两类需求1200PLC都能覆盖。而且扩展模块、通讯模块的选型很成熟后期维护成本也低。1.2 1200和300、1500之间怎么选选CPU的时候我也纠结过到底用1200还是1500。当时对比了几个维度对比项S7-1200S7-1500S7-300定位中小型分布式控制中大型复杂控制老一代中型控制程序存储足够本项目更大常规够用运动控制/安全性基础支持功能强老平台较弱性价比高较高不便宜博途工程效率好好需要旧包支持这个项目总的IO点一百出头模拟量接近40路没有复杂运动控制需求用1500属于浪费。300系列虽然还有人在用但博途里配置新300项目的体验已经明显落后库存和备件也不好买。1200的1214C带个SM1231模拟量模块再加CB1241 RS485板卡刚好覆盖所有点位预算也压得下来。还有一个现实原因现场运维人员的水平参差不齐。用1200的博途工程结构比起老300的Step7要直观得多后面他们自己做维护也能上手。项目选型不光是技术问题也要考虑后续谁来看现场。1.3 最终系统架构最后确定的配置大概是这样的主站CPU 1214C DC/DC/DC固件V4.5扩展SM1231 8路模拟量输入模块 2块CB1241 RS485模块 1块HMIKTP1200 Basic PN通过以太网和PLC连接分站3台smart200分散在雨水泵房、加药间和污泥脱水间通过交换机和中控互联变频器2台ATV930、1台ABB ACS510走Modbus RTU挂在CB1241上仪表DO、pH、MLSS等模拟量变送器部分流量计走RS485主站和中控室、HMI之间用Profinet/工业以太网和分站smart200之间走S7通信和变频器、流量计走Modbus RTU。整体拓扑不复杂但涉及多协议所以后面的通讯调试才是大头。2. 模拟量采集和液位信号处理那些有味道的细节2.1 信号接线与隔离模拟量是污水处理项目里最容易出幺蛾子的环节。最开始现场调试时pH和DO两个信号在PLC里跳得厉害一度以为是模块坏了。后来拿万用表量变送器输出信号是稳的问题出在两根信号线跟动力电缆走了同一个桥架变频器一启动就干扰。处理办法很粗暴但有有效把所有4-20mA信号全部加装信号隔离器并且把信号线和动力线分开桥架走线。隔离器型号选用带配电输出的两线制隔离器直接从隔离器给变送器供电这样还顺便解决了部分变送器供电电压不足的问题。接线时要注意1200模拟量模块的通道分单端和差分两种接法如果变送器现场有地电位差最好是按差分方式接线。公用端COM不要乱串不然各路信号之间会形成地环路。等所有信号隔离器装完PLC里看到的数据基本稳定DCS和HMI上的曲线也干净了很多。2.2 NORM_X/SCALE_X的批量处理骚做法博途里做模拟量线性转换一般教程会让每个人拖一个NORM_X再接一个SCALE_X一个模拟量至少两个指令块。我来回做了几路之后就受不了了尤其是维护时要改量程得一个一个去找容易漏。我的做法是建一个结构体数组把每个通道的原始值、工程值、量程上限、量程下限、故障状态都装进同一个DB里。然后用一段SCL循环统一处理FOR i : 0 TO 15 DO // 原始值从模块输入字读取先转成实数 #rawValue : INT_TO_REAL(#aiWords[i]); // 断线或超限检查27648是满量程对应值 IF #rawValue 0.0 OR #rawValue 27648.0 THEN #alarm[i] : TRUE; ELSE #alarm[i] : FALSE; // 线性标定 #engValue[i] : #rawValue / 27648.0 * (#hiLimit[i] - #loLimit[i]) #loLimit[i]; END_IF; END_FOR;这样只要修改数组长度和每个通道的量程上下限所有模拟量处理全部搞定。新增通道时不用再复制粘贴NORM_X/SCALE_X也不容易出现漏改量程的低级错误。前提是对SCL语法熟悉如果还在用纯LAD建议把这个逻辑放到FB里用SCL段写循环体。2.3 液位滤波与防喘振逻辑进水液位受波浪影响非常严重直接用原始值做启停判断泵会在临界液位附近频繁启停不仅接触器受不了电机也容易过热。我在程序里加了一级滤波不是简单的一阶惯性而是一个长度为5的滑动平均值每100ms采样一次把最近5个值平均后再参与逻辑判断。防喘振不可能只靠滤波还需要在控制逻辑里做启停回差。比如开启液位1.8米停止液位0.8米最小启动间隔120秒这两条规则配合滑动平均基本杜绝了频繁启停。如果现场有多个泵还要考虑启动泵时其他泵会不会因为母管压力变化而误动作。所有这些逻辑全放在一个DB里方便后期根据工艺调试实时修改参数。3. S7通讯和Modbus轮询连接不稳定怎么治3.1 1台1200带多台smart200的S7通讯配置这个项目的分站是3台smart200和中控的1200一起挂在二层交换机上。1200作为客户端通过PUT/GET指令读取smart200的V区同时也会写入一些运行允许标志。smart200的配置并不复杂但有几个关键点必须注意第一个是smart200里必须勾选“允许来自远程对象的PUT/GET通信访问”如果不勾选1200那边连接建立成功但读写会报错。第二个是TSAP地址要配对1200作为客户端一般是0x0100smart200做服务器要设成0x0200位置不对连接就建立不起来。第三个是V区映射smart200的V区地址对应1200里PUT/GET的存储区时要把DB号和V区地址的关系搞清楚否则通信正常但读回来的数据全是零。我实际用了3个独立的PUT/GET块每一台分站一个配合状态机轮询。如果三个块同时触发以太网总线会有瞬时抢占容易丢包。所以我把三路读写放到一个100ms的周期里每路错开30ms左右触发实测下来稳定很多。3.2 连上1分钟就掉的根因排查网上搜“西门子tcp只有每次重启的时候才能连上一分钟”这个现象我太熟了。我们在调试分站通讯时也碰到过1200和smart200的连接刚建立后能通信几十秒然后就没数据了只有把PLC重启才能恢复一分钟。一开始以为是有线电视线接头问题换了水晶头和交换机端口都没用。后来仔细查真正的根因是PLC里的S7连接因为通信错误进入异常断开状态后没有触发自动重连。为什么重启能恢复因为重启会让连接资源完全释放。要彻底解决需要做三件事检查以太网的链路稳定性用电脑持续ping对端IP如果丢包率超过0.5%先解决物理层问题。在PUT/GET块的ENR和STATUS输出上做监控一旦返回非0错误码程序里要能够重新初始化连接块。把两个站的管理型交换机的“风暴抑制”和“端口协商”设置统一避免双方在自动协商时产生冲突。另外如果用的是第三方交换机尽量关闭绿色节能模式有些交换机会在长时间无大流量时把端口降速造成PLC之间的TCP连接被认为是空闲而超时断开。排查链路一定要按顺序来先物理层再链路层再做应用层。很多工程师一上来就改程序最后发现是网线问题白忙活。3.3 Modbus RTU轮询状态机搭建CB1241上的RS485口接了ATV930、ABB变频器还有几台带RS485的流量计。Modbus RTU是半双工总线一主多从同一个时间只能有一个从站响应主站的请求。如果在一个扫描周期里连续调用多个MB_MASTER块总线会乱套而且1200的通讯负载也会剧增。我的做法是用一个轮询状态机把每个从站的请求放进不同步骤由定时器每隔200ms触发一次一次只处理一个功能码。大致框架是这样CASE #modbusStep OF 0: // 读ATV930状态字从站地址1 #mbReq[0](REQ : #trig, MB_ADDR : 1, MODE : 3, DATA_ADDR : 3200, DATA_LEN : 2, DATA_PTR : ModbusDB.atv930Status); IF #mbReq[0].DONE THEN #modbusStep : 1; END_IF; 1: // 读ABB ACS510状态字从站地址2 #mbReq[1](REQ : #trig, MB_ADDR : 2, MODE : 3, DATA_ADDR : 4097, DATA_LEN : 2, DATA_PTR : ModbusDB.abbStatus); IF #mbReq[1].DONE THEN #modbusStep : 2; END_IF; // 后面继续加其他从站请求 END_CASE;每次触发都用一个200ms的脉冲避免多请求同时发送。每个从站还配了故障计数器和超时判断连续3次无响应就报通讯故障但不会影响其他从站的轮询。这样做的好处是现场加一台新仪表只需要在状态机里多一个步骤不需要改动原有逻辑维护非常方便。3.4 变频器通讯与控制字ATV930和ABB变频器的Modbus寄存器定义不一样写控制字时要特别小心。ATV930的标准控制字地址是3201状态字是3202速度给定地址是3204ABB ACS510则是控制字40001状态字40002给定值40003实际值40004。我踩过的坑是启动顺序如果直接给控制字发运行命令但速度给定还是0很多变频器会报堵转或过流。更稳妥的做法是先写速度给定值例如30Hz。等一个扫描周期确认状态字“准备就绪”。再写控制字启动位。停止时反过来先速度给定降到0延时2秒后再发停止命令。这个顺序在博途里用两个MB_MASTER调用就能实现但如果本来就在轮询状态机里可以给“写控制字”和“写给定”分配不同的状态步之间插入一个延时状态。实际效果是变频器启停平稳也没有报警。4. PID和泵组联锁被曝气折磨的日子4.1 溶解氧PID参数整定生化池曝气控制是项目的核心也是让我在现场熬了几个通宵的地方。DO分析仪把当前的溶解氧值传进1200PID_Compact输出一个4-20mA信号给变频风机风机根据给定调整转速。DO系统的时间常数很大曝气从改变转速到池内DO变化往往要几分钟甚至十几分钟所以PID参数不能按普通流量系统去整定。我初始参数是这样设的采样时间5秒PID增益 Kp2.0积分时间 Ti120秒微分时间 Tv0实际运行后发现Kp偏大DO会在设定值附近来回震荡。后来把Kp降到1.2Ti加到200秒曲线才稳定在2.0mg/L上下。如果现场有推流器开停会导致DO突然跳变这时微分反而有害所以我直接关掉微分。还有一个骚操作PID输出的上下限设在25%~90%变化率限制在每秒不超过2%。为什么下限设25%因为曝气风机有最低转速要求太低了会喘振变化率限制是为了防止DO突然越限时PID输出猛拉造成风机轴承应力。4.2 泵组交替和运行时间均衡提升泵房有3台泵两用一备。如果每次按液位高低固定启动1号和2号3号几乎永远在休息时间长了1号、2号磨损比3号严重得多。我的做法是在PLC里记录每台泵的累计运行时间每次需要增加一台泵时优先启动累计运行时间最短的那一台需要停止一台泵时优先停止累计运行时间最长的那一台。具体逻辑用FB块的静态变量循环计数每次加泵前扫描3个运行时间值选出最小值。每次减泵前扫描运行时间选出最大值。运行时间数据存入断电保持DB防止PLC重启后数据丢失。这套逻辑不复杂但很实用。实际运行一个月后再看3台泵的累计运行时间差不超过10%。维护下来轴承和密封件的更换周期能延长不少。4.3 手自动无扰切换与防误操作现场工人习惯在HMI上直接点手动按钮如果切换逻辑写得不好会在切换瞬间产生输出跳变导致泵或风机突然全速运行。我在这里做了一个无扰切换设计自动模式下PID输出值不断写到“实际输出变量”里手动模式下HMI输入值也写到“实际输出变量”里。切换时切换前的输出值会作为切换后的初始设定值。比如自动切手动时HMI上的手动给定值自动等于切换前PID输出值不会突然从80%跳回0%。这个用博途SCL写很直观// 切换瞬间保持输出平滑 IF #manualMode THEN #outputValue : #manualSetpoint; ELSE #outputValue : #pidOutput; END_IF;同时在每个泵的控制回路里加了启动间隔定时器、低液位禁止启动、泵全运行但母管压力过低报警等联锁。这样就算工人误操作PLC也能通过逻辑判断把危险挡住。5. 现场调试遇到的骚坑和救场手段5.1 在线监控、强制变量和程序下载的讲究调试阶段用得最多的是在线监控和强制功能。强制变量确实好用比如工艺条件还没满足时可以直接强制一个液位信号验证泵启动逻辑是否正确。但强制有个大坑强制值会一直驻留在PLC里哪怕你后面下载了新程序强制状态可能还保留着甚至出现“信号已经到10米了程序还是按0米走”的怪事。所以我的习惯是每次强制完第一时间在“监控与强制”表里取消所有强制并在交付前做一个全面检查确保没有遗留强制。网上有人问“西门子删除注册表”的问题我猜测多半是博途安装后残留的调试数据和服务缓存跟这个强制没关系。遇到博途莫名卡顿可以试试关闭监控表再重新打开比折腾注册表靠谱。程序下载也讲究技巧。如果改动很小用“下载到设备仅更改”可以避免整机停机但如果修改了硬件组态、PLC地址或中断OB就必须要停机下载。我现场一般先把离线程序完全保存再对照修改内容判断是否需要停机。下载前养成按CtrlS保存的习惯这个习惯能避免很多“改了一小时代码一下载全丢了”的悲剧。5.2 触摸屏时间不同步的坑KTP1200的HMI在项目里用来显示报表工人会通过面板修改时间。结果第二天看报表发现时间戳和PLC实际时间差了12小时甚至完全不对。问题出在HMI没有配置时间同步区域指针。博途里WinCC Runtime需要建立一个“日期/时间PLC-HMI”的同步区域指针并将HMI的时间基准设为PLC。如果不配置这个HMI只是用自己的本地时钟哪怕操作员在面板上改时间也不会回写PLC。解决方法是在HMI变量管理里添加一个DateTime类型的变量并关联PLC的时钟数据。在区域指针设置里选择“日期/时间”为PLC-HMI同步。重新下载HMI组态后HMI每次启动都会自动从PLC读取时间。这样改完以后报表时间戳再也没乱过。5.3 网络瞬断与测试工具调试期间分站通讯时不时会断个几秒又自动恢复排查起来特别烦。我先用电脑ping分站IP长ping1000次丢包率只有0.1%说明网络物理层基本正常。后来又用Wireshark抓包发现S7通信的重传包很多最终定位到分站侧的水晶头做得不好屏蔽层没有压好导致链路偶尔抖动。这个案例让我养成了一个习惯到现场调试前一定带一个质量好的网线测试仪哪怕只是最便宜的1-9顺序测试仪。很多所谓“软件问题”最后都是网线、水晶头、交换机端口的问题。尤其是污水处理现场潮湿环境让金属触点腐蚀很快通讯设备的连接器最好使用镀金带屏蔽层的型号。6. 项目交付之后回头看这些骚操作的底气6.1 程序结构、注释和备份项目收尾时我把程序重新整理了一遍。1200PLC的程序完全可以按OB、FC、FB、DB分类管理我习惯为每个工艺单元建一个FB比如“提升泵控制FB”“曝气调节FB”“格栅控制FB”。每个FB里对接口变量写清楚注释关键逻辑段用“//”注释HMI变量也按工艺区域命名。这样后续维护的人不需要看完整程序才知道哪里修改。备份更讲究博途项目文件、HMI组态、PLC程序导出、I/O清单、接线图、仪表位号表全部归档到项目网盘并且每个版本都带日期编号。我见过太多项目“人走了程序找不到了”后面维护全是灾难。这个项目竣工验收后我还特意写了一份操作说明附在项目文件夹里方便现场电工快速查阅。6.2 后续扩展方向项目交付之后甲方问能不能把数据传到中控室调度中心统一盯水质指标。1200PLC如果固件版本支持可以直接启用OPC UA服务把实时数据暴露给上位机或组态软件。如果还要上云可以用带MQTT的网关将PLC采集到的DO、pH、流量、泵状态通过4G网络传到云端平台做成手机App趋势图。这也是我当初选1200的另一个原因它天生支持以太网和OPC UA扩展起来不需要换硬件只需要升级固件和组态。对水务公司来说这是实实在在的提质增效点。6.3 一点个人体会做自动化项目这么多年我发现真正的“骚操作”并不是靠奇技淫巧解决眼前问题而是建立在吃透系统原理、熟悉设备特性的基础上对常规流程做的灵活优化。比如批量模拟量处理、轮询状态机、无扰切换看起来像骚操作本质都是对典型问题的通用解法。如果你也在做污水或者类似的1200项目建议边做边把关键参数和故障现象记录下来尤其是那些让你加班到凌晨的坑下次遇到就是你的护身符。