上个月帮一个老客户维护一套泳池水处理控制柜,打开柜门一看,还是S7-200加组态王这套老组合。很多年轻工程师可能觉得S7-200都停产多少年了,怎么还在用?但现实就是,存量设备量非常大,而且这套系统的工艺逻辑、IO分配思路、梯形图组织方式,跟现在主流的S7-200 SMART、S7-1200完全相通。尤其是游泳池水处理这种典型的流程控制项目,涵盖循环过滤、消毒投药、恒温加热、自动补水、砂缸反冲洗这些环节,做一遍下来,等于把流体处理项目的绝大部分控制逻辑都过了一遍。
这篇文章我打算把这个项目从头到尾拆开讲:工艺链路怎么梳理、硬件怎么选型、IO怎么分配、图纸怎么组织、梯形图每一段的设计思路、组态王画面怎么做,最后再聊聊现场调试踩过的坑。项目不算复杂,但胜在完整,适合做PLC毕业设计、非标自动化入门,或者维护现有泳池控制系统的同行参考。看完之后,换成景观水循环、中水回用、养殖水处理这些同类型项目,也能直接迁移这套思路。
1. 泳池水处理的工艺链路:先懂工艺再写程序,顺序反了必返工
1.1 水处理的三个核心环节
做控制系统最忌讳一上来就写梯形图。PLC程序本质上是工艺逻辑的映射,工艺链路搞不清楚,程序写出来也是空中楼阁。游泳池水处理看着简单,其实拆开是三个互相耦合的环节。
第一个环节是循环过滤。泳池水通过池底的回水口进入循环管道,先经过毛发收集器,这一步很关键,泳池里难免有头发、树叶、杂物,如果不拦截直接进泵,叶轮很快就废了。毛发收集器后面通常带水流指示器,可以判断管路有没有水。然后循环泵加压,把水送进砂缸——砂缸里面装的是石英砂滤料,水从上往下穿过滤层,悬浮物和胶体颗粒被截留下来,清水从底部出来,再经给水口送回池内。砂缸过滤一段时间后,滤料表面会形成一层污垢层,压差变大,流量变小,这时候就需要反冲洗,用反向水流把滤料里的脏东西冲出去。
第二个环节是消毒投药。单纯靠砂缸过滤只能去除悬浮物,溶解在水里的细菌、病毒、尿素这些必须靠药剂处理。常规配置是三台计量泵:絮凝剂泵把水中的微小颗粒聚集成大颗粒,这样砂缸才滤得掉;pH调节泵把水的酸碱度控制在7.2到7.8之间,这个范围既适合人体皮肤,也能保证氯的消毒效果;消毒泵投加次氯酸钠或氯片,维持余氯浓度在0.3到1.0mg/L。投药位置一般在砂缸出水之后,让药液和过滤后的清水充分混合再进池。
第三个环节是辅助系统。恒温泳池会有板式换热器或者电加热器,通过水温传感器闭环控制,保持26到28度;另外泳池水位因为蒸发、游泳时溢出等原因会下降,需要液位开关配合补水电磁阀自动补水。
1.2 从工艺环节映射出控制点和采集点
把工艺链路走一遍之后,控制对象就自动浮出来了。需要PLC输出的,主要是循环泵启停、投药泵启停、反冲洗电动阀的开闭、补水电磁阀、加热器输出这五类。需要PLC采集的,包括泵的运行反馈、热继电器过载信号、阀门的开到位/关到位限位、高低液位开关、反冲洗压差开关,再加上模拟量部分的水温、pH值、余氯浓度、泵出口压力。
这里有一个很多新手容易忽略的点:泳池水处理的安全逻辑不是靠PLC程序,而是靠硬联锁打底。循环泵的热继电器常闭触点要串在接触器线圈回路里,低水位开关的常闭触点也要串进去,这样即使PLC程序跑飞了,泵也不会在缺水或者过载状态下硬转。PLC程序里的联锁属于第二道防线,负责更精细的控制逻辑,比如反冲洗过程中禁止投药、循环泵停机必须停投药泵这类。硬接线解决危险,程序解决逻辑,两条线不能混。
1.3 反冲洗流程:整个程序里逻辑最复杂的一段
反冲洗是泳池水处理控制里最有代表性的流程。工况是这样:砂缸正常过滤时,进水阀开、反冲洗阀关,水流从上往下穿过滤料层;反冲洗时刚好反过来,进水阀关、反冲洗阀开,水流从砂缸底部往上冲,把截留的污物从排污口带走。实际操作中,反冲洗触发条件有三个:一是压差开关动作,说明滤料层堵了;二是定时反冲洗,比如运行累计多少小时强制反洗一次;三是操作人员在组态王上手动触发。
完整反冲洗流程是这样走的:先停循环泵,停投药泵,确认泵停稳;然后电动阀切换到反冲洗位,等开到位限位信号;限位到了之后再启动循环泵,泵把水反向打进砂缸,反洗定时开始,一般8到12分钟,具体看水质;定时到了停泵,阀门切回过滤位,等关到位限位;最后重新启动循环泵,恢复投药,整套流程结束。这个流程在PLC里就是典型的步进控制,每一步都有动作条件和完成条件,不管哪一步卡住了都不能往下走。
2. 硬件选型和IO分配:点表排得清楚,后期少改十版程序
2.1 为什么这个项目还用S7-200
这个项目用S7-200,一是因为它是存量设备,控制柜、端子接线、现场仪表都是现成的;二是因为这套硬件配置对这个工艺场景完全够用。S7-200虽然停产了,但它的编程软件STEP 7 Micro/WIN至今仍然是学习PLC逻辑控制最好入手的工具之一,梯形图的组织方式、定时器计数器用法、中断和子程序结构,跟后来的SMART系列一脉相承。
如果是全新项目,我的建议是直接用S7-200 SMART,CPU选SR20或者SR40,价格不贵,编程软件Micro/WIN SMART免费,以太网口调试也方便。但如果你手头已经有S7-200的库存,或者学校实验室还在用S7-200,那按这篇文章的思路做完全没问题,程序迁移到SMART只需要改一下地址格式和少数指令差异。
2.2 IO点表完整分配
这个项目的IO点规模大概在二十几个数字量、四五个模拟量。CPU可以选S7-200 CPU 224 XP CN,自带14个数字量输入、10个数字量输出、2路模拟量输入、1路模拟量输出。如果模拟量点数超过2路,就加一块EM231四通道模拟量输入模块。
数字量输入分配表如下:
| 地址 | 信号名称 | 说明 |
|---|---|---|
| I0.0 | 急停按钮 | 常闭触点,串入总联锁 |
| I0.1 | 远程/本地切换 | 本地柜内按钮,远程模式才允许组态王控制 |
| I0.2 | 循环泵手动启动 | 柜门按钮,检修/调试用 |
| I0.3 | 循环泵运行反馈 | 接触器辅助触点 |
| I0.4 | 循环泵热继电器 | 过载常闭信号 |
| I0.5 | 反冲洗压差开关 | 砂缸进出口压差超限 |
| I0.6 | 高水位开关 | 补水到位信号 |
| I0.7 | 低水位开关 | 缺水联锁信号 |
| I1.0 | 反冲洗阀开到位 | 电动执行器开限位 |
| I1.1 | 反冲洗阀关到位 | 电动执行器关限位 |
| I1.2 | 泵房漏水报警 | 地面积水探头 |
数字量输出分配表:
| 地址 | 信号名称 | 说明 |
|---|---|---|
| Q0.0 | 循环泵接触器 | 驱动主泵 |
| Q0.1 | 絮凝剂投药泵 | 计量泵启停 |
| Q0.2 | pH调节投药泵 | 计量泵启停 |
| Q0.3 | 消毒投药泵 | 计量泵启停 |
| Q0.4 | 反冲洗阀开 | 电动执行器开命令 |
| Q0.5 | 反冲洗阀关 | 电动执行器关命令 |
| Q0.6 | 补水电磁阀 | 液位补水 |
| Q0.7 | 加热器输出 | 接触器/固态继电器 |
| Q1.0 | 故障指示灯 | 柜面指示灯 |
| Q1.1 | 运行指示灯 | 柜面指示灯 |
模拟量分配表:
| 地址 | 信号名称 | 变送器信号 | 量程 |
|---|---|---|---|
| AIW0 | 水温 | PT100变送器 4-20mA | 0-50℃ |
| AIW2 | pH值 | pH电极变送器 4-20mA | 0-14 |
| AIW4 | 余氯 | 余氯电极变送器 4-20mA | 0-5mg/L |
| AIW6 | 循环泵出口压力 | 压力变送器 4-20mA | 0-1.0MPa |
2.3 模拟量量程换算公式
S7-200的模拟量模块有一个很重要的特性必须牢记:整定值0到32000对应0到20mA,而变送器输出的是4到20mA,所以实际有效整定范围是6400到32000。工程值与PLC内部整定值的换算关系是:
工程值 = (整定值 - 6400) * (量程上限 - 量程下限) / (32000 - 6400) + 量程下限举个实际例子,水温变送器量程0到50℃,如果AIW0读到的整定值是16000,那实际水温就是:
温度 = (16000 - 6400) * 50 / 25600 = 18.75℃这个换算我一般不在PLC里用浮点运算指令做,而是在组态王的数据词典里直接设置原始值和工程值的线性转换,省PLC的扫描周期资源,画面上的数值也更直观。但如果你的上位机不用组态王,直接在PLC里算也可以,注意用浮点指令,别用整数指令,否则算出来全被截断了。
IO分配的另一个原则是留余量。点表里我习惯把地址排满但不一定全用,比如DO从Q0.0到Q1.1,中间Q0.7和Q1.0之间其实隔着好几个空地址,这就给以后增加设备留了空间。别把地址挤得密不透风,后期加一个阀门或者加一个泵,地址全乱了,改程序改到你怀疑人生。
3. 电气原理图与接线设计:图纸不是画给自己看的,是留给维护人员的
3.1 主回路和控制电源的设计思路
主回路的逻辑很清晰。循环泵功率一般在3到5.5kW,三相380V供电,回路里串联断路器QF1、接触器KM1、热继电器FR1,电机外壳接地PE。投药泵是计量泵,功率很小,几百瓦到一千瓦,可以用D10微型断路器加接触器,也可以直接用PLC输出驱动中间继电器,再由中间继电器驱动计量泵——计量泵本身自带插头的话,直接控制它的电源即可。
控制电源这块要重点说。S7-200的CPU供电是DC24V,传感器变送器也要DC24V,所以我习惯用两个DC24V开关电源:一个给PLC本体和数字量输入输出回路,一个给变送器和模拟量回路单独供电。为什么要分开?因为变送器和接触器动作时会产生电源扰动,如果和PLC共用一路电源,模拟量读数很容易波动。模拟量传感器供电单独用一路电源,相当于把干扰源的耦合途径切掉一条。两个开关电源的直流负极我建议单独挂端子排,不要在柜内直接并在一起,等电位干扰就小多了。
3.2 PLC输入输出接线细节
S7-200 CPU 224 XP的输入端子是源型/漏型可选的,国内使用习惯是接成漏型输入:公共端1M、2M接DC24V的负极,各个输入点通过按钮或者开关触点接到DC24V正极。也就是说,急停按钮的常闭触点一端接24V+,另一端接到I0.0,这样按钮没按下时I0.0得电,逻辑上就是"正常状态为1",PLC程序里用常开触点读取I0.0即可;一旦按下急停,I0.0断电变0,立即触发联锁。这种接法有一个好处:急停回路断线或者接触不良时,PLC读到的也是0,同样会联锁停机,属于故障安全型设计。
输出侧,CPU 224 XP是晶体管输出,只能接DC24V负载,不能直接接220V的接触器线圈。所以我全部通过中间继电器过渡:PLC输出点驱动中间继电器线圈,中间继电器的触点再去控制接触器线圈。中间继电器选DC24V线圈的,触点容量选5A以上。这样做除了电流隔离,还有一个好处,PLC输出点损坏后更换继电器比换PLC模块便宜得多,现场维护也方便。输出侧每个中间继电器线圈两端要并联一个续流二极管,方向是负极接二极管负极、正极接二极管正极,不然继电器断电瞬间的反向电动势容易打坏PLC输出管。
3.3 模拟量信号防干扰接法
模拟量部分是整套系统最容易出问题的地方。pH电极、余氯电极输出的4-20mA信号,和循环泵380V动力电缆在同一个桥架里走的话,基本等着被干扰。我的习惯是:
- 信号电缆用屏蔽电缆,屏蔽层在PLC柜侧单端接地,另一端悬空。单端接地是为了避免形成地环路,地环路才是模拟量波动最大的根源。
- 信号电缆在柜内走线必须和动力线分开,至少间隔20厘米,实在避不开就垂直交叉,不要平行走长距离。
- 变送器供电用独立开关电源,前面已经说了。
- 模拟量模块的通道和公共端接线要检查变送器的两线制还是四线制,接法完全不同。两线制的电源正极接变送器+,变送器-接模块通道+,模块通道-接电源负极;四线制变送器电源单独接,信号线直接接模块。接错了轻则读数不准,重则烧模块。
电气图纸的组织,我习惯分成六页:第一页图纸目录和设备清单;第二页主回路原理图;第三页控制电源分配图;第四页PLC输入接线图;第五页PLC输出接线图及中间继电器柜内接线;第六页现场仪表和变送器接线图。每一页都配上IO对照表,端子号、线号、电缆编号标得清清楚楚。图纸不是画给自己看的,过两年设备故障,换一个电工过来查线,图纸看不明白,你的系统口碑就砸了。
4. 梯形图程序核心逻辑拆解:带解释的编程是怎么组织的
4.1 程序总体框架和注释习惯
S7-200的STEP 7 Micro/WIN里,每个程序网络都可以写网络标题和网络注释。我强烈建议养成一个习惯:每个网络必须写标题,说明这一网络是干什么的,注释里写清楚动作条件和输出结果。带解释的梯形图程序不是给机器看的,是给三个月后的你自己和接手的维护人员看的。这个项目里我按功能把程序分成九个网络段,从总联锁到报警汇总,逻辑清晰,查错也快。
整个程序的框架是这样:
| 网络段 | 功能 | 说明 |
|---|---|---|
| 网络1 | 总启动联锁 | 急停未触发、模式有效时置位系统允许位 |
| 网络2 | 模式选择 | 本地/远程、手动/自动切换 |
| 网络3 | 循环泵控制 | 自动定时启动、手动启停、联锁保护 |
| 网络4 | 投药泵联动控制 | 循环泵运行时按条件投药 |
| 网络5 | 反冲洗步进流程 | 五步状态机,每一步独立网络 |
| 网络6 | 加热恒温控制 | 带回差的水温闭环 |
| 网络7 | 自动补水控制 | 低水位开阀、高水位关阀、超时报警 |
| 网络8 | 故障汇总报警 | 过载、漏水、限位超时 |
| 网络9 | 模拟量处理 | 采样、滤波、超限判断 |
4.2 循环泵控制逻辑的设计
循环泵是整个系统的"心脏",所有投药、过滤、反冲洗都依赖于它。控制逻辑分自动和手动两种。
手动模式:柜门上的启动按钮I0.2按下,置位Q0.0;停止按钮(我用的I0.3的常闭逻辑,但也可以占用一个空闲DI)复位。手动模式主要是调试和检修用的,正常运行时不会让操作员长期用手动模式。
自动模式:通过组态王设置"启泵时间"和"停泵时间",比如每天8点开始循环、20点停止。这个在PLC里可以用比较指令实现:读取系统实时时钟的时分秒,落在启停时间区间内且联锁条件满足,就输出Q0.0。S7-200有读取实时时钟的指令READ_RTC,读出来的BCD码格式时分秒分别存放在VB字节里,用比较指令和设定值比较。注意BCD码和十进制不一样,比较之前要转换或者直接用BCD格式比较。
联锁条件我用SM0.0常开触点串在自动回路的最前面吗?不是,我用的是一个内部位M0.0"系统运行允许",网络1里统一置位:急停I0.0为1、热继电器I0.4为1、低水位I0.7为1(低水位开关正常时触点闭合,没水时断开)、泵房漏水I1.2为0,四个条件全满足,M0.0才为1。然后循环泵的输出条件统一串联M0.0。这样做的目的是把联锁条件集中在一处,后续新增联锁只要改网络1,不用在每个泵的程序里到处找。
4.3 投药泵联动和保护逻辑
投药泵的控制原则非常简单:循环泵运行才允许投药泵运行。原因是如果水泵不转,药液投进管道里不流动,局部浓度会严重超标,等泵一开,高浓度药液直接冲进泳池,这是安全事故。所以絮凝剂泵Q0.1、pH调节泵Q0.2、消毒泵Q0.3的输出条件里,第一项就是循环泵运行反馈I0.3为1。
消毒泵还有一个特点,它不需要24小时连续投,更常见的做法是定时投加或者按余氯反馈投加。如果配置了余氯在线仪表,可以做个简单的比例控制:余氯低于下限0.3mg/L时投药泵启动,高于上限1.0mg/L时停止,中间回差区域保持原状态,避免频繁起停。没有余氯仪表的话,就用定时器,运行15分钟停30分钟循环,参数通过组态王设置到V区。
反冲洗过程中所有投药泵都必须强制停止,这个在反冲洗步进流程的开始步骤里直接复位Q0.1、Q0.2、Q0.3。还有一个细节是投药计量泵的冲程长度是机械调节的,PLC只能控制启停,所以投药量的精确调整得靠现场人工去调计量泵的冲程旋钮,这个要在操作说明里写清楚,不然操作员以为组态王上能调量,怎么调都没反应,就会觉得系统坏了。
4.4 反冲洗步进流程:用字型变量做状态机
反冲洗是这个项目里最值得细讲的逻辑。我用VW0作为步进存储字,每个状态用不同的整数值表示。这样做的优点是调试的时候在状态表里直接看VW0的值,就知道当前反冲洗走到哪一步了,非常直观。
程序结构里我先看触发条件:压差开关I0.5动作、或者反冲洗定时累计到、或者组态王手动触发位M1.0被置位。触发之后,进行第一段置位:把VW0的值改成1,同时复位循环泵Q0.0、复位所有投药泵、关补水电磁阀。这个"先停后转"的顺序很重要,绝不能先关阀再停泵,那样等于憋泵。
VW0等于1的状态:等待循环泵停止确认。怎么确认泵停了?用运行反馈I0.3变成0作为条件,同时加一个3秒的定时器延时,确保泵确实停稳了。满足后VW0改成2。
VW0等于2的状态:切换阀门到反冲洗位。输出Q0.4(反洗阀开),等待I1.0(开到位限位)变为1。这里要加一个超时保护:15秒内限位没到位,置位报警位M3.2"阀开超时",同时复位输出Q0.4,VW0清零退出反冲洗。为什么必须加超时?电动执行器卡住的时候,如果你一直保持开阀输出,执行器电机会一直堵转,很快就会烧掉。超时停输出是最基本的保护。
VW0等于3的状态:启动循环泵进行反冲洗。这里有个细节,反冲洗用的也是同一台循环泵,因为它正反转无所谓,砂缸的多路阀结构决定了水流方向,所以输出Q0.0,同时启动反洗定时器,定时10分钟。定时到VW0改成4。
VW0等于4的状态:停泵、阀门切回过滤位。复位Q0.0,输出Q0.5(关阀),等待I1.1(关到位限位),同样加15秒超时保护。到位后VW0改成5。
VW0等于5的状态:恢复运行。如果系统处于自动模式,重新启动循环泵Q0.0,恢复投药泵,把VW0清零,退出反冲洗状态,置位M1.1"反冲洗完成",这个位可以让组态王弹个提示框。
每一步的转换条件我都写上了网络注释,比如"网络12:反洗状态3,启动循环泵,定时10分钟,定时到跳转状态4"。这样带解释的梯形图程序,别人接手看一遍就能明白整个流程,不会满头问号。
4.5 加热和补水控制
加热控制就是一个带回差的闭环。温度设定值存储在VW100里,比如27℃,回差1.5℃,用比较指令:水温低于25.5℃(设定下限)且加热允许,输出Q0.7;水温高于28.5℃(设定上限),复位Q0.7。回差的作用就是防止温度在设定点附近反复启停继电器,机械触点和接触器都经不起频繁动作。加热器如果是大功率电加热,输出回路一定要用接触器或者固态继电器,不能直接用PLC晶体管输出点去带加热器,道理和带接触器线圈一样,电流等级完全不对。
补水控制是标准的液位逻辑:低水位开关I0.7动作(没水了)且系统允许,输出Q0.6开补水电磁阀;高水位开关I0.6动作,复位Q0.6关阀。同时加一个补水超时报警:连续补水超过30分钟还没到高水位,置位M3.3,说明要么电磁阀坏了,要么管路漏水,需要人工去检查。这个超时报警很实用,我有一次就是靠它在半夜发现问题,不然泵房里水漫金山也没人知道。
5. 组态王监控画面与通讯配置:上位机不做花瓶
5.1 S7-200和组态王的通讯搭法
组态王和S7-200通讯有三种常见方式,我挨个说清楚。
第一种是PPI协议直连,组态王设备驱动里选"西门子 S7-200(PPI)",用USB-PPI编程电缆连电脑,PPI参数波特率必须和PLC编程软件里的设置一致,默认9600或者187.5k。这种方式适合就地调试,距离短,速度慢一点,但胜在简单。
第二种是组态王作为OPC客户端,读取S7-200的OPC服务器。这个OPC服务器是西门子官方软件PC Access,它负责和PLC通讯,包括TCP、PPI等方式,然后对外提供OPC接口。组态王里添加OPC服务器设备,再在数据词典里关联变量。这种方式最稳定,而且PC Access可以同时服务多个OPC客户端,缺点是安装配置步骤多,PG/PC接口设置错了就连不上。
第三种是加以太网模块CP243-1,组态王用S7-200 TCP驱动直接通讯,速度快,适合需要大量数据交换的场景。但CP243-1模块现在不太好买,而且S7-200自带的Port0口只有PPI,新增的以太网模块配置要占用V区存储地址,稍微折腾一些。
我实际项目里用的是第二种,PC Access OPC。原因很简单,组态王以太网驱动对S7-200的支持没有对S7-300那么成熟,OPC方式多一步但稳定。连接的时候注意PC Access里的"PG/PC Interface"必须选择TCP/IP指向PLC的IP地址(如果加了以太网模块)或者选择PPI电缆指向串口。PC Access配置里需要新建一个PLC组,把要读写的变量全部列进去,比如I0.3、Q0.0、VW0、AIW0这些,一个都不能漏。漏了的话组态王读过来就是无效值。
5.2 数据词典变量定义
组态王的数据词典是变量管理的核心。我建立变量的习惯是这样:I/O变量里的"设备"选择刚才建好的OPC服务器,"寄存器"填S7-200的地址格式,数据类型要和PLC侧一致。比如:
| 组态王变量 | PLC地址 | 数据类型 | 用途 |
|---|---|---|---|
| 循环泵运行 | I0.3 | 位bit | 泵状态显示 |
| 循环泵控制 | Q0.0 | 位bit | 远程启停控制 |
| 反冲洗步进值 | VW0 | 无符号整数 | 显示反冲洗进行到哪一步 |
| 水温工程值 | AIW0 | 无符号整数 | 加线性转换显示温度 |
| 反冲洗完成标志 | M1.1 | 位bit | 弹窗提示 |
AIW0的原始整定值和工程值的转换在组态王里怎么做?数据词典里定义变量"水温原始值",采集AIW0;再定义一个内存变量"水温显示值",用应用程序命令语言写一行转换公式,除以256再乘以50,因为6400到32000的整定范围对应0到50度,换算比例就是50除以25600,约等于每256个单位对应0.5度。也可以用组态王的"线性转换"功能,在变量属性里直接填原始值下限6400、原始值上限32000、工程值下限0、工程值上限50,系统自动换算,这个功能很实用。
5.3 画面设计和动画连接思路
组态王画面我不推荐堆砌3D效果,搞一堆花里胡哨的图片,用处不大,调试的时候还卡。好的监控画面应该一眼就能看出系统当前处于什么状态。我做的工艺主画面布局是:左侧竖排循环泵、投药泵、加热器、补水阀,中间是砂缸和管道走向,右侧是实时参数面板。
动画连接的核心是"颜色变化反映状态"。泵停止时图形灰色,运行时绿色,故障时红色闪烁。阀门图形用"填充"属性连接开到位/关到位状态。管道画粗一点,用"线色"连接对应泵的运行位,泵一转管道变绿,整个画面看起来就有水流在动的感觉,操作员很吃这一套,也确实是实用的。
实时参数面板上放温度、pH、余氯、压力四个数值显示框,每个框下面配一个小型趋势曲线。组态王支持在画面里嵌入历史趋势曲线控件,设置好变量的采样周期和历史记录,运行起来就能看到过去24小时的曲线。pH和余氯的趋势曲线尤其重要,水质的波动规律从曲线上一眼就能看出来,比看数字报表直观得多。
操作区放模式切换(自动/手动)、循环泵启停按钮、反冲洗手动触发按钮、参数设定框(启泵时间、停泵时间、投药间隔、反冲洗定时)。按钮的安全等级在组态王用户管理里设置,普通操作员只能看不能动,管理员才能操作,这个不要省,万一误操作把正在过滤的循环泵停了,整池水几个小时就变浑了。
5.4 报警窗口和历史记录配置
组态王的报警系统要接好。我建立了这样几类报警:开关量报警(热继电器跳闸、漏水报警、低水位)、模拟量越限报警(pH超范围、余氯超范围、压力超限)、流程超时报警(阀门超时、补水超时)。每一个报警都要在数据词典对应的变量属性里勾选"允许DDE报警",然后在画面上放报警窗口控件,选择实时报警和历史报警两个页面。报警记录要存到Access数据库文件,这样三个月后出问题,还能翻出当时的报警记录和水质曲线对照分析,排查效率翻倍。
还有一个容易被忽略的点:组态王运行系统的"数据改变命令语言"。比如反冲洗完成标志M1.1从0变1的时候,弹出一个提示窗口"反冲洗完成,系统已恢复过滤模式"。这个逻辑在组态王里写数据改变脚本,比在PLC里做方便,因为PLC只负责逻辑,人机交互提示交给上位机更合理。
6. 现场调试踩过的坑:从信号干扰到通讯掉线
6.1 模拟量信号波动排查全过程
这个项目调试遇到的最头疼问题,是pH值读数在组态王画面上像心电图一样上下跳。排查链路是这样的:先用万用表直接在变送器的4-20mA输出端测电流,万用表读数稳定得一批,说明变送器本体没问题;然后量PLC模拟量模块对应的AIW整定值,也是跳的。那问题就出在传感器到模块这条传输路径上。我检查了信号线,发现有一段和循环泵的动力电缆并排走了将近两米,而且是同一个桥架,没有任何隔离。这就是典型的空间感应干扰。处理办法:把信号电缆那段移出桥架,重新走独立的穿线管,和动力线垂直交叉通过;屏蔽层在PLC柜内单端接地。改完再监视AIW值,波形明显平稳了。
但光靠物理隔离还不够,信号里还是有轻微的高频毛刺,幅度不大但会影响精确性。我又在PLC程序里加了数字滤波:AIW0每200ms采样一次,连续采5次取平均值。S7-200没有现成的平均值指令,我是用循环移位加累加的方式写的,也可以用加法指令加除法指令简单实现。做了软件滤波之后,读数彻底稳了。这里要提醒一句,滤波时间常数不要太大,pH和余氯是慢变量,滤波大一点没问题,但压力信号别使劲滤波,因为压力变化本身可能就是异常预警,你把它滤平了,报警就不灵敏了。
6.2 pH和余氯电极的维护教训
泳池投药系统的pH电极和余氯电极,安装位置很有讲究。我第一次安装是把电极直接装在不锈钢管道上,结果发现读数偏高,而且漂移很严重。查来查去发现是电极安装的地方离投药点太近,药液还没混合均匀就把电极包围了,测到的是一团浓药液,不是池水的平均值。后来把电极移到投药点下游、经过管道混合之后的位置,读数就正常了。
电极的日常维护也得写进操作手册:第一,电极每隔一到两周要用清水冲洗探头,泳池水里的油脂和杂质会糊在探头上造成响应变慢;第二,每隔一个月要用标准缓冲液校准一次pH电极,用标准余氯液校准余氯电极;第三,长期停机时电极要泡在保护液里,不能干放。这些不是PLC工程师的活,但你必须把这些要求交代给运维人员,不然电极坏了读数不准,整个自动投药系统就变成了瞎投药,水质超标了系统还自我感觉良好。
6.3 组态王与PC Access通讯掉线的处理
项目运行过程中出现过一次组态王画面全部变灰、数据显示"通讯失败"的情况。排查思路是这样的:
第一步看PC Access侧,打开PC Access软件看客户端连接状态,发现PC Access本身还能读数据,说明PC Access和PLC之间的链路是通的。
第二步看组态王侧,打开组态王的设备驱动状态窗口,发现OPC设备状态是"失败"。重启组态王运行系统,恢复正常,但过几个小时又掉。
第三步怀疑是PC Access的连接数问题。PC Access作为OPC服务器,默认允许的连接数是有限制的,而且组态王长时间运行后,OPC连接可能因为网络超时被系统释放,但组态王侧没感知到,导致连接状态不一致。
最终的处理方案:在组态王的设备配置里,把"通讯超时时间"从默认的3秒调大到5秒,"尝试恢复间隔"设置为30秒,同时在PLC程序里把PC Access相关的通讯超时标志位处理好。另外,如果是通过以太网模块通讯,PLC侧和上位机之间的交换机一定要用工业级的,家用交换机在长时间大数据量传输时容易丢包,丢包累计多了OPC连接就断了。
6.4 反冲洗流程的超时保护优化
反冲洗阀门超时保护这个功能,我第一次做的时候是没加的。结果有一次现场电动执行器出了机械故障,阀门卡在半路,开到位限位和关到位限位都不动作,程序就一直停在等限位那一步,循环泵一直处于停止状态,泳池整个循环系统瘫痪了一个多小时,直到现场人员去柜门前手动检查才发现问题。
后来加了两处优化:第一是每个阀位等待状态加15秒超时,超时后退出反冲洗流程,阀门输出复位,报警提示"阀开超时请检查执行器";第二是如果反冲洗过程因超时异常退出,系统要恢复循环泵运行,别让泳池整个停循环,因为反冲洗失败最多是砂缸脏一点,但循环停了水质会迅速恶化。也就是说,异常退出的默认动作是"尽量恢复到过滤状态",而不是"全部停机等人来处理"。这条思路同样适用于其他流程控制项目:异常退出必须有一个安全的故障默认状态,这个默认状态的选择要看哪个后果更严重。
写在最后的实操心得
这套项目从工艺梳理到画面完成,前前后后大概花了两周时间,程序本身不大,梯形图加起来也就百来个网络,但真正花时间的反而是IO分配图纸和组态王变量整理这些"没什么技术含量"的杂活。我做了这么多年项目,最大的体会是:PLC项目出问题,很少是程序逻辑本身算不过来的,多半是IO地址乱了、接线对不上、变量名字五花八门导致调试时人脑CPU过载。
所以最后再啰嗦几句经验:第一,程序里的网络注释和IO分配表一定要和最终图纸同步更新,管线改了第一时间改文档,拖一天就是给自己埋一个坑;第二,组态王变量的命名规范从一开始就定好,别用"变量1""变量2"这种名字,三个月后没人知道变量2到底是个啥;第三,模拟量干扰是水处理项目的最常见故障源,信号线和动力线分开走、屏蔽单端接地、变送器独立供电这三板斧,能解决九成干扰问题。这个泳池项目的逻辑,稍微改改就能套到景观水、养殖水、中水回用这些同类场景里去,核心的循环过滤和反冲洗步进逻辑是完全一致的。真遇到具体的程序细节卡壳了,随时可以拿出来对照着看,这套思路跑通了,后面的路就顺了。