接手滤液生化段这个项目时甲方拿技术协议就把调子定死了主控PLC用西门子1500系列编程环境博途V16上位机必须是WinCC 7.5。说实话这个组合在水处理行业里已经快成标配了1500PLC的扫描周期和以太网集成能力比老300系列强太多博途V16一个人能把PLC、网络、设备视图全管起来WinCC 7.5作为老牌SCADA稳定性没得挑污水厂运维班子也熟。整篇复盘我会把项目从工艺理解、程序架构到WinCC画面再到现场调试的完整链路捋一遍重点讲那些只有到场站才能踩到的坑。这套思路适合做水处理自控的工程师直接抄作业刚学博途的兄弟也能拿它当一套完整案例来对照。水处理滤液生化段最大的特点就是水质波动大、工艺联锁多、设备分布散控制逻辑写不好要么冒池要么膜堵所以我先把工艺和控制需求彻底拆开再决定程序怎么搭。1. 滤液生化段项目的控制需求与选型基准1.1 生化段在整套水处理工艺中的位置滤液生化段通常出现在垃圾渗滤液、污泥压滤液或者高浓度有机废水处理项目里位置一般卡在预处理之后、深度处理之前。它的任务是用微生物把COD和氨氮降下来常见工艺路线是“厌氧反应器→缺氧池→好氧池→MBR膜池”有的项目还会在好氧和缺氧之间加内回流把硝化液打回去实现反硝化除氮。以我做的这个项目为例进水COD在8000到15000mg/L之间波动氨氮经常冲破1000mg/LSS也高典型的高浓度垃圾渗滤液。生化段前端已经过了混凝沉淀和厌氧罐到达生化段的水质相对稳定但依然会随季节和垃圾成分出现明显波动这正是自控系统要应对的核心难点。生化段的控制对象说白了就是泵、阀、风机、加药和仪表这五类。泵包括进水泵、内回流泵、外回流泵、产水泵、反洗泵、排泥泵阀是进水气动阀、放空电动阀、膜池液位调节阀风机负责给好氧池和膜池曝气通常是变频控制加药系统有碳源反硝化用、消泡剂、次氯酸钠膜清洗用三路。仪表数量也不少关键的有超声波液位计、静压液位计、电磁流量计、pH计、DO溶解氧仪、MLSS污泥浓度计、温度计和跨膜压差变送器。整套系统IO点统计下来数字量输入大约80点数字量输出约40点模拟量输入32点模拟量输出8点基本上属于中型水处理站规模用一台1500系列PLC做集中控制刚刚好。1.2 为什么这套组合成了水处理的“标准答案”先说S7-1500。相比老S7-3001500的位处理速度大幅提升CPU自带Profinet接口走工业以太网是原生能力不用额外加CP卡。对于生化段这种需要快速响应联锁、频繁跑PID、还要承担大量数据交换的场景1500的余量非常宽裕。再就是博途V16。很多从STEP7 V5.x过来的人第一次用博途会觉得界面变化大但习惯之后就会发现它的便利性——PLC程序、HMI画面、网络组态全部在一个项目里管理交叉引用和一致性检查做得比老软件好太多多人开发时还能签出签入。V16这个版本对S7-1500和各种远程IO的兼容性已经相当成熟跑Win10系统稳定我这些年做的项目基本都锁在V16上。WinCC 7.5则是典型的SCADA天花板。它和TIA博途是两条线一个是经典WinCC独立工程一个是博途内集成的WinCC Professional两者技术底座不同但变量导出互通。项目里用经典WinCC 7.5是因为甲方运维每天都要看趋势、导报表、管账号WinCC的报警记录、变量记录和用户管理在工业现场验证过太多年。这个组合最大的好处是分工明确、各干各的强项坏处是工程文件要分两个项目维护所以后续我会专门讲两个工程之间的数据怎么衔接最省事。1.3 控制层级三层结构是水处理项目的安全底线生化段控制必须做成三层这在设计阶段就要写进程序框架里不能边写边想。就地手动层是最底层现场操作柱直接控制电机启停PLC只监视状态不参与逻辑这层用于检修和单机调试。远程软手层是中间层操作员在WinCC上点“软手”按钮然后单独启停设备PLC不做工艺联锁只做基本保护这层用于调试阶段或者自动逻辑出问题时人工接管。远程自动层是最高层所有设备按工艺逻辑自动运行液位、流量、时间、PID全部参与计算。三层之间必须有优先级仲裁而且切换要安全。从自动切到软手不难但从软手切回自动时现场状态必须满足安全条件才能允许否则容易出现“一切自动泵瞬间跳起”的惊险场面。这个经验是实打实换来的后面调试章节我会专门讲一次事故预处理的经过。2. 博途V16程序架构先搭骨架再填逻辑2.1 硬件组态与站点规划硬件上我选的是CPU 1511-1 PN配置在中央机柜机架上一块数字量输入模块、一块数字量输出模块、一块AI 8×U/I模拟量输入模块和一块AO模块。中央机柜放在生化段旁边的电控间内膜池和加药间的设备通过ET200SP远程站接入两个远程站用Profinet网线连到PLC的PN口。为什么这么布因为生化段现场设备分布太散了进水泵在集水井边上风机在鼓风机房膜池离主柜少说有几十米如果全部硬接线回到中央柜电缆成本和施工工期都压不住。ET200SP一站解决每个站带16路DI、8路DO、8路AIProfinet线缆走弱电桥架抗干扰比几百根动力线并排走要好。博途V16里做硬件组态时要特别注意设备名称和IP地址分配。PLC的IP是192.168.0.10两个ET200SP分别是192.168.0.21和192.168.0.22WinCC上位机是192.168.0.50。IP规划一定要在项目初期就定好我见过太多项目后期因为IP冲突实测半天查不出问题。模块版本也建议选新一点的固件V16对固件版本有最低要求组态时选错了下载会报“目标设备与组态不一致”。2.2 程序块怎么分FC和DB的职责边界程序结构我采用“一个OB1主循环若干功能块”的经典模式。OB1里只放FC调用不写业务逻辑。OB100做初始化用于设置PID参数初值、恢复上次运行状态、清除故障累计。OB35循环中断用于跑PID_Compact采样周期设500ms。功能块按设备类型划分而不是按工艺段划分。我这里建了FC100模拟量处理、FC200泵控制、FC300阀控制、FC400曝气PID、FC500膜池时序控制、FC600加药控制另外还有FC900报警汇总。这样划分的优点是复用性强泵再多也只是一份逻辑跑多次调试时又能单独激活某个块单独查问题。数据块建议分三层全局共享DB存设备状态和联锁值工艺参数DB存液位上下限、流量目标值、PID参数这些需要现场调的东西统计DB存运行时长、累计流量、启停次数。三层分开好处是甲方工艺员改参数时只用动一个DB不会被其他逻辑干扰也不会误改程序。这里有个博途里的细节S7-1500的DB块默认是“优化的块访问”属性变量没有固定偏移地址程序内部用符号名访问没问题但WinCC 7.5如果用绝对寻址方式读取DB就必须把这块属性取消勾选再编译一次。我在这个项目里一开始没注意结果WinCC连上后读到不变量排查了半小时才发现是这里的问题。2.3 模拟量处理通用化换算函数是省事的关键模拟量处理是水处理自控里最琐碎也最不能出错的部分。项目里所有液位、压力、流量、温度、pH、DO、MLSS信号都要在PLC里归一化成工程量然后供其他逻辑使用。我的做法是在FC100里写一个通用换算逻辑入口参数是原始整型值Raw、量程下限LO、量程上限HI计算公式是EngVal Raw / 27648 × (HI - LO) LO。这个式子的前提是模拟量模块在博途里组态为4~20mA对应0~27648这是西门子模块的默认映射。但不同信号有个性。pH计输出4~20mA对应0~14pH直接用公式就行液位计选静压式量程0到5米公式算完就是米数电磁流量计的量程按管道口径选算出来是瞬时流量m³/h。这里要提醒新手超声波液位计如果安装在池顶4mA对应的往往是高液位20mA对应低液位也就是反向量程换算时要倒过来否则液位显示会完全反相。这个反向问题调试时极容易中招。温度信号我不用模拟量模块直接用RTD热电阻模块读PT100模块内部自动换算出温度值程序里少一道计算省心很多。2.4 泵控逻辑主备轮换、低液位联锁和故障切换生化段泵类设备多泵控逻辑是整个程序里被调用最频繁的。拿进水泵举例两台泵一用一备自动模式下每隔24小时切换一次主备角色运行时间短的优先启动这是为了均衡两台泵的磨损也避免备泵长期不转导致卡死。低液位联锁必须做扎实。集水井液位低于启泵下限时两台泵都不能启动运行中液位掉到停车下限正在运行的泵无条件停止。高液位联锁则是反向逻辑液位超过高限时启动备用泵超过高高限时报警并加强制模式提醒。液位联锁的上下限在工艺参数DB里可调调试时用实际工况反复验证尤其要盯着停泵下限给足安全余量别让泵抽空。泵的联锁还有一个容易被忽略的环节泵启动前要确认出口阀门已开启运行中出口阀关闭必须联锁停泵否则泵在憋压状态运行几小时就能把机械密封打坏。这套联锁用阀门的开到位反馈和泵的运行状态做互锁逻辑上就是两个常开触点串联的事但很多小项目会漏我这里是强制写进FC200里的。2.5 曝气DO的PID闭环控制好氧池曝气是生化段的能耗大头也是控制难度最高的回路。控制对象是一台变频风机执行器是风机的频率给定4~20mA信号反馈是好氧池末端的DO溶解氧仪被控目标是DO稳定在2.0mg/L左右。S7-1500里实现PID最顺手的方式是用PID_Compact指令块。组态时设定值为DO设定值输入端接工程量为mg/L的DO实测值输出端接到AO模块的输出通道输出范围设0到100对应风机频率0到50Hz。PID_Compact本身带自动整定功能但这套在现场跑经常整定不出来因为生化池是大惯性、大滞后的对象扰动又多自动整定的结果往往过于激进。手动整定的经验值供参考Kp设2.0左右Ti积分时间放到120sTd微分时间可以设0或者很小因为DO信号本身噪声大微分反而容易放大波动。采样周期选1s在OB35里调用。PID_Compact在PID参数切换时要处理好手动值跟踪否则从手动切自动瞬间输出会跳变风机频率会猛蹿一下这个在博途里勾选“手动值跟踪”选项就能解决。2.6 MBR膜池的产水与在线反洗时序膜池是生化段的最后一关核心设备是膜组件、产水泵和反洗泵。产水泵抽吸方式运行抽吸8分钟停2分钟这个周期是膜厂家给的典型参数停抽期间让膜面松弛延缓污染。反洗泵在停抽期间反向运行从产水池抽水经膜壳反向冲洗膜表面反洗流量是产水流量的1.2倍持续45秒必要时可以联动次氯酸钠加药泵做化学强化反洗。这段时序在PLC里用顺控逻辑实现核心是一个时间状态基。状态0是待机状态1是产水运行状态2是停泵等待状态3是反洗执行状态4是反洗结束至下一次产水。每个状态都有进入条件和退出条件超时未满足条件则报警并停车。时序控制里最关键的是状态切换时的执行顺序比如从产水切换到反洗必须先停产水泵、关闭产水阀再等2秒然后才允许开启反洗泵、打开反洗阀。阀门动作有时间常数如果切换太快瞬时流量冲击会影响膜寿命这是工艺工程师特意叮嘱过的我把这2秒的延时做成可调参数放在了膜池参数DB里。膜池还要监控跨膜压差TMP。TMP一旦超过0.05MPa说明膜污染严重必须加强反洗或者化学清洗这个上限值在WinCC报警里配置成高报和高高报两级现场运维根据报警决定是否离线清洗。3. WinCC 7.5组态画面数据联通与操作体验两手抓3.1 打通S7-1500与WinCC的通讯链路WinCC 7.5要读PLC的数据最常规的办法是用WinCC里的“SIMATIC S7-1500”通道。打开WinCC项目后在变量管理里右键添加新驱动选SIMATIC S7-1500然后建连接连接参数里填PLC的IP地址、机架号0、槽号1。通信访问点在控制面板的PG/PC接口里选一般把S7ONLINE访问点指向电脑的物理网卡协议选TCP/IP。这里有一个排查顺序要记住连不上PLC时按这个顺序查先ping通PLC的IPping不同断网链路再检查PG/PC接口访问点很多人栽在这里最后看Windows防火墙有没有挡掉TCP端口。WinCC运行后如果通信驱动显示黄色或者灰色就是连接异常用WinCC自带的通道诊断工具Channel Diagnosis可以查到具体错误码。与TIA博途不同WinCC和PLC之间永远是两个独立工程PLC改了变量WinCC这边不会自动同步。工程联调时我习惯先在博途里把符号表导出成Excel再在WinCC变量管理里用“导入变量”功能批量映射省去一个一个手敲的功夫几百个点位能省半天的活。3.2 画面分层的设计思路WinCC画面我按照“总览→分区→设备面板”三层来做不是把现场所有东西都堆在一个画面上。封面总览是一张全厂工艺流程图显示进水、生化段、膜池、产水池的主要参数和泵阀状态中控值班员扫一眼就能知道当前整体运行是否正常。第二层是生化段分区画面分进水泵区、曝气池区、膜池区、加药区四张。每张画面展示该区域的设备布局、实时参数、阀门状态和各泵的启停按钮。第三层是设备面板点击画面上的任意一台泵或者阀弹出一个小窗口里面有这台设备的软手自动切换、启动停止按钮、运行电流、故障信息、运行时长。WinCC里的画面窗口加集成了这些面板功能比每个设备都单独画一个画面要清爽得多。画面上的动画效果要注意性能水处理画面动效太多会卡。管道流动动画用“可见性”替代“颜色变化”会好一些液位填充用WinCC的填充对象配合量程百分比控制液位容器在画布上不要太多否则运行时CPU占用率会明显升高。3.3 报警、趋势、权限三件套WinCC的报警记录功能是水处理运维最依赖的模块。数值报警组态液位高高报、高报、低报、低低报模拟量报警的限值可以直接关联PLC里的DB变量我在博途里把报警限值统一放在工艺参数DB里这样在PLC侧改了参数WinCC报警自动跟着变不用两边同时改。DO报警直接读PLC里的报警字。比如泵故障、阀反馈丢失、风机过载这些都是数字量报警在WinCC里组态二进制报警触发变量用PLC输出的BOOL报警位。报警确认机制是必须的否则新报警会被旧报警淹没操作员必须确认并填写处理意见WinCC的报警记录控件能把这些操作历史都存下来。趋势曲线用WinCC的在线趋势控件。重点趋势有四个进水COD、好氧池DO、膜池跨膜压差、产水瞬时流量。变量记录里要把采集周期设成1秒存档趋势查询时支持按时间范围缩放这些配置存在变量记录里项目跑起来后数据会自动归档运维想回溯事故曲线就直接在趋势控件上拉时间轴。用户管理方面WinCC的用户管理员里建操作员、工程师、管理员三个角色。操作员只能启停设备和确认报警工程师能调整PID参数和画面切换管理员能管理用户和配方。每个操作按钮都关联权限级别比如泵启动按钮至少要操作员权限加药量设定要工程师权限这样既能防止误操作也能满足环保验收对操作留痕的要求。3.4 水处理画面里的高价值细节靠近现场的运维人员操作习惯和设计工程师想的不一样WinCC画面必须按他们的习惯来设计。按钮布局要稳定。所有泵的启动按钮固定在左侧停止按钮在右侧状态指示灯在中间不要每张画面都不一样位置操作量大了肌肉记忆很危险容易把停止按成启动。画面里所有设备名称要和现场位号一致甲方挂牌写什么名称画面上就用什么名称哪怕你觉得它写得不对也必须用现场的名字否则电话沟通时两边说的对不上操作员急起来能骂人。数据刷新颜色也要统一规范。正常运行显示绿色故障红色闪烁手动模式黄色自动模式蓝色。这套配色标准要写进项目说明后续加画面的人才能保持一致。报警弹出窗口不要做到每个画面里做成全局弹窗哪个报警来了都会弹出操作员点击“确认”后才能消音这个功能在WinCC里用全局脚本加报警控件实现实际使用体验比默认报警条好很多。4. 现场调试实录踩过的坑和排查套路4.1 模拟量跳变的物理层折腾这个项目调试初期最头疼的问题是DO信号和MLSS信号的剧烈跳变。数值在正常范围附近来回窜PID根本没法稳定一开始我怀疑是仪表本身问题让工艺那边重新做了校准结果还是跳。后来到现场仔细查线发现仪表信号电缆和变频器动力电缆在同一根桥架里走到PLC柜而且距离超过30米变频器的电磁干扰被耦合进了信号线。解决办法分两步。第一步把所有模拟量信号线换成屏蔽双绞线屏蔽层在PLC柜侧单端接地仪表侧不接地这是4~20mA信号抗干扰的标准接法。第二步是让施工队把信号线桥架和动力电缆桥架分开敷设中间留出至少30公分间距确实没条件分开的区段加装金属隔板。这套整改做完DO信号才稳定下来。这个坑的启示是水处理项目现场布线抗干扰措施要在设计阶段就写进施工要求不要等到调试再补救。还有一点很土但很有效模拟量信号进PLC前全部串信号隔离器一个通道一个成本不高但能把大量接地环路问题直接屏蔽在隔离器之外。4.2 博途V16下载和上传的常见拦路虎博途V16在项目调试中最常遇到的两种报错是“在线设备与项目不匹配”和“目标设备不可访问”。第一种多半是硬件固件版本和组态不一致去博途的在线设备视图里看实际固件把组态版本改成一致再下载。第二种多数是网络问题先ping PLC的IP能通就查PG/PC接口设置不能通就查网线。这里有个强制下载的细节当程序有改动离线不一致时博途会提示差异并拒绝下载新手容易直接点“强制下载”。强制下载会停掉PLC运行在线设备里的状态全部重置如果现场正在运行强制下载等于直接切机必须在甲方确认停机后才能做。我在这个项目上吃过亏一次强制下载把现场产水泵停了三分钟还好是调试期。下载完成后要养成查交叉引用的习惯看有没有变量被多处写操作这种问题很隐蔽运行一段时间后才出现数据异常。博途的“交叉引用”视图能列出每个变量的读写位置比对着程序一行行找快得多。4.3 WinCC 7.5连不上PLC的排查顺序WinCC运行画面上所有数据都是黄色小问号这种状况调试期间几乎天天遇到。我的排查顺序已经形成反射了。第一步看PLC侧确认PLC运行模式在RUN程序里有没有异常停机。第二步看网络在电脑命令行ping PLC的IPping不通就是物理链路或网段问题大部分情况是电脑和PLC不在同一个网段桌面右下角的网络设置里把IP改到192.168.0.x就行。第三步看WinCC的通道诊断工具打开后如果看到连接状态是“未建立”就看错误码常见的是错误码0x2表示协议不匹配需要检查连接参数里的机架号和槽号。第四步看Windows防火墙WinCC运行时需要开放TCP端口最简单的做法是调试阶段临时关闭防火墙找到问题后再配置白名单。有一次折腾了一个多小时最后发现是PLC的Profinet口被另一台设备占用了IPWinCC一直在连那台设备PLC反而连不上。这种低级错误最容易让人忽略排查IP冲突时拔掉PLC网线看ping还通不通这个操作能快速定位有没有IP被占用。4.4 PID参数整定与季节调参经验曝气DO的PID整定自动整定跑不出来的情况下我自己凑了一套参数。先把Ti设到最大Td设0只留Kp从0.5开始往上加每次加0.5观察DO趋势曲线的振荡情况。当曲线出现等幅振荡时记下此时的Kp实际Kp取这个值的0.6倍这是典型的临界比例度法。然后加上积分时间。生化池是大惯性对象Ti不能太小我最终定在120s积分太强会引起低频振荡积分太弱DO会出现静差。最后Td直接设0因为DO信号毛刺多微分会放大高频噪声没有必要。这里要给个特别提醒水处理PID参数不是一劳永逸的。冬季水温低微生物活性差DO的消耗速率变慢同样曝气量下DO容易偏高PID会自动调低风机频率但冬季DO目标值和夏季也应该不同具体数值要听工艺师的意见PLC里做季节切换参数就行。另外DO仪要定期校准仪表漂移会让PID输出失真这不是参数能救回来的问题。4.5 一个容易被忽略的DB块优化访问坑这个坑我前面提过但因为太典型必须单独说一下。S7-1500的DB块默认开了“优化的块访问”这种DB在CPU里分配符号地址没有固定的物理偏移。博途程序里用符号名访问没有任何问题但WinCC 7.5如果用绝对地址访问方式去读DB里的某个变量就找不到偏移地址变量永远显示不出值。解决办法是在PLC项目里选中DB块右键属性取消“优化的块访问”勾选然后重新编译下载。注意这个属性必须在创建DB块之后、编译之前决定如果DB已经被程序大量引用改属性后要检查所有符号引用是否还能正常解析。我通常的做法是所有需要给WinCC读写的DB块一创建就关闭优化访问省得后面反复折腾。还有一点WinCC读取PLC的位存储器M区有时候会出现刷新慢的情况DB区反而是最快的。项目里像报警汇总字、设备状态字这种高频刷新的数据我都是放在DB里而不是M区实测刷新效果更好这也是老WinCC工程师的经验。4.6 调试期最惊险的一次自动切软手差点冒池项目联调到最后阶段甲方要求演示自动模式全流程跑水。刚开始一切顺利进水泵启动、厌氧段液位上涨、膜池开始产水。但演示中途工艺员反映好氧池DO偏高让我切到软手手动调一下风机。我就在WinCC上把曝气风机从自动切到软手这时PLC里的PID输出被断开风机频率固定在了PID上一次的输出值上。问题出在我切了风机软手却没有留意进水泵还在自动运行。好氧池液位继续上涨而曝气量维持不变DO慢慢往下掉。等我发现画面报警时液位已经接近高高限赶紧手动把进水泵停了才避免了一次冒池事故。这个经历给我的教训非常具体从自动切软手之前必须把所有相关设备一起切出来单独切一台设备会打破整体平衡。另外联锁逻辑里应该加上“自动模式下软手切换超过设定时间后自动恢复报警提示”的功能让值班员知道哪些设备一直停在手动状态。后来我在程序里加了一个定时扫描块超过30分钟仍处于软手的设备就报警提醒这成了我在后续每个水处理项目里的保留配置。写到这这个项目从工艺理解、博途程序、WinCC画面到现场调试的完整复盘就差不多了。我最大的体会是水处理自控最考验人的不是指令语法而是对工艺边界的理解。程序写得再花哨液位上限制设错了、阀门联锁漏了一条到了现场该冒池照样冒池。每次项目调完我都会把现场踩过的坑整理成一份问题清单下次新项目开工前先看一遍能少走太多弯路。你也一样多记多写比多背指令强得多。