1. 系统方案选型与整体设计思路
做恒压供水这套系统,我最早接触的项目用的还是老式继电控制加变频器面板操作,压力波动大、换泵麻烦不说,半夜管网用水量小的时候,变频器还容易因为低频运行发热。后来换成基于通信控制的方案,才算真正把问题解决干净。这篇就以一套基于西门子S7-200 SMART PLC、通过RS485总线控制变频器、实现一拖二恒压供水的程序样例为主线,把从硬件选型到程序调试的完整思路走一遍。
先说清楚这套系统是干什么的。一拖二,意思是一台变频器通过接触器切换,轮流驱动两台水泵电机。恒压供水,就是通过压力传感器实时检测管网压力,PLC 内部跑PID运算,把结果通过RS485通讯下发给变频器,变频器调整输出频率,让水泵转速跟着变,最终让管网压力稳定在设定值上。相比每台泵配一台变频器的方案,一拖二的最大优势是省钱——变频器只有一台,另外一台泵作为备用或轮换使用,投资直接砍掉将近一半。对于住宅小区、工厂厂区、小型自来水增压站这类场合,性价比非常突出。
通讯方案为什么选RS485而不是模拟量控制?这个问题我反复对比过。传统方式用模拟量端子控制变频器,0-10V或4-20mA给定频率,好处是简单直接,但也有几个让人头疼的问题:一是模拟量信号长距离传输容易受干扰,尤其在变频器旁边,电缆的屏蔽层稍微接地不规范,频率给定就开始飘,压力跟着来回晃;二是只能单向给频率,变频器运行电流、母线电压、故障代码这些状态信息你拿不到,出了问题全靠人跑到柜子跟前看面板,非常被动。用RS485通讯走Modbus RTU协议,一根双绞线就能同时完成下行控制和上行状态采集,抗干扰能力强、传输距离远(理论上一千多米没问题),而且接线极其省事——两根线并联挂上去就行,不用像模拟量那样考虑阻抗匹配和隔离问题。
这套系统的硬核组成包括以下几个部分:
- PLC 控制器:西门子S7-200 SMART系列,具体型号看点数需求,一般用CPU SR20或SR30就够了,集成的RS485口直接拿来当Modbus主站用,不需要额外扩展通讯模块。
- 变频器:支持标准Modbus RTU协议的通用型变频器,例如市面上常见的国产变频器或者国际品牌变频器都可以,关键是通讯参数要可配置、寄存器地址要明确。
- 压力变送器:输出4-20mA或0-10V的管网压力传感器,量程根据实际扬程选,比如0-1.6MPa、0-2.5MPa。
- 接触器组:两台电机各配一个主接触器,加互锁逻辑,确保任何时候只有一台泵的接触器吸合。
- 触摸屏:可选配,我用的是西门子SMART LINE系列,用来设定压力、显示运行参数、查看报警和历史曲线,现场调设备时特别好用。
- 断路器、热继电器、中间继电器、开关电源等标准电气元件。
一拖二的控制逻辑并不是简单的“一台坏了一台顶上”,而是要处理好轮换策略。我常用的策略有两种:一种是时间轮换,比如设定每24小时轮换一次,让两台泵的运行时间累计差不多;另一种是故障切换,当前运行泵出现故障时,立刻切换到备用泵启动。两种策略可以同时生效,时间到了优先轮换,运行中突然报故障就强制切换,并且把故障信息记录下来,方便后续排查。
选择这套方案的整体考虑,归根结底就是三个字:稳、省、好维护。通讯控制取消了模拟量信号的漂移烦恼;一拖二结构省了一台变频器的钱;所有运行参数和故障信息都能在触摸屏上看到,维护人员不需要懂编程也能操作。
2. 通讯组态与变频器寄存器映射
2.1 硬件接线和通讯端口规划
S7-200 SMART PLC 本体上集成了一个RS485通讯口(某些型号有两个),在系统块里把这个口分配给Modbus RTU协议,它就能作为主站轮询变频器。接线时注意:S7-200 SMART 的RS485口是A/B两线制,A接变频器通讯端子的正极(一般是D+或A+),B接负极(D-或B-),两头不要接反。电缆推荐用屏蔽双绞线,屏蔽层单端接地,避免形成地环路干扰。
通讯距离如果超过几百米,或者现场变频器数量多、干扰严重,建议在PLC的RS485口侧加一个隔离中继器。不要为了省这点钱去赌现场的电磁环境,变频器运行时的干扰是实打实的,尤其是大功率变频器,通讯偶发超时排查起来比加隔离器痛苦得多。
2.2 Modbus RTU 通讯参数设置
S7-200 SMART 的Modbus主站库指令支持RTU模式。通讯参数需要在PLC系统块和变频器参数中保持一致,我这里列一个实际项目中最常用的配置:
| 参数项 | PLC侧设置 | 变频器侧设置 |
|---|---|---|
| 波特率 | 9600 | 9600 |
| 数据位 | 8 | 8 |
| 校验方式 | 偶校验 | 偶校验 |
| 停止位 | 1 | 1 |
| 从站地址 | 1(目标变频器地址) | 1 |
| 协议模式 | Modbus RTU主站 | Modbus RTU从站 |
波特率我一般不会设得太高。9600bps够用了,一条指令只有几十个字节,每次读写也就几十毫秒完成,压力控制的实时性完全不受影响。设19200甚至更高反而容易在干扰较大的现场出现通讯错误。
2.3 变频器寄存器地址映射表
Modbus RTU协议中,变频器的控制数据通过保持寄存器(4xxxx区域)读写。我用的变频器常见的寄存器分配如下,实际项目请务必对照你手里变频器手册确认,不同品牌寄存器地址差异非常大,这是一个容易踩坑的地方:
| 寄存器地址(功能码) | 含义 | 读写属性 | 数据类型 |
|---|---|---|---|
| 40001 | 运行控制字(启动/停止/正转/反转) | 读写 | 16位整数 |
| 40002 | 频率设定值(单位0.01Hz) | 读写 | 16位整数 |
| 40003 | 输出频率(单位0.01Hz) | 只读 | 16位整数 |
| 40004 | 输出电流(单位0.01A) | 只读 | 16位整数 |
| 40005 | 母线电压(单位0.1V) | 只读 | 16位整数 |
| 40006 | 故障代码 | 只读 | 16位整数 |
| 40010 | 变频器运行状态位 | 只读 | 16位整数 |
运行控制字每一位的含义一般是这样:bit0代表启动/停止,bit1代表正转/反转,bit2代表点动。写入时把需要的位组合成整数,再写进40001。比如正常启动正转运行,就写1;停止就写0。频率设定值的格式大多定义为单位0.01Hz,比如想设30Hz,写入值是3000;想设45.5Hz,写入值是4550。实际值除以100就是实际频率。
2.4 通讯故障临界值设定
通讯指令发送之后,要设定一个合理的超时时间和重试次数。我习惯把单次通讯超时设为200ms,连续3次通讯失败就判定为“变频器通讯故障”,然后执行故障停机并报警。这样设置的好处是:单次瞬时干扰不会立刻触发停机,给系统留出自动恢复的余地;如果变频器真的掉线或者断电,3次重试的大约600ms时间内就能捕捉到异常,响应足够快。
同时,PLC每200ms轮询一次变频器的运行状态和输出电流,这个频率既能保证监视的实时性,又不会让通讯总线负担过重。
3. 恒压PID控制与一拖二程序逻辑详解
3.1 PID控制在S7-200 SMART中的实现
恒压供水的核心控制闭环是:压力传感器读到的管网压力作为过程变量(PV),操作人员在触摸屏上设定的目标压力作为给定值(SP),两者偏差送入PID控制器,PID输出的控制量对应变频器的频率给定值。S7-200 SMART自带PID指令,配合PID向导使用,在STEP 7-MicroWIN SMART软件里可以比较方便地完成组态。
需要注意一个关键点:PID指令的输入输出都经过归一化处理。压力传感器的量程比如0-1.6MPa,对应4-20mA电流,PLC模拟量模块把4-20mA转换成0-27648的整数。在程序中要先把AIW原始值标定成0.0-1.0之间的工程量百分比(归一化),PID才能正确运算。同样,PID输出也归一化为0.0-1.0,需要再映射到实际的频率给定范围。
我的做法是这样:
- 压力反馈归一化:PV = 实际压力值 / 传感器量程上限。比如实际压力0.8MPa,量程1.6MPa,PV = 0.5。
- PID输出映射频率:输出0.0-1.0映射到0-50Hz。PID输出0.5就是25Hz。
3.2 PID参数整定心得
经常有人问PID参数怎么调才能又快又稳。这个没有万能公式,但有一些非常实用的经验法则可以少走弯路。
我调试这套系统的典型做法:
- 先手动模式给变频器一个固定频率,比如30Hz,让系统稳定运行,此时压力稳定在某个值。观察压力变化趋势,初步估算系统的时间常数。
- 把积分时间设大一些(比如先设为500秒),比例增益从0.5开始,逐渐加大,观察压力曲线。比例太小时压力响应慢、静差大;比例太大会出现持续震荡。找到刚好出现轻微震荡的比例值,再退回20%左右作为实际使用值。
- 比例基本确定后,慢慢减小积分时间,消除静差。积水管路系统一般积分时间100-300秒比较合适。微分项在恒压供水这种滞后不太明显的系统里基本可以不用,如果现场压力波动频繁,稍微加一点点微分有助于抑制超调,但作用非常有限,而且容易放大高频干扰,我的建议是默认关闭。
最直接判断PID效果好坏的指标:管网用水量突变时(比如有人突然打开多个水龙头),压力能否在5-15秒内恢复到设定值附近,恢复过程中不能有明显的持续震荡。
3.3 一拖二轮换控制逻辑
一拖二的轮换逻辑是整个程序里最考验思路的部分。我见过有同事用简单的“运行泵故障才切换到备用泵”,这种逻辑太粗糙,长此以往两台泵运行时间差距越拉越大,容易导致一台泵过度磨损而另一台几乎没动过。
我的程序里这样设计轮换:
- 每台泵累计运行时间通过PLC内部定时器累加,存储在VD区保持寄存器中,断电不丢失。
- 系统压力稳定后(压力与设定值的偏差小于某个阈值,持续30秒),判断当前运行泵的运行时间是否达到轮换设定值(比如24小时或者48小时,触摸屏可设)。
- 若达到轮换时间,则执行轮换:先停当前泵,断开对应接触器,等待5秒确保接触器完全释放,再吸合另一台泵的接触器,延时2秒后启动变频器,PID自动跟踪。
- 若当前运行的泵发生故障(变频器故障、热继电器动作等),立即执行故障切换:停止变频器,断开故障泵接触器,启动备用泵,同时产生故障报警记录到触摸屏。
- 新增一个细节:当备用泵投入后,如果故障现场的故障原因还没有排除,不要自动切回原泵,而是保持备用泵运行,直到人工确认故障解除再恢复自动轮换。这是从现场事故中总结出来的教训——曾经有自动切回逻辑在故障未排除时反复交替启动两台泵,把接触器都打坏了。
加互锁是必须的:PLC输出控制一号泵接触器的Q点与控制二号泵接触器的Q点在梯形图中互相串联常闭触点,在物理回路里两个接触器也要加电气互锁,双保险防止两个接触器同时吸合。两泵同时启动轻则跳闸,重则水锤损坏管道,这条底线千万不能破。
3.4 休眠与唤醒功能
深夜用水量很小的时候,压力传感器显示管网压力已经达到设定值,但PID输出仍然降到最低频率(比如20Hz)运行时,水泵还是在运转,空转浪费电,而且低频下电机散热条件差,长时间运行容易烧电机。大多数恒压供水系统都需要休眠功能。
我的实现逻辑是这样的:当PID输出持续低于休眠频率阈值(比如25Hz对应输出0.5)且压力高于设定值时,系统进入休眠状态——变频器停机,水泵停止。休眠期间压力传感器继续监测管网压力,当压力下降到比设定值低一定差值(比如0.05MPa,即再生压力),系统自动唤醒,变频器从设定的启动频率重新开始PID跟踪。唤醒偏差设置太大会导致频繁启停,设置太小可能压力还没跌就再启动,需要根据管网大小和用水波动范围反复调整。
另外休眠前要确保管网内的储水容量足够支撑休眠期间的供水,否则管网压力会跌得太快,导致系统在一分钟内反复休眠唤醒,这种“打嗝”现象对设备和管网都是折磨。
4. 程序关键模块实现细节与实操记录
4.1 初始化与通讯指令调用
程序开头做初始化:首次上电时设置变频器为远程通讯控制模式、禁止面板操作、设置加减速时间(一般加速10-15秒、减速10秒,避免水锤)、设置最低和最高运行频率等。这些参数可以通过PLC用Modbus指令写进去,也可以通过变频器面板预先设好,我更推荐PLC上电写一次,这样即使变频器被人误操作恢复出厂值,只要PLC重新上电也会把参数拉回来。
通讯指令使用S7-200 SMART的库函数MBUS_CTRL和MBUS_MSG。MBUS_CTRL放在SM0.0上每个扫描周期都调用,用于初始化Modbus主站、监视通讯状态。MBUS_MSG用于触发单条读写请求,一条指令完成后(完成位Done置1或者超时)才能发起下一条,不能同时两条MBUS_MSG指令占用总线。我一般用定时器做一个20ms周期的脉冲串,每次脉冲上升沿触发一条MBUS_MSG请求,保证总线操作井然有序。
工程实现的套路大概是这样的:
- 每200ms执行一次“读变频器状态”任务,读取运行状态字、输出频率、输出电流、故障代码。
- 每500ms执行一次“写变频器频率给定”任务,把PID输出映射后的频率值写入40002。
- 根据启停逻辑,在需要改变运行/停止状态时执行“写运行控制字”任务。
要注意的是,PID输出的频率给定值在浮点转整数时要做四舍五入而不是直接截断,不然频率给定会有0.01Hz级别的锯齿,虽然影响不大,但强迫症患者看着不舒服。
4.2 压力信号滤波与断线保护
压力传感器4-20mA信号经过模拟量模块读进AIW寄存器后,原始值直接用于PID会导致反馈有高频噪声,尤其在变频器附近,压力曲线会毛刺很多。我的做法是在程序中做一个简单的移动平均滤波,取最近10次采样值的平均值参与PID运算,采样周期100ms,相当于1秒的平均窗口。这样既过滤了噪音,又不会产生明显的滞后。
这里还要加一个非常关键的传感器断线保护。4-20mA信号如果线断了,电流会降到0mA,AIW读数直接掉到低限;如果信号线短路,AIW读数会冲高。这两种情况都要在程序里判断:AIW原始值低于量程的10%或者高于量程的90%,都当作传感器故障处理,此时立即停泵并报警,绝不能让系统检测到“压力为零”或“压力爆表”后还在PID闭环里运行——曾经有过传感器断线导致PID输出到最高频率,管道压力迅速升高,差点把管路接头崩开的事故,想想都后怕。
AIW原始值转换成工程量的公式:压力值 = AIW原始值 / 27648 × 传感器量程。这个公式在量程起点是0的情况下成立;如果传感器的量程起点不是0(比如0.5MPa到2.5MPa),就需要先减去量程起点对应的数字量,再做线性换算。
4.3 触摸屏变量组态
触摸屏界面一般包含:
- 主监控画面:显示当前管网压力、目标压力、变频器频率、输出电流、当前运行泵编号、系统状态(自动/手动/休眠/故障)。
- 参数设置画面:目标压力设定、轮换时间设定、休眠阈值设定、PID参数设定(比例、积分时间)、传感器量程设定。
- 报警画面:显示历史故障记录(故障代码、故障时刻、故障内容),带确认复位功能。
- 趋势曲线画面:压力、频率的实时趋势和历史趋势曲线,调试阶段非常有价值,我调节PID参数基本靠看这个画面。
触摸屏与PLC通讯用西门子的以太网方式,一根网线直连或者走交换机都非常方便。组态时,变量地址要和PLC程序里的V区或M区一一对应。注意:PID向导生成的PID指令内部参数存储在分配给它的V区范围内,程序里不要随意读写这些地址,否则PID会突然不正常。
4.4 上电自检与手动/自动切换
程序上电后首先要完成以下自检逻辑,全部通过才能进入自动运行状态:
- PLC与触摸屏通讯正常;
- 压力传感器读数在合理范围内(0到量程上限之间偏合理区域内);
- 变频器通讯正常(MBUS_MSG读状态成功);
- 两台水泵的接触器都在断开状态;
- 无未复位的故障标志。
面板上设置手动/自动转换开关。手动模式下,操作人员可以直接通过触摸屏指定启动一号泵还是二号泵,频率用面板手动给定,PID不参与控制。自动模式下,系统进入前述的PID闭环和一拖二自动轮换逻辑。这个切换逻辑我一般放在程序的独立循环中,任何模式下都能响应转换开关的变化,并做相应的停机/状态切换。
5. 调试与现场问题排查实录
5.1 通讯频繁超时
之前在某工厂调试一套系统,PLC与变频器通讯频繁超时,FC95错误代码频繁出现。排查步骤:
- 先用示波器观察RS485总线上的波形,发现信号毛刺明显,并且有较大的共模噪声。
- 怀疑是布线问题。拆开柜子检查,发现通讯线跟变频器的输出动力线在同一个线槽里走了一长段,这是大忌。变频器输出侧是强干扰源,PWM调制的高频成分会直接耦合进通讯线。
- 处理办法:通讯线改为单独穿管走线,远离动力线;在PLC侧加装隔离器;两端的终端电阻也按要求匹配好。折腾完再测试,通讯稳定,跑了一天一夜没有一次超时。
5.2 水泵轮换时压力波动剧烈
系统自动轮换时,压力会掉下去一截再慢慢恢复,最严重的时候压力从0.8MPa掉到0.35MPa,用户体验非常差。
分析原因:轮换时先停泵再启动另一台泵,中间有接触器切换时间,这期间水泵不出水,管网压力迅速下跌。解决办法是在逻辑上优化切换时序:
- 轮换前,先确认管网压力处于较高水平(高于设定值0.1MPa以上),相当于提前存点水在管网里,为切换期间的短暂断供提供缓冲。
- 减小切换时间间隔。原来的5秒等待时间优化为2秒(前提是接触器确实已经可靠释放,这个需要实际测试)。
- 变频器频率在启动备用泵时,不是从0Hz开始加速,而是直接给一个起始频率(比如35Hz),让备用泵迅速建立流量和压力,再交给PID收敛。类似“抢占”的加速思路,实测下来压力跌落能控制在0.15MPa以内。
5.3 休眠功能异常频繁启停
有一段时间系统在夜间出现“打嗝”现象:休眠后两三分钟又启动,启动后一分钟又休眠,一夜反复十几次。查了一圈发现是再生压力偏差设置太小了——当时设的是2%,也就是0.016MPa左右,管网稍有渗漏压力就会跌到这个范围触发启动。而且之前的休眠判断只看PID输出,没有检查系统当前压力是否真的在一个稳定区间。
调整策略:再生压力从0.016MPa改到0.05MPa,休眠进入条件增加延时确认(PID输出连续低于休眠阈值5分钟)才真正休眠。调整后一夜启停次数降到一两次,效果明显。
5.4 PID出口震荡,频率来回摆动
这台系统的压力反馈波形很妖,PID输出在30Hz到45Hz之间来回反复,一周之内竟然把变频器的IGBT模块烧了。解决思路:
- 先查是否因为采样频率和输出频率不匹配导致控制周期太短。我将PID运算周期从200ms改到500ms,相当于让系统有足够时间响应泵转速变化,压力才来得及反映到反馈上。
- 再次整定PID参数:比例增益从原来的2.0降到1.2,积分时间从120秒增加到300秒。
- 在PID输出的频率值上增加变化率限制:每个扫描周期频率变化不超过0.05Hz。这样即使PID输出有瞬间跳变,实际的频率给定也是平滑过渡,不会刺激变频器剧烈波动。
改变之后,频率曲线像一条平缓的斜坡,再也没有肉眼可见的震荡。经验总结就一句话:恒压供水系统的PID参数,“干了这么多年,从来没见谁家是靠加大比例赢的,多数还是柔和一点稳妥”。
5.5 故障复位后系统不自动恢复
有次其他工地的系统没人在现场,变频器因为瞬时过流跳故障,PLC捕捉到了并切换去启动备用泵,备用泵运行正常,管网压力没问题。但故障的变频器故障代码一直没被复位,导致PLC每次上电自检时都认为“当前变频器故障”,系统只能停在手动模式,直到有人到场手动复位。
后续在程序中增加了一个针对这类情况的自动复位策略:切换到备用泵运行后,每隔10分钟尝试写一次故障复位命令给原来那台变频器,复位成功且能读到正常状态字后,就把那台泵恢复为“可用”状态。这样即使人员不在现场,系统也能在一定时间内自动恢复到完备的一拖二待用状态。当然,这种自动复位只针对可恢复的瞬时故障(比如过流、过压、通讯中断),对于电机绝缘损坏这类严重故障,自动复位反而是安全隐患,这个逻辑里要做一个故障类型的判断,可以复位的故障和不可复位的故障分类处理。
6. 调试工具与参数速查
调试这套系统时,有一些实用工具和经验值非常关键,整理成一个速查表,现场直接用:
| 调试工具/方法 | 作用 | 备注 |
|---|---|---|
| Modbus调试助手 | 先于PLC单独测试变频器通讯 | 可以直接写入控制字,确认寄存器地址正确 |
| 示波器 | 查看RS485总线的信号质量 | 波形眼睛能看到的大量毛刺就要处理 |
| 触摸屏趋势画面 | PID整定实时观察 | 调参时同时看压力和频率曲线 |
| 自制的测试电阻箱 | 模拟压力传感器信号 | 方便单独测试程序逻辑,不用等真实管网压力变化 |
| 记录型万用表 | 长时间记录模拟量信号 | 排查压力信号偶发跳变时使用 |
再啰嗦一下参数速查:
| 参数 | 建议值 | 调试备注 |
|---|---|---|
| PID比例增益 | 1.0-1.5 | 以压力震荡临界值的80%为准 |
| PID积分时间 | 200-400ms | 实际是200-400秒,写错了更正一下,补一句:单位是秒 |
| PID微分时间 | 0 | 默认关闭 |
| 控制周期 | 300-500ms | 太长响应慢,太短震荡 |
| 休眠频率阈值 | 25Hz | 根据需要调整 |
| 唤醒偏差 | 0.03-0.05MPa | 管网水容量大的可以设小点,容量小设大点 |
| 轮换间隔 | 24-72小时 | 依据水泵轴承寿命建议,平均分配运行时间 |
最后再分享一个我在实际调试中反复验证过的体会:这套一拖二恒压供水系统,硬件搭好之后真正考验人的是PID参数整定和轮换逻辑的细节优化。不要怕前期调参花时间,调好了系统可以几年不闹情绪;调不好,三天两头跑现场,维护费足够再买半套系统了。如果后续还想加功能,可以考虑把两台泵都配上软启动器、增加水锤消除器选型计算、把无线远程监控(通过4G模块把数据上传到云平台)加进去,整个系统会变得更完整、更省心。