
接手这个城镇污水处理厂自控项目的时候甲方提的需求其实挺直白的水泵格栅能自动转、中控室能远程看到运行状态、操作工在触摸屏上能手动启停、现场出故障了能第一时间知道问题在哪儿。听起来不复杂但等真正梳理完工艺段从粗格栅到提升泵房从生化池到鼓风机房再到加药间和污泥脱水间几十台设备、上百个开关量和模拟量点位摆在那儿的时候选型、组态、编程、调试每一步都有讲究。这套系统最终敲定的核心配置是西门子S7-1214C DC/DC/DC作为主控制器一套ET200SP分布式IO站点放在现场电控柜人机界面用KTP1200 Basic PN触摸屏三者通过PROFINET工业以太网连成一个控制网络。从硬件组态到程序编写用了一周多现场调试又花了两周最终实现了污水处理全过程的手动/自动切换、设备远程监控、报警记录和趋势查询。这篇就把整个项目的选型思路、硬件组态流程、程序模块设计以及调试过程中踩过的一些坑整理成文。内容偏项目实战适合正在做或者准备做中小型水处理项目的电气自控工程师、调试人员和设备维护人员参考。1. 项目整体架构与设备选型思考1.1 一套水厂自控系统为什么是这三个核心硬件先说说工艺背景。这个项目是一个日处理量约5000吨的城镇污水处理站工艺路线是粗格栅提升泵房细格栅旋流沉砂池AAO生化池二沉池深度处理。主工艺设备包括提升泵、粗/细格栅、砂水分离器、潜水搅拌器、内回流泵、曝气鼓风机、加药泵、污泥回流泵、刮泥机、脱水机等另外还有大量电动阀门和液位、流量、溶解氧、pH、浊度等仪表信号。这种规模的厂子I/O点数大致是数字量输入80点左右设备运行/故障/远程状态、阀门限位、手自动旋钮位等数字量输出60点左右接触器、继电器、电磁阀控制模拟量输入20多路4-20mA液位计、流量计、溶解氧仪、pH计等模拟量输出寥寥几路变频器频率给定。算下来一个中型PLC加分布式IO刚好覆盖。选S7-1214C我在CPU型号和能力之间权衡过。1214C本身自带14DI/10DO/2AI工作内存100KB新版本是4.3固件工作内存达到125KB对于这种规模的控制程序绰绰有余。更重要的是它能作为PROFINET IO控制器最多带16个IO设备连接资源也足够支撑触摸屏、编程器和IO站同时在线。相比1500系列1214C的硬件成本大概是其一半左右对于中小型水厂项目性能完全够用没必要上1500。1.2 分布式IO到底解决了什么问题项目之初也纠结过是用本地扩展模块还是分布式IO。本地扩展就是在CPU旁边直接挂SM1231、SM1222这些模块成本低、组态简单但问题也很明显污水处理厂的工艺设备分散在几百米范围内每台设备都要把电缆拉回中控室旁边的PLC柜动力电缆和信号电缆几十根一起走不仅费电缆信号干扰也大后期排查故障更是噩梦。ET200SP分布式IO的好处是把IO模块直接放到现场电控柜现场设备的启停信号、运行状态、仪表信号都在当地接入然后通过一根PROFINET网线和CPU通信。从中央控制室到泵房、到生化池、到鼓风机房每处放一个ET200SP站点电缆长度大幅缩短。这个项目用了三个ET200SP站点一个在提升泵房、一个在生化池配电间、一个在鼓风机房算是典型的星型拓扑。还有一点很关键就是后期的维护便利性。ET200SP的模块支持热插拔某一通道烧了、模块坏了现场电工可以直接更换不用等厂家到场CPU也不至于因为一个IO点故障就停机。这一点在实际运维中非常实用。1.3 触摸屏选KTP1200容量和成本怎么平衡人机界面选用KTP1200 Basic PN12.1英寸宽屏分辨率1280×800支持PROFINET通信用TIA Portal的WinCC Basic组态。选它的理由有两条一是尺寸和分辨率能够支撑水厂工艺总览图、多分画面和趋势曲线的显示二是价格比同尺寸的Comfort系列面板低不少Basic面板对这个小项目来说功能已经够用。不过要注意的是KTP1200属于Basic Panel只能使用WinCC Basic/Comfort组态不支持脚本和复杂动画也不支持数据记录到本地SD卡的功能部分Comfort面板支持。如果项目需要做复杂报表、审计追踪这类高级功能就得考虑升级面板。这个项目只需要实时监控、报警和简单趋势所以Basic就足够了预算也能省下来。2. 博图组态与PROFINET网络搭建2.1 在TIA Portal里把设备“搭”起来的完整步骤整个工程用TIA Portal V15.1完成这里用的组态软件版本也建议大家和自己的固件版本匹配。大致步骤如下第一步新建项目添加设备。在“添加新设备”里选择控制器网上下订单号是6ES7 214-1AG40-0XB0的CPU 1214C DC/DC/DC固件版本选V4.0以上现场实际以CPU标签为准。接着添加触摸屏选KTP1200 Basic PN再添加三个ET200SP站点。ET200SP的接口模块用的是IM155-6 PN ST6ES7 155-6AU00-0BN0后面的IO模块按实际点表配置数字量输入6ES7 131-6BF00-0BA016DI、数字量输出6ES7 132-6BF00-0BA016DQ、模拟量输入6ES7 134-6GF00-0BA14×AI。第二步组态网络。在“设备与网络”视图里把CPU的PROFINET接口、触摸屏的以太网口、三个ET200SP的PROFINET接口拖到同一个子网上然后分别设置IP地址和设备名称。设备名称必须唯一不能有中文和特殊字符比如CPU叫plc-1触摸屏叫hmi-1IO站叫et200-pump、et200-bio、et200-blower。第三步分配IO地址。ET200SP的每个模块在组态完成并编译后会自动分配地址也可以手动指定。我习惯把地址按照工艺段规划而不是默认顺序例如提升泵房的IO站DI地址从I0.0开始到I5.7生化池从I6.0开始鼓风机房从I12.0开始这样在线监控时看到地址就知道是哪个区域的信号排查故障快很多。第四步编译下载。先编译整个项目确认没有错误然后下载到CPU。下载时CPU会要求选择PG/PC接口选择电脑的有线网卡并且保证电脑的IP和PLC在同一网段。2.2 IP规划、设备名称与通讯故障预防PROFINET组态里有个习惯要养成先把整个网络的IP地址规划好再动手配置。这个项目用的是192.168.0.x网段分配如下设备用途IP地址设备名称S7-1214C CPU主控制器192.168.0.10plc-1KTP1200人机界面192.168.0.20hmi-1ET200SP站点1提升泵房192.168.0.31et200-pumpET200SP站点2生化池192.168.0.32et200-bioET200SP站点3鼓风机房192.168.0.33et200-blower设备名称这个东西很多初次接触PROFINET的人容易忽略总以为IP地址对上了就行。实际在PROFINET网络里IO控制器和IO设备之间是通过设备名称来识别和建立应用关系的IP地址只是辅助。也就是说ET200SP在现场通电后必须用一个叫“可访问设备”的功能给每个IO设备分配设备名称名称必须和组态里的保持一致否则CPU找不到从站。在分配名称和IP的时候有个经验最好在现场对每个IO站单独上电分配避免多个设备同时在线时名称写错。另外现场网络如果接入了非管理型交换机注意交换机端口数量和级联深度PROFINET对数据实时性要求较高不建议级联超过3层。若现场有变频器、软起动器等强干扰源网线必须用带屏蔽的工业以太网电缆水晶头要选用带金属屏蔽层的PROFINET连接器不能图便宜用普通水晶头。2.3 现场电气接线容易忽略的细节硬件组态做得再好接线一马虎照样出问题。先看24V电源分配。每个ET200SP站点都配置了一个专用的电源模块6ES7 193-6PA00-0BD0或类似型号给背板总线供电同时还需要一组24V给现场传感器和继电器供电。这两路电源在条件允许时建议分开或者至少用断路器和隔离二极管做保护防止某一路短路拖垮整个站点。数字量输入的接线要注意漏型和源型的区别。西门子S7-1200的DI模块是源型输入也就是说信号公共端接24V传感器的输出接DI通道当传感器输出端导通到M时输入为1。很多现场电工习惯用漏型接法结果通道死活没信号排查半天。模拟量输入必须使用屏蔽电缆屏蔽层在现场仪表侧单端接地PLC柜内屏蔽层接到接地排。强烈建议在仪表和PLC之间加装信号隔离器尤其是液位计、流量计这类安装在室外或水池边、容易受雷击和电位差影响的仪表。这个项目在液位和溶解氧信号上全部加了隔离器实测下来信号非常稳没有出现漂移。数字量输出接的是中间继电器线圈两端并联续流二极管注意极性触点侧再接接触器这样能有效延长PLC输出点的寿命。3. 污水处理核心程序模块的实现3.1 程序块规划OB、FC、FB、DB的职责划分程序结构直接影响后期调试和运维的效率。这个项目的程序块划分如下OB1主循环程序调用各个工艺段的控制函数块。OB100启动初始化设置初始运行参数复位某些保持性变量。OB35定时中断每200ms执行一次模拟量处理和PID运算。OB82、OB86、OB121等诊断OB用于处理IO设备故障、CPU硬件故障和编程错误防止CPU因为这些故障直接进入STOP。功能块方面我把设备控制逻辑做成了几个通用的FBFB_Motor电机控制包含启停、故障复位、运行时间累计、FB_Valve阀门控制包含开阀、关阀、限位反馈判断、FB_Pump泵控制在电机基础上多了轮值和备用泵自动切换。工艺逻辑则用FC组织比如FC_LiftingStation提升泵房控制、FC_Aeration曝气控制、FC_ChemicalDosing加药控制。数据块分三类共享数据块DB_ProcessData存放所有工艺参数和运行状态DB_Alarm存放报警信息和报警使能DB_HMI是给触摸屏读写的专用变量区。这里特别建议把HMI访问的数据统一放到独立DB里不要直接让触摸屏访问I/O地址或者散落在各个FB的背景DB里这样组态触摸屏变量的时候一目了然后续修改也不会影响程序核心逻辑。3.2 泵轮值与备自投逻辑怎么写提升泵是整个水厂的关键设备一般配置3台2用1备或者根据来水量自动增减。泵的控制除了最基本的液位启停还要考虑轮值避免某台泵一直运行导致磨损不均衡。轮值逻辑我用的是运行时间最短优先每台泵的运行时间计时保存在FB的背景DB里当需要启动下一台泵时程序扫描当前处于自动状态且无故障的泵比较它们的累计运行时间启动运行时间最短的那台。停止时则优先停累计运行时间最长的泵。这样三台泵的运行时间能保持基本一致。备用泵自投的逻辑要结合液位和泵故障信号。用SCL写会比较直观IF #AutoMode AND NOT #Pump_A.Fault AND #StartLevel THEN #Pump_A.StartCmd : TRUE; ELSIF #Pump_A.Fault AND #Pump_B.Available THEN #Pump_B.StartCmd : TRUE; END_IF;实际编程时还要处理启动指令的保持和释放不能出现液位到了上限但泵拒绝启动或者频繁启停的情况。建议给每台泵设置最小启停间隔比如5分钟用定时器实现。另外因为水厂池子液位变化比较慢液位信号本身波动又大程序里要加滤波和死区一般做法是连续采集多次液位值取平均或者用模拟量滤波器不然泵会在临界液位附近来回启停电机受不了。3.3 模拟量处理与DO曝气PID控制S7-1200处理模拟量不再用FC105/FC106而是直接用NORM_X和SCALE_X指令。NORM_X把INT类型的原始值0到27648归一化为0.0到1.0的实数SCALE_X再映射到工程量程。以液位计4-20mA对应0到5米为例#RawValue : AI_LiquidLevel; // 原始值 #NormValue : NORM_X(INT : #RawValue, MIN : 0, MAX : 27648); #Level : SCALE_X(REAL : #NormValue, MIN : 0.0, MAX : 5.0);这个项目里曝气控制是个重点AAO生化池好氧区需要维持溶解氧在1.5到2.5mg/L之间低了微生物活性不足高了浪费电能。溶解氧仪测得DO值送给CPUCPU通过PID_Compact函数块控制鼓风机变频器频率进而调整曝气量。PID_Compact组态时设定值是DO目标值反馈是DO当前值输出是0到50Hz的频率给定。参数整定上我采用的方法是先把积分和微分关闭I设为0D设为0只保留比例P慢慢增大观察DO响应当出现持续等幅振荡时记录临界比例度和振荡周期然后按经验公式计算PID参数。这个项目实际运行参数是P2.5I120sD0效果还不错。需要提醒的是溶解氧仪的响应滞后比较大PID周期不要设太短OB35里每500ms执行一次PID就足够了太快的运算反而会让输出频繁波动加剧鼓风机变频器磨损。3.4 手自动切换与设备互锁设计水厂设备的安全运行离不开完善的手自动模式和互锁。我在每台设备控制里都定义了三种模式就地、远程手动、远程自动。就地模式下触摸屏和中控室无法启停设备只能通过现场按钮操作远程手动模式下操作员通过触摸屏启停自动模式下则由PLC根据液位、时间、流程等逻辑自动控制。这个三模式切换要在触摸屏画面里做成下拉或旋钮控件同时在程序里用一个枚举变量标识当前模式。编程时防护好模式切换瞬间的指令跳变比如从自动切到手动时如果设备正在自动运行不能立刻停止要有惯性停车或者保持当前状态直到操作员手动干预。互锁逻辑这块我吃过亏越简单越容易大意。比如提升泵的启动必须满足泵池液位高于低限、出口阀门已开到位、变频器无故障、无急停信号。曝气鼓风机的启动必须满足至少一台鼓风机对应的电动阀已开、风机出口压力正常。刮泥机的运行必须和对应的二沉池排泥阀联动防止刮泥机空转或者泥位过高。这些互锁条件要写在FB的使能端不能只靠触摸屏画面的操作提示因为触摸屏提示拦不住操作员误操作程序底层封锁才是硬防护。4. KTP1200触摸屏画面组态与现场使用4.1 画面结构设计从总览到设备操作KTP1200虽然只是Basic Panel但12寸屏能做的画面已经比较丰富了。这个项目我规划了以下几类画面总览画面显示整个污水处理工艺流程简图和关键数据如进水流量、泵池液位、生化池DO、出水COD等。画面左上角放一个总报警指示灯和当前时间底部留一排导航按钮。工艺段分画面提升泵房、生化池、鼓风机房、加药间、污泥脱水间各一个画面显示该区域设备状态、仪表读数、阀门开度设备的图形用不同颜色区分运行绿色、停止灰色、故障红色。设备操作弹窗点击任意设备图形弹出一个操作面板显示设备当前状态、运行时间、故障信息以及手动模式下的启动/停止按钮。这里建议把模式切换放在同一个弹窗里让操作员在一个屏幕里完成所有操作。报警画面列出当前未确认的报警和历史报警支持报警确认。趋势画面用趋势视图控件显示液位、流量、溶解氧等模拟量的历史曲线。变量连接方面我采取了“一个变量表批量导入”的方式在TIA Portal里先按照DB_HMI数据块的结构创建HMI变量表每个变量直接拖拽关联到PLC DB地址。这样做的好处是变量名和PLC符号名一致组态画面的时候不容易搞混而且后续PLC程序改了DB偏移只要重新编译下载HMI变量跟着自动更新省去手动修改的麻烦。4.2 报警、趋势与权限管理报警这块的设计决定了水厂值班人员的使用体验。我在PLC侧把报警条件整理清楚比如泵池液位高报警、泵故障、溶解氧低报警、加药桶液位低报警、变频器通讯故障等每条报警对应一个DB_Alarm里的BOOL变量。触摸屏侧则新建报警类急停类、故障类、警告类分别赋予不同的优先级和确认模式。急停类报警必须确认且不能被操作员复位故障类报警允许操作员确认后消除声音提示。趋势记录方面Basic面板的KTP1200本身不支持数据记录到SD卡我使用了趋势视图控件的在线缓冲功能数据保存在PLC变量里触摸屏通过周期采集绘制曲线。这个方案能看最近几个小时的趋势足以满足日常巡检和故障分析。如果要保存几个月的历史数据就得考虑升级Comfort面板或者加一套上位机数据库系统这个可以根据项目预算决定。权限功能不要省。这个项目分了三级用户操作员能启停设备、切换手自动模式工程师能修改PID参数、液位设定值等工艺参数管理员有最高的画面组态和系统设置权限。组态时在HMI设置里启用用户管理并在每个需要保护的对象上关联对应的授权级别。现场运行三个月后我觉得这个设计非常必要防止了操作工误改参数导致的水质波动。4.3 下载画面时“缺少面板映像”怎么办KTP1200用网线下载程序时偶尔会碰到一个很坑的报错下载失败请安装缺少的面板映像。这个问题的根源在于博图版本与触摸屏固件版本之间的匹配关系。TIA Portal自带的Basic面板映像版本如果低于触摸屏当前固件或者博图软件的HSP硬件支持包没装全就会出现这个提示。解决办法有两个方向一是把触摸屏的固件刷回跟博图匹配的版本通过“在线和诊断”里的功能更新固件二是安装对应博图版本的HSP硬件支持包为触摸屏添加新版面板映像。我一般会先查一下TIA Portal的版本和HSP列表把和当前面板型号匹配的HSP装好再下载能省去不少麻烦。还有一个下载时经常忽略的点如果触摸屏之前被下载过不同IP的组态新项目下载前最好先在线访问设备确认面板能访问且IP正确。我习惯准备一个固定IP的上位机电脑把网卡IP设为192.168.0.100下载前先ping一下触摸屏IP通了再下载基本不会卡在发现设备那一步。5. 现场调试常见问题与避坑实录5.1 PROFINET通讯闪断先从物理层查起现场调试头两天就遇到一个棘手问题提升泵房的ET200SP站点经常掉线CPU面板的BF灯偶尔闪烁触摸屏上对应区域的设备状态变成灰色过几秒又自己恢复。这种间歇性故障最坑人因为不是一直掉线很难用在线诊断抓到现场。我的排查思路是物理层优先。首先检查网线两端的水晶头发现有一个站点用的是一根现场临时压接的网线屏蔽层没有压接到连接器金属外壳上而且线缆走了变频器出线槽。把网线换成原装PROFINET电缆重新压接带屏蔽的连接器并让信号线远离变频器动力线20厘米以上问题明显缓解。另外在每个站点电源模块的L和M之间并了一个电容吸收附近接触器动作引起的电压跌落通讯就彻底稳定了。这个案例说明PROFINET虽然基于以太网但抗干扰能力和网线质量、布线方式关系极大。现场做桥架穿线时信号电缆和动力电缆必须分开绑扎交叉时垂直交叉且保持距离这是基本底线。别因为省几米网线、贪图方便就用普通网线后期排查通讯故障的成本远高于这些材料费。5.2 模拟量信号漂移的处理生化池的溶解氧仪投运后发现一个规律白天DO显示比较稳定一到傍晚鼓风机变频器低频运行时DO数值开始上下跳动波动幅度能达到0.5mg/L。乍一看以为是仪表问题拿万用表实测信号线电流是稳定的那问题大概率出在干扰上。排查后确认是鼓风机变频器运行时产生的谐波干扰通过电源线耦合到了溶解氧仪的供电回路。处理办法给溶解氧仪换装独立的24V开关电源供电信号线上加装信号隔离器并把仪表信号电缆的屏蔽层在PLC柜内单独接地。改造完连续观察一周DO信号纹丝不动。这里建议现场安装模拟量仪表时供电不要和任何变频器共用断路器最好单独从UPS或者稳压电源取电成本增加不多但省心非常多。5.3 用Modbus从站通信时小心数据被覆盖项目里有一台第三方在线COD分析仪走Modbus RTU协议需要PLC作为主站轮询读取测量值。我在S7-1200上用了两个Modbus_Comm_Load和两个Modbus_Master指令一个处理COD仪modbus读取另一个处理变频器的485通信。结果发现一个问题当两个主站指令同时轮询时CPU的通信缓冲区会冲突导致某些返回值错乱甚至偶发覆盖了其他运行时间统计DB的内容。后来查手册才明白S7-1200同一个通信模块上的Modbus主站请求必须串行处理不能多个Mobus_Master同时激活。解决办法是把所有Modbus通信放到一个状态机里顺序执行每轮询完一个从站等指令Done或Error标志位出现后再启动下一个从站的通讯请求并设置好轮询周期。具体实现是在OB1里建立一个轮询状态字用CASE语句切换当前是读COD仪还是写变频器频率每个分支里再嵌套Modbus_Master调用。这个坑很典型很多人做多个Modbus从站通信时都踩过。建议后面做类似需求时把所有Modbus主站指令集中放在一个FC里管理做成队列式轮询避免多个通信请求并发导致数据互相覆盖。5.4 程序下载时CPU意外停机生产怎么办调试后期有一次遇到比较尴尬的情况我在工程师站修改程序后直接下载CPU切换到STOP现场泵全停了污水继续进水差点溢池。还好当时有操作员盯着紧急把手动模式全部打到就地用现场按钮才稳住。从那以后我给自己定了两条规矩一是大型程序修改尽量用“下载到存储卡”的方式或者在线修改功能块避免整机停机二是下载前一定通知操作员提前把系统切到就地手动模式并派人守着关键设备。特别是水厂这类一旦停机就可能溢流的场合调试预案比技术本身更重要。另外OB121编程错误OB没组态或者组态不完整时一个小小的地址访问越界就能让CPU停机所以除了下载测试还要把所有诊断OB提前组态好避免现场故障扩大化。现场运行三个月后的一些体会这套系统投运到现在运行稳定给我最大的感受是选型不要盲目追高S7-1214C加ET200SP加KTP1200这个组合对于中小型污水处理项目来说是个很均衡的搭配。硬件成本可控编程组态难度适中维护门槛也不高普通的厂内电工经过简单培训就能处理常见故障。如果后续项目还有提升空间我可能会在两点上做扩展一是在线监控平台把PLC数据通过云网关上传让厂长在手机上就能看设备运行报表和报警推送二是能耗分析功能利用PLC统计每台设备的耗电量结合进出水流量核算单位处理能耗。这两块在现有硬件基础上都做得起来属于“花小钱、办大事”的延伸方向。还有就是无论程序写得多么严谨现场调试经验始终是不可替代的。和电工商量一个走线方案跟运行工聊两句操作习惯这些非技术的细节往往决定了项目交付后好不好用、稳不稳定。做水处理自控的同行们有机会多泡在现场很多东西只有亲眼看到设备动起来才能理解程序里那些判断条件为什么要那么写。