每年到毕业设计季节,或者项目要落地的时候,总有人拿着“基于S7-300 PLC和组态王组态控制的恒压供水系统”这类题目来问:梯形图怎么写、接线图怎么画、IO表怎么列。说实话,恒压供水本身的技术门槛不算高,核心就一句话——把管网压力当成闭环里的被调量,用水量大了压力往下掉,就抬变频器频率让泵多打水;用水量小了压力顶上去,就降频甚至切泵。真正容易把人卡住的地方,是S7-300的模块选型、IO地址规划、PID功能块调用,以及组态王和PLC通信时的数据对应。这篇文章就把这些环节从头到尾拆开讲,给出一套可以直接参照复现的方案,也把我在实际项目和调试里踩过的坑一并写出来,适合自动化专业的毕设、课程设计,也适合刚接触泵站控制项目的电气工程师参考。
1. 系统整体设计与控制思路
1.1 恒压供水到底在控什么
供水系统的负载特点很特殊:管网里的用户用水量随时都在变,早晨和傍晚用水大,深夜用水小。如果水泵一直以工频50Hz全速运行,压力就会忽高忽低,还白白浪费电。恒压供水的本质,就是把压力变送器装在出水总管上,实时量测管网压力,再通过变频器调节水泵电机转速,让管网压力稳定在设定值附近,比如1.0MPa。
这里有个容易忽略的物理背景:水泵是典型的平方转矩负载,转速下降10%,功耗可以下降将近30%。所以变频调速在供水上的节能效果非常明显,这也是为什么几乎所有的恒压供水系统都要配变频器,而不是靠阀门节流。我在做项目时经常跟学生强调:不要一上来就写程序,先把“压力闭环”这个概念理解透。系统希望的是压力稳定,但能动的执行机构是电机转速,中间靠变频器连接,PLC要做的事情就是:读压力、算偏差、输出频率给定。
至于为什么恒压供水需要PLC而不只是变频器,是因为一个稍微正经一点的泵站通常不止一台泵。用水量大的时候,一台变频泵顶不住,要切工频、再启第二台泵变频;用水量小的时候,又要倒过来减泵。这种泵组切换、轮换、保护、上位机监控,才是PLC存在的真正价值。所以说白了,这个项目练的不只是PID,还有工程上最常见的逻辑编排能力。
1.2 选型思路:为什么是S7-300 + 组态王
很多人问,现在S7-1200、S7-200 SMART都很流行,为什么还选S7-300?答案很现实:毕设题目和很多存量项目就是这么定的,而且S7-300本身的模块化架构适合做这类中型控制系统。我在这个项目里选的是CPU 315-2PN/DP,支持PROFINET和PROFIBUS,自带以太网口,可以直接和组态王走TCP/IP通信,不需要额外配CP343模块,省事也能省钱。
上位机选组态王而不是WinCC,主要考虑三点。第一,组态王是国产软件,图库、中文支持、操作习惯都很顺手,学生上手快;第二,授权成本低,毕设和中小项目用起来没有心理压力;第三,组态王对西门子PLC的支持很成熟,S7-300(TCP)驱动是现成的,和WinCC一样能干监控、报警、曲线这些活。我手头装的版本是组态王6.60SP4,在Win10 64位环境下运行稳定,做这个项目够用。
有人会提到组态王和S7-300走OPC UA的事,那是另一条技术路线,适合要和MES、数据库或其他第三方系统做数据交换的场景。如果就是本机监控,直接用组态王原生驱动最省心,延迟低、配置简单,没必要额外加一层OPC服务。我的建议是:先跑通原生驱动,后续要扩展再研究OPC,别一开始就给自己找复杂度。
1.3 系统架构与控制流程
整个系统分三层。设备层包括两台水泵电机、一台变频器、压力变送器、液位开关和各类接触器;控制层是S7-300 PLC,负责所有逻辑运算、PID调节和保护动作;监控层是组态王,通过以太网读取PLC里的变量,显示工艺流程、实时趋势、报警信息,同时可以下发设定压力、PID参数这些指令。
信号流大致是这样:压力变送器把0到1.6MPa的管网压力变成4到20mA电流信号,送到SM331模拟量输入模块,CPU里的PID程序算出要输出多少频率,再通过SM332模拟量输出模块,把0到100%的输出量变成4到20mA信号送给变频器的AI1端子,变频器按照这个信号调整电机转速。这是闭环的主通道。另外还有一堆开关量信号,比如接触器反馈、热继电器故障、变频器故障、水池低液位,这些都是保命和保护用的,一个都不能省。
控制流程上,系统上电后先判断手动/自动档位。自动模式下,先启动一号泵变频运行,PID自动调节。如果变频泵频率顶到50Hz还压不住压力,说明单泵能力不够,系统就把一号泵从变频切换到工频,再启动二号泵变频运行。反过来,当二号泵频率降到下限且压力偏高,就停掉工频的一号泵,恢复单泵变频状态。这样一套“一拖二”逻辑,在小区增压、工业循环水这类场景里非常经典。
2. IO分配与硬件接线
2.1 硬件选型:模块怎么配
S7-300是模块化结构,选型的关键不是CPU,而是IO点数和信号类型。这个系统大概有十几个数字量、两路模拟量,不算多,但为了留扩展余量和教学示范,我建议按下面这套配置来搭。
- 电源模块:PS 307,5A,给CPU和IO模块供电
- CPU:315-2PN/DP,带以太网口,程序和组态王通信都靠它
- 数字量输入模块:SM321 DI16,24V直流输入,接按钮、旋钮、接触器辅助触点、热继电器触点
- 数字量输出模块:SM322 DO16,24V直流输出,经过中间继电器驱动接触器线圈和指示灯
- 模拟量输入模块:SM331 AI8×12Bit,接压力变送器的4到20mA信号
- 模拟量输出模块:SM332 AO4,输出4到20mA给变频器做频率给定
- 变频器:以ABB ACS510为例,或者用西门子MM440、汇川变频器都行,关键是支持外部端子启停和模拟量给定频率
- 压力变送器:两线制,4到20mA,量程0到1.6MPa,带G1/2或M20×1.5接口
选SM331的时候有个细节要注意:模块上有量程卡和DIP开关,必须把量程卡拨到对应电流档位(通常是B或C位置),硬件组态里也要把相应通道测量范围设置成4到20mA。很多新手第一次调试发现压力信号读出来是乱跳或者满量程,十有八九是量程卡位置和组态不一致。
2.2 IO分配表(可直接作为图纸标注依据)
IO分配是整个项目的骨架。图纸上每一个端子、组态王里每一个变量,都要追溯到这张表。我自己做项目时,先把IO表定死,再画接线图,再写程序,顺序不能反。下面这套IO分配以SM321起始地址为I0.0、SM322起始地址为Q0.0来说明,SM331和SM332的模拟量地址从256开始,这是S7-300的默认习惯。
数字量输入分配:
| PLC地址 | 信号名称 | 来源设备 | 功能说明 |
|---|---|---|---|
| I0.0 | 手动/自动切换 | 转换开关SA1 | 打到自动位时闭合 |
| I0.1 | 1#泵变频接触器反馈 | KM1辅助触点 | 1#泵变频回路已合闸 |
| I0.2 | 1#泵工频接触器反馈 | KM2辅助触点 | 1#泵工频回路已合闸 |
| I0.3 | 2#泵变频接触器反馈 | KM3辅助触点 | 2#泵变频回路已合闸 |
| I0.4 | 2#泵工频接触器反馈 | KM4辅助触点 | 2#泵工频回路已合闸 |
| I0.5 | 变频器故障 | 变频器RO3输出 | 故障时常闭触点断开 |
| I0.6 | 水池低液位 | 液位开关 | 液位过低时闭合 |
| I0.7 | 变频器运行状态 | 变频器RO1输出 | 变频器运行时闭合 |
| I1.0 | 1#泵电机过载 | 热继电器FR1 | 过载时常闭触点断开 |
| I1.1 | 2#泵电机过载 | 热继电器FR2 | 过载时常闭触点断开 |
数字量输出分配:
| PLC地址 | 信号名称 | 控制设备 | 功能说明 |
|---|---|---|---|
| Q0.0 | 1#泵变频接触器KM1 | 中间继电器KA1 | 1#泵接变频器时合闸 |
| Q0.1 | 1#泵工频接触器KM2 | 中间继电器KA2 | 1#泵接工频电源时合闸 |
| Q0.2 | 2#泵变频接触器KM3 | 中间继电器KA3 | 2#泵接变频器时合闸 |
| Q0.3 | 2#泵工频接触器KM4 | 中间继电器KA4 | 2#泵接工频电源时合闸 |
| Q0.4 | 变频器启停控制 | 中间继电器KA5 | 闭合时变频器启动 |
| Q0.5 | 声光报警输出 | 蜂鸣器+报警灯 | 故障时动作 |
| Q0.6 | 系统运行指示灯 | 面板指示灯 | 自动运行时点亮 |
模拟量分配:
| PLC地址 | 信号名称 | 设备与信号范围 | 工程范围 |
|---|---|---|---|
| PIW256 | 管网压力反馈 | 压力变送器4到20mA | 0到1.6MPa |
| PQW256 | 变频器频率给定 | 变频器AI1 4到20mA | 对应0到50Hz |
数字量输入用常开还是常闭,每个项目可能有自己的习惯,但有一点必须统一:所有故障类信号建议接成常闭逻辑,也就是正常时触点闭合,PLC读到1,出现故障时触点断开,PLC读到0。这样做的好处是,信号线断了也能被当成故障发现,不会出现线掉了还以为系统正常运行的情况。这是我在现场吃过亏之后才养成的习惯。
2.3 接线要点与安全互锁
主回路接线是这个项目里最不能出错的部分。以一号泵为例,变频回路是断路器QF1出来后进变频器输入端RST,变频器输出端UVW直接接电机;工频回路是从断路器出来后经KM2主触点直接接电机。这里就出现了一个致命风险:如果KM1和KM2同时闭合,变频器输出和工频电源会同时怼到电机端子上,轻则炸变频器,重则出事故。所以KM1和KM2必须做双重互锁——接触器本身加机械互锁机构,PLC程序里再写软件互锁,两个都不能省。
控制回路上,PLC的DO输出不要直接去驱动接触器线圈,原因很简单,PLC的DO模块带载能力有限,而且感性负载通断时的反电动势容易损伤模块。正规做法是PLC输出先驱动中间继电器,中间继电器触点再去控制接触器线圈。中间继电器选DC24V线圈的,放在控制柜里,和接触器的AC220V或AC380V线圈回路隔开,抗干扰会好很多。
模拟量信号线是干扰的重灾区。压力变送器到SM331这一段,必须用屏蔽双绞线,屏蔽层在PLC侧单端接地,绝对不能两端都接地,否则会产生地环流,干扰不降反升。变频器到电机那段线本身就是强干扰源,走线时和模拟量信号线分开至少20厘米,别图省事扎在一根线槽里。我见过一个现场,压力波动大到PID完全没法用,最后查出来就是信号线和动力线走了同一个线槽,分开之后问题马上消失。
图纸方面,完整的图纸集应该包含系统供电原理图、主回路图、PLC接线图、端子排接线图、组态王画面布置图五类。其中PLC接线图必须和IO分配表逐点对应,端子号、线号、电缆规格都要标清楚。图纸可以手画,但建议用EPLAN或CAD电气版,因为后面调试改线时,图纸就是命根子。
3. 梯形图核心逻辑与程序实现
3.1 程序结构:OB、FB、FC各司其职
S7-300的程序结构不像小型机那么随便,想在哪写就在哪写。规范做法是把功能拆到FB或FC里,OB只负责调度。这个项目我按下面的结构组织:
- OB1:主循环,调用各FC,处理手自动切换、泵组切换、报警逻辑
- OB35:定时中断,默认100ms一进,专门调用FB41做PID运算
- FB41:STEP 7自带的PID控制块CONT_C,背景数据块是DB41
- FC1:设备启停与泵组切换逻辑
- FC2:报警保护逻辑
- DB1:共享数据块,存放所有工艺参数,比如实测压力、设定压力、PID参数、泵切换标志
这里有个关键点:PID采样周期必须固定,所以FB41放在OB35里调用,而不是OB1。OB1是自由扫描循环,执行周期受程序长短影响,用它做PID会导致采样间隔不稳定,参数整定整到天黑也整不出来。OB35虽然也是循环中断,但周期由硬件定时器保证,这才是PID的正确载体。
3.2 压力采集与量程换算
SM331把4到20mA转换成0到27648的整数值,存入PIW256。我们要在PLC里把这个原始值换算成带物理单位的实数。STEP 7的标准库里有现成的FC105(SCALE),调用起来最省事。下面是用FC105把PIW256转换成实际压力MPa的程序片段。
CALL "SCALE", "SCALE_DB" // FC105,需要一个背景背景数据块 IN := PIW256 // 模拟量通道原始值 0~27648 HI_LIM := 1.600000e+000 // 工程量上限 1.6MPa LO_LIM := 0.000000e+000 // 工程量下限 0MPa BIPOLAR := FALSE // 单极性信号 RET_VAL := MW100 // 返回错误代码 OUT := "Pressure" // 输出到DB1.DBD0,实际压力MPa如果你不想用库函数,也可以自己写换算公式,逻辑更透明。原始值除以27648得到百分比,再乘以量程上限就是实际压力。下面是一段等效的STL逻辑,我在现场调试时常用这种方式,因为变量都在自己手里,看着踏实。
L PIW256 // 读原始值 ITD // 转双整数 DTR // 转实数 L 2.764800e+004 // 27648.0 /R // 归一化到0.0~1.0 L 1.600000e+000 // 工程量上限 1.6MPa *R T "Pressure" // 存到DB1.DBD0梯形图形式其实就是把这些指令展开成左右母线和触点线圈,逻辑完全一样,只是呈现方式不同。我的习惯是,凡涉及数学运算的地方,用STL写更方便,STEP 7的梯形图里塞太多数学指令会很乱。程序下载到PLC后,梯形图和STL可以互相切换查看,你完全可以在梯形图里监控这段逻辑的每一步计算结果。
3.3 PID闭环调节:FB41怎么用
压力闭环的核心是FB41。FB41本身是一个数字PID控制器,输入是设定值和过程变量的偏差,输出是0到100%的控制量,默认按时间比例累加积分。为了让FB41正常工作,要注意几个关键参数。
设定值SP_INT和过程值PV_IN必须统一量纲。工程上我习惯都换算成百分比,也就是实际压力MPa除以量程再乘以100。比如设定压力1.0MPa,量程1.6MPa,SP_INT就是62.5。这样PID内部的偏差计算和输出限幅都符合它的设计逻辑。下面这段代码在OB35中调用FB41:
CALL "CONT_C", "PID_DB" // FB41,背景数据块PID_DB COM_RST := FALSE // 不在重启状态 MAN_ON := FALSE // 自动模式 PVPER_ON := FALSE // 不使用外设值作为反馈 P_SEL := TRUE // P作用打开 I_SEL := TRUE // I作用打开 D_SEL := FALSE // 先关掉微分,后面整定再开 CYCLE := T#100MS // 采样周期,和OB35一致 SP_INT := "SP_Percent" // 设定压力百分比 PV_IN := "PV_Percent" // 实际压力百分比 GAIN := "PID_Gain" // 比例增益,DB1.DBD12 TI := "PID_TI" // 积分时间,DB1.DBD16 TD := T#0MS // 微分时间先置0 LMN_HLM := 100.0 // 输出上限 LMN_LLM := 0.0 // 输出下限 LMN := "Freq_Set" // PID输出结果,DB1.DBD8 LMN_PER := PQW256 // 同时输出到模拟量通道FB41的输出LMN是0到100%的实数,对应频率0到50Hz。我把LMN直接给到PQW256,SM332会把它变换成4到20mA送给变频器AI1。变频器内部再把4到20mA对应到0到50Hz,一路下来比例关系就是:PID输出50%,频率25Hz。
关于微分作用,恒压供水系统管道长、响应慢,属于大滞后对象,微分用不好很容易放大噪声,所以我把TD设为0,用纯PI控制。大多数恒压供水项目,纯PI就够了,微分顶多在压力传感器离泵出口很近、系统反应比较灵敏的场景用一点,而且值要很小。这个取舍我在后面调试章节还会细说。
3.4 泵组切换与定时轮换逻辑
泵组切换是梯形图里最考逻辑功底的环节。控制要求是:一号泵变频运行,当PID输出长时间超过95%且压力偏差仍然较大时,说明这台泵已经顶满负荷还不够,要加泵;当两台泵运行时,变频泵频率降到下限比如25Hz且压力偏高,说明用水量下来了,要减泵。
增泵条件的程序逻辑可以这样写,变量名和注释都在旁边。
A "Sys_Run" // 系统运行标志 A "Freq_Max" // PID输出达到95%以上 L T#30S SD T10 // 持续30秒 A T10 S "Add_Pump" // 置位增泵请求熟悉STEP 7的会发现这里用了定时器TON的等效指令SD,目的就是防止频率瞬间顶到上限又掉下来造成频繁切换,加了30秒延时后系统稳定很多。减泵逻辑对称,条件是PID输出低于20%且压力高于设定值,同样延时30秒再置位减泵请求。
真正容易出错的是切换动作本身。以“一号泵变频切工频,二号泵变频启动”为例,动作顺序必须是:
- 断开一号泵变频接触器KM1,变频器停止给一号泵供电
- 延时0.5到1秒,让电机转速基本掉下来
- 合上一号泵工频接触器KM2,一号泵以工频50Hz继续供水
- 启动二号泵变频接触器KM3,同时给变频器启动信号,让二号泵变频运行
顺序乱会导致什么?如果先合KM2再断KM1,变频器输出和工频电源同时接在电机上,瞬时炸机。如果在KM1断开后立刻合KM2,电机在惯性转动中突然被工频电源强行带上,电流冲击和机械冲击都很大,水压也会剧烈波动。所以我坚持加几十到几百毫秒的间隔,让切换有个“喘息”过程。这部分的梯形图逻辑说穿了不难,难的是把时序的严谨性写进程序里。
定时轮换很多人会忽略,但这是泵站维保非常看重的一个功能。长期只让一号泵工作,二号泵一直闲在那里,机械密封会出问题。我习惯加一个24小时定时器,时间到了以后交换主泵和备用泵,让两台泵磨损均衡。逻辑上就是用一个轮换标志位M10.0,切换时要根据M10.0的状态决定先变频启动哪台泵。这样一来,程序里所有“主泵”“辅泵”的判断都要跟M10.0联动,不能写死成1号泵永远是主泵。
3.5 报警与保护逻辑
报警保护程序不值得写得花哨,但必须写到位。这个项目至少要覆盖下面几个工况。
水池低液位是最危险的,液位低于保护开关位置时必须立即停掉所有泵,防止水泵空转烧坏机械密封。程序里把这个条件串在所有泵启动回路的最前面,优先级最高,哪怕系统正在自动运行,也强制复位所有运行输出。
变频器故障和电机过载的处理方式稍有不同。变频器故障时,正在变频运行的那台泵要停掉,故障报警上屏;电机过载时,对应泵的工频接触器要马上断开。如果系统是两泵同时运行,单台泵故障时还要考虑剩余泵的带载能力,能维持就维持,不能维持就直接停机并报警。硬件上热继电器和变频器故障触点是串在接触器控制回路里的,程序里再做一遍软逻辑,相当于双保险。
压力超上限报警我建议设在1.4MPa,比设定压力1.0MPa高出40%。报警输出到组态王的同时,程序里做超压停机或者强制降频,具体选哪个要看工艺允不允许突然停机。小区供水场合突然停机会造成大面积停水,我一般选择强制把PID输出置零,让系统先降频泄压,这是工程和教学题目差异比较大的地方,毕设可以把逻辑做完整,不讲工艺限制。
4. 组态王组态与通信配置
4.1 通信配置及IP规划
组态王和S7-300通信,最省事的方式是走以太网。CPU 315-2PN/DP自带PN口,硬件组态里给这个接口设置IP地址,比如192.168.0.1。工控机和PLC用网线直连,或者通过交换机相连,工控机IP设成192.168.0.2,子网掩码255.255.255.0。
组态王6.60SP4里新建IO设备,路径是:设备驱动→PLC→西门子→S7-300(TCP)。设备地址填PLC的IP地址192.168.0.1。这里有个容易踩的坑:组态王里的“设备地址”在不同版本里含义略有不同,有的直接填IP,有的要填IP:机架:槽号之类的扩展格式。我的经验是先用最简形式填IP,通信失败再去查驱动说明,看它到底要不要带机架和槽号。
通信之前先做三件事。第一,用PING命令确认工控机到PLC的网络层通不通;第二,确认STEP 7里硬件组态下装的CPU型号和实际一致,CPU的PN接口IP地址已经下载到PLC;第三,关掉工控机的防火墙,至少在调试期间先关掉。这三件事都做了还连不上,再考虑驱动版本的兼容性问题,而不是一开始就怀疑组态王配置。
4.2 变量定义与PLC地址对应关系
组态王不认识梯形图里的符号名,它只认地址。所以组态王变量定义之前,最好先在PLC的DB1块里把关键数据安排好。下表是我习惯的做法。
| 组态王变量名 | PLC地址 | 数据类型 | 读写属性 |
|---|---|---|---|
| 实测压力MPa | DB1.DBD0 | Float | 只读 |
| 压力设定MPa | DB1.DBD4 | Float | 读写 |
| PID输出频率 | DB1.DBD8 | Float | 只读 |
| PID比例增益 | DB1.DBD12 | Float | 读写 |
| PID积分时间 | DB1.DBD16 | Float | 读写 |
| 系统运行标志 | M20.0 | Bit | 读写 |
| 手动自动状态 | M20.1 | Bit | 只读 |
组态王里新建这些变量时,寄存器类型选择DB,寄存器号填1,偏移地址填0、4、8这样。需要注意,S7-300的REAL类型是4字节,偏移量必须按4字节对齐,填0、4、8、12、16,千万别在中间塞一个INT变量把偏移弄乱了。我见过一个现场,组态王读回来的压力值完全没规律,排查半天发现是PLC侧DB1里变量定义顺序和组态王对不齐。
M区变量在组态王里同样可以读写,类型选Bit,地址填M20.0这种格式。有一点要提醒:PLC的M区用得很随意,如果组态王写的M20.0恰好和PLC程序里某个关键输出条件冲突,逻辑就乱了。所以项目一开始就要规划好M区的用途段,比如M20到M29专供上位机读写,程序内部逻辑用别的区段。
4.3 监控画面、曲线与报警设计
组态王画面设计有三个层次。第一层是流程图,画上两台泵、管网、水箱、变频器、压力表这些基本元素,泵运行时做旋转或颜色变化动画,管道用流动效果直观反映供水状态。第二层是控制面板,放手自动切换开关、系统启停按钮、压力设定值输入框、PID参数输入框,这些控件绑定到DB1里的相应变量。第三层是数据和记录,包括实时趋势曲线、历史趋势曲线、报警窗口和操作日志。
我在给毕设同学建议时,会让他们把PID参数做成组态王可写变量。这样做的好处是调试时不用反复去STEP 7里改参数下载,坐在上位机面前就能在线整定。很多学生PID整定整不出来,就是因为改一次参数要编译下载一次,耗时太长导致没有试错耐心。组态王上写参数,PLC里用这些参数跑FB41,整定效率能提升一个量级。
组态王的历史曲线要正常使用,需要先在“数据词典”里定义变量时勾选“记录”,并设置存储方式为“变化记录”或者“定时记录”。我一般选变化记录,变化死区设0.01,既能记录关键波动又不会让历史数据库膨胀得太快。报警窗口用“报警事件”控件绑定到站点的报警变量上,压力超限、泵故障、液位低这些都要提前在变量属性里勾选“允许报警”,并填好报警限值。
5. 调试过程与常见问题
5.1 PID参数整定实录
PID参数整定我建议按这个顺序来。第一步,把积分和微分都关掉,TI设成非常大,TD设成0,只留比例作用。GAIN从0.5开始慢慢往上加,观察压力曲线。当GAIN加到某个值,压力开始出现等幅振荡,记录这个临界增益Ku和振荡周期Tu。第二步,如果用的是经验整定,不追求严格公式,直接把GAIN取Ku的60%左右,TI取1.2倍的Tu,再微调。第三步,恢复自动运行,观察压力阶跃响应,超调大就加TI,响应慢就减TI。
恒压供水这类系统,我刚做的时候容易把GAIN调得太大。管网是一个大容积对象,压力变化滞后明显,增益太大会让压力还没起来,PID输出已经冲过头了,结果压力就来回荡。后来我总结了一个适合常见泵站的经验区间:GAIN在2到5之间,TI在15到60秒之间。如果压力波动周期特别长,TI还要更大。微分在大多数项目里真的不需要开,除非你的压力传感器离泵出口特别近、系统灵敏度特别高,而且传感器信号很干净,否则开了容易把噪声放大成输出抖动。
另外温度PID和压力PID虽然都是PID,但对象特性差很远。水温控制滞后更大,容易超调;压力控制响应比温度快但也存在管道延迟。之前有同学拿温度PID那一套参数直接套到压力上,结果是压力和频率都在振荡,怎么调都调不好。这就是没有理解不同对象的时间常数差别,参数完全照搬是调不好的。
5.2 通信异常与信号干扰排查
组态王读不到PLC数据,我排查的顺序是:先PING通不通,不通查网线和IP;PING通了再看组态王设备恢复次数,如果频繁报“设备故障”,大概率是驱动选择的通信协议和PLC侧组态不一致。S7-300的PN口默认支持S7通信,组态王用S7-300(TCP)驱动就是走S7协议,一般不会冲突。比较隐蔽的问题是工控机上装了多个网卡,组态王设备配置需要选择正确的本地网卡,默认选错就会时好时坏。
模拟量信号波动是另一个高频问题。压力变送器读数在小数点后第二位来回跳,表现在PID输出上就是频率跟着抖。处理办法按顺序排查。第一看屏蔽层接没接、是不是单端接地;第二看信号线有没有和动力线平行走线;第三看变频器输出侧有没有加强干扰抑制,有的变频器输出端子对地有共模电压,通过电机线串扰到模拟量线上,这时候可以在信号线入口加一个模拟量隔离器。程序端可以做最后一层防御,就是加滤波,SM331硬件组态里有数字滤波时间可以设置,CPU里也可以用平均值滤波函数,但滤波时间不宜太长,否则压力响应变迟钝。
5.3 泵组切换瞬间压力波动的处理
泵组切换瞬间压力波动是现场最容易被投诉的问题。表现为:工频泵切上的那一刻,管网压力猛冲一下,或者变频泵启起来之前压力先掉一块。前者通常是切换时序太紧凑,工频电源接入时电机和管网还没稳定;后者通常是切换间隔太长,单泵切换期间供水能力出现缺口。
我的处理办法是三步。第一,在PLC里把切换间隔拆成三个延时:断变频接触器后延时0.5秒,合工频接触器后延时0.5秒,再启动另一台泵的变频接触器。每一步都加中间标志位,程序能走到哪一步一目了然。第二,把切换的触发条件做成“频率上限持续30秒再加泵”,而不是一瞬时顶到上限就切,这样能过滤掉用水尖峰的假信号。第三,如果现场条件允许,把压力变送器装在出水总管中后段,避开泵出口和支管汇入点,测到的压力更接近管网平均压力,切换动作就不会因为局部压力扰动而误触发。
还有一个小技巧:增泵之前把PID输出临时置一个较低的启动频率,比如30Hz,等两组泵都投上再切回自动PID调节。这样做的好处是启泵瞬间不会从很高的频率往下压,压力冲击会小很多。这个细节我是在一个二次供水项目里试出来的,做完之后切换时压力波动从0.15MPa降到了0.05MPa以内,效果非常明显。
我在这个项目里最大的体会是:恒压供水系统的难点从来不在某一个具体功能上,而在IO表、接线图、梯形图、组态王这四件事能不能对得上。IO表定错一个点,图纸跟着错,程序跟着错,组态王变量也错,调试时就变成大海捞针。所以我的习惯是先花半天时间把IO表和地址规划彻底锁死,再动笔画图和编程。此外,现场调试一定要随手带着STEP 7的变量表在线监控,把关键中间变量拖进去,比如PID输出、增泵/减泵请求、各个延时标志,看逻辑走到哪里断了,比对着梯形图空想要快得多。最后分享一个小经验:给泵加一个定时轮换的计数器,每台泵的累计运行时间都存到DB块里,组态王上做一页运行时间统计,这个设计看起来不起眼,但在实际泵站里特别受维护人员欢迎。