做恒压供水改造,S7-200 SMART PLC是出现频率非常高的一套小系统。小区加压泵房、工业循环水、农田灌溉加压,核心需求都是同一个:水压稳定,泵不乱切。一拖二——一台变频器带两台水泵——是省一台变频器的经典做法,但代价是控制逻辑和通讯链路变得更讲究。网上能搜到不少“程序样例”,但大多只给梯形图,讲不清背后那层“为什么”。这篇文章我从方案定型讲起,把RS485链路怎么搭、PID闭环怎么调、加泵减泵轮换状态机怎么理、Smart触摸屏画面怎么规划、试运行最容易翻车的故障逐个拆开,适合正在做供水控制项目的电气工程师和调试员,也适合刚接触这套系统、想把程序真正吃透的朋友。
1. 方案定型:为什么一拖二必须用RS485通讯
1.1 系统硬件清单与角色划分
一拖二恒压供水的基本组成不复杂:一台S7-200 SMART PLC负责逻辑和闭环,一台带Modbus RTU通讯口的变频器负责调速,两台水泵电机通过接触器组在“变频回路”和“工频回路”之间切换,压力变送器把管网压力变成4-20mA信号送给PLC,再加一块Smart触摸屏做显示和参数设置。
硬件选型上我有几个固定偏好。PLC我习惯选本体带模拟量输入的型号,比如SR30或ST30,这样压力变送器的4-20mA可以直接进,不用额外挂模块。变频器功率按单台泵电机额定电流的1.1到1.2倍选,注意一拖二方案里变频器只带一台泵,不需要按两台泵的电流叠加选型。压力变送器量程按水泵扬程的1.2到1.3倍,比如扬程80米选0到1.0MPa或0到1.6MPa的变送器,量程选大了分辨率变差,选小了超压容易把变送器干坏。
1.2 硬接线方案和RS485方案的差距
很多老师傅习惯用硬接线做恒压供水:PLC的模拟量输出给变频器0-10V作为频率给定,启停用中间继电器干接点,变频器把运行信号、故障信号通过端子反馈给PLC。这套方案不是不能用,但有几个天生的毛病。
第一,频率给定走模拟量,现场泵房里变频器、接触器一动作,0-10V信号线上容易感应尖峰干扰,压力反馈和频率给定经常出现莫名其妙的小幅波动。第二,干接点只能告诉你“运行了”或“故障了”,带不来频率、电流、母线电压这些诊断数据,出了问题只能拿万用表去现场蹲。第三,多泵切换时继电器网络一大堆,互锁逻辑要在端子上绕来绕去,改一个控制方案就要重新改线。
用RS485加Modbus RTU之后,情况完全不一样。一条屏蔽双绞线把变频器挂到PLC的Port 0口上,启停、频率写入、运行状态、输出电流、故障码全部通过寄存器读写搞定。数据可视化程度高,调试时用在线监控表就能看到变频器当前频率、电流、故障代码,不用反复跑泵房。布线也干净,两根信号线加一层屏蔽,不用拉七八根控制电缆。这也是为什么现在稍微正规点的改造项目,几乎都选择走通讯。
1.3 主从关系与寄存器地址规划
RS485网络里PLC是主站,变频器是从站。一拖二结构里虽然有两台泵,但变频器只有一台,所以从站地址只需要规划一个,默认设为1。以后要扩展成一拖三、一拖四,无非是增加接触器组和状态节点,通讯链路不用动,变频器仍然只有一个从站地址。这一点想清楚,程序框架就稳了。
变频器的Modbus寄存器地址各品牌不完全一样,但功能分区逻辑高度相似。我按常用布局给出一个参考表,具体数值一定要以你手上变频器手册的通讯参数表为准。
| 寄存器地址 | 功能 | 说明 |
|---|---|---|
| 2000H | 控制字 | 写入16位,bit0使能运行、bit1方向等 |
| 2001H | 频率设定 | 写入0到10000,对应0.00到50.00Hz |
| 2100H | 运行状态字 | 读出运行、正反转、故障状态 |
| 2101H | 输出频率 | 读出实际频率,0到10000对应0到50Hz |
| 2102H | 输出电流 | 读出实际电流,按变频器量程折算 |
| 2104H | 故障码 | 读出最近一次故障代码 |
规划好地址后,PLC里的V区也要做一张对应表:写频率缓冲区、写控制字缓冲区、读状态缓冲区、读故障码缓冲区。这样程序里每个功能块各管一块地址,后期改参数只需要动数据区,不需要翻梯形图逻辑。
2. S7-200 SMART与变频器的Modbus RTU链路搭建
2.1 接线细节和容易忽略的坑
S7-200 SMART本体上的Port 0是一个RJ45形式但走RS485协议的口,也可以是9针D型口,信号定义固定:A+、B-、M参考地。如果使用端子接线,注意有些型号的接线端子标的是“RS485 A/B”,有些标的是“D+”和“D-”,本质一样,但极性千万别接反。
接线这一步最大的坑是变频器一侧的A/B定义不统一。有的品牌变频器面板上清清楚楚标了A和B,有的标的是“485+”和“485-”,还有的标了“S+”和“S-”。更麻烦的是个别设备默认定义和行业习惯相反,看着像A实际是B。我调过一台变频器,通讯线怎么接都不通,拿万用表测量才发现端子标注和内部电路是反的,对调后立刻恢复。所以现场第一件事,别急着写程序,先用表确认两边极性。
通讯距离在50米以内时,波特率用9600bps,屏蔽层单端接地,通常接在PLC的地或者柜内接地排上,不建议两端同时接地,否则会造成地环路干扰。超过100米或者电缆要跟动力线一起走桥架,建议把波特率降到4800甚至更低,并确保屏蔽层在靠近PLC那一端可靠接地,有条件就在总线两端各并联一只120欧终端电阻。动力电缆和通讯电缆的间距尽量拉开20厘米以上,不跟动力线捆成一束,这个功夫花在前面,后面少很多麻烦。
还有一个很多人不知道的坑:S7-200 SMART的RS485口是非隔离的,如果变频器也是非隔离口,两个设备处于不同配电系统时,电位差可能烧通讯口。稳妥的做法是把PLC的M端子和变频器的通讯参考地连起来,让两个设备共参考电位。但是要注意,这个连接只连信号地,不连保护地,否则会形成接地环路。
2.2 变频器侧的参数设置清单
通讯能不能建立,一半取决于变频器参数。我每次调试都会按下面这张清单逐项核对,缺一项都可能导致通讯挂掉:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 命令源选择 | 通讯命令 | 变频器启停由通讯控制字决定 |
| 频率源选择 | 通讯给定 | 目标频率由通讯寄存器写入 |
| 从站地址 | 1 | 和PLC里MBUS_MSG的Slave参数一致 |
| 波特率 | 9600bps | 和PLC中MBUS_CTRL的Baud一致 |
| 数据格式 | 8-N-1 | 无校验、1位停止位,兼容性最好 |
| 通讯超时 | 0.5到1秒 | 超时后变频器可设置保持或停车 |
| 加减速时间 | 15到30秒 | 恒压供水建议软启动,防冲击 |
每次给变频器恢复出厂设置后,记得重新核对上面这些参数,因为恢复出厂会把这些通讯选项全部打回面板控制。我碰到过不止一次,通讯原来好好的,某次断电重启后突然写不进频率了,查了半天发现是变频器被复位过,命令源又变回了面板控制。
2.3 程序实现:MBUS_CTRL和MBUS_MSG的用法
S7-200 SMART的Modbus RTU主站功能是通过库指令实现的,核心就是两条库指令:MBUS_CTRL负责初始化通讯口,MBUS_MSG负责发起一次读写操作。
MBUS_CTRL必须每个扫描周期都调用一次,一般放在主程序里用SM0.0常ON调用。关键参数:Mode设为1(使能Modbus主站),Baud设为9600,Parity设为0(无校验),Timeout设为500毫秒。这个超时值不要设太小,变频器响应偶尔慢一点,500毫秒比较稳妥。
MBUS_MSG不能每个周期都触发,否则会连续发起通讯请求,导致从站来不及响应。正确做法是用沿触发,每轮询周期发一条读写请求。我习惯的做法是做一个200毫秒的时钟脉冲,每个脉冲沿触发一次MBUS_MSG,读或者写交替进行。
下面是一段结构化文本风格的伪代码,解释读写流程的核心思路,实际工程中用梯形图实现:
// 写频率设定值流程 IF 频率已更新 THEN 频率整数 := 目标频率浮点 * 100; // 分辨率0.01Hz 缓冲_高字节 := 频率整数 / 256; // Modbus高字节在前 缓冲_低字节 := 频率整数 MOD 256; 触发写请求; // 上升沿调用MBUS_MSG END_IF; // 读输出频率和电流流程 每200ms: 触发读请求, 起始地址2101H, 长度2, 数据写入VW210缓冲; 完成后交换高低字节并折算实际值;字节顺序是个大坑。Modbus RTU协议规定寄存器高字节在前,而S7-200 SMART的V区变量存储是低字节在前。直接读回来的数据如果不做高低字节交换,频率值会差得离谱。比如实际30.00Hz读回来变成7680(0x1E00交换成0x001E对应量程重新折算就全乱了)。每次读写完成,都要把缓冲区的高低位重新组装。梯形图里用字节传送指令或者SWAP指令都能处理,重点是别忘了这一步。
2.4 通讯故障诊断表
通讯问题在调试期几乎躲不掉,我把常见现象和根因整理成一张表,现场照着查能省一半时间:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| MBUS_MSG错误码为2 | 从站无响应 | 查站号、波特率、A/B极性、变频器通讯使能 |
| 错误码为1 | 校验错误 | 检查数据格式是否两边一致 |
| 时通时断 | 接线松动或干扰 | 重插端子、屏蔽层单端接地、电缆远离动力线 |
| 数据读回但数值异常 | 字节序未交换 | 做高低字节重排 |
| 写控制字无效 | 命令源未设为通讯 | 变频器参数重新确认 |
3. PID调节参数与压力闭环的工程化处理
3.1 闭环结构拆解
恒压供水的本质是一个闭环调节系统:压力变送器测量管网压力,PLC把测量值和设定值比较,偏差经过PID运算得到频率目标值,再通过RS485写成变频器的给定频率,变频器调速改变水泵转速,最终改变管网压力。这个环路的特点是系统惯量大、滞后时间短、非线性强。所谓惯量大,是指管网和用水端像个大水桶,频率改变后压力要好几秒甚至十几秒才能稳定下来。用水端随机波动又让反馈信号带着各种噪声。
理解这个特点就明白,恒压供水的PID参数不能照搬温度控制或者流量控制的经验,比例增益不能太大,积分时间不能太短,微分基本不用。
3.2 PID向导配置和输出映射
在STEP 7-MicroWIN SMART里用PID向导生成回路,比手写PID指令省事得多。向导里把输入类型选成“单极性20%偏移量”,对应4-20mA电流信号,过程变量范围自动设为0.0到1.0。设定值也归一化到0.0到1.0,例如目标压力0.4MPa、变送器量程0到1.6MPa,设定值就是0.4/1.6=0.25。
有个选择很多人拿不准:PID向导的输出到底选“模拟量”还是“占空比”还是“手动输出”。一拖二方案里频率目标值要走RS485写入变频器,所以不能把输出直接接到物理模拟量输出点,而是让PID向导生成一个实数输出值,放在VD区,然后在程序里把这个0.0到1.0的输出值乘以50.0,得到目标频率,再按第2章的方法写入变频器寄存器。
向导生成后会在主程序里自动调用PID0_INIT子程序,采样周期建议设0.5秒。这个值配合恒压供水的大惯性比较合适,设太短PID反而容易对噪声敏感,设太长系统反应迟钝。
3.3 PID参数初值现场整定三步法
初值我一般按P=1.0到2.0、I=60到120秒、D=0来设置,然后在现场做三步整定。
第一步,把积分时间设得很大(比如999秒),只保留比例项,观察压力曲线。如果系统出现持续等幅振荡,说明P偏大,减半。如果压力偏离设定值始终回不到目标,说明P偏小或者系统静差大,适当增大。第二步,把积分时间从120秒开始往小调,观察压力能否较快回到设定值且不产生大的超调。如果压力回落后又慢慢偏离,再把积分时间减小。第三步,微分保持0。恒压供水系统一般不缺微分,加了反而容易被反馈噪声放大,造成频率频繁抖动。
整套系统里压力变送器的安装位置也要留意。变送器要装在出水母管上靠近用水端的位置,不能装在泵出口很近的地方,否则测到的压力是泵出口压力而不是管网末端压力,会出现设定值明明达标、末端用户却水压不足的情况。
3.4 积分饱和和切换干扰的处置
PID积分饱和在一拖二切换时是最大的隐患。加泵或减泵过程中,变频器先停机再重新启动,这段时间偏差很大,PID积分项拼命累加,等变频器重新启动时,输出值直接冲到上限,频率一下拉到50Hz,水压瞬间飞升,然后管网压力过冲再跌回来,非常难看。
我解决这个问题的办法是给PID回路加一个“切换期间保持输出”的逻辑。具体做法是:切泵时序一开始,把PID的手动/自动切换位置为手动模式,保持当前输出值,同时把PID输出值在停车那几秒内强制为0,但积分项通过向导生成的手动复位功能清零。变频器重新启动后,再切回自动模式。这样频率从0Hz缓升,压力不会飞车。一些功能强的PID向导还支持设定值跟踪,也就是切换时把设定值临时改到当前PV,切换完成再恢复,效果类似,本质都是防止积分在停机阶段积累。
4. 一拖二切泵时序:加泵、减泵与轮换的PLC实现
4.1 状态机设计
一拖二最核心的程序逻辑不是PID,而是状态机。系统里一共六种工况状态,用一个整数变量STATE记录,程序主逻辑围绕STATE做分支跳转:
| STATE | 工作状态 | 变频器拖动对象 | 工频运行对象 |
|---|---|---|---|
| 0 | 停机 | 无 | 无 |
| 1 | 1号泵变频单机运行 | 1号泵 | 无 |
| 2 | 加泵状态:1号工频、2号变频 | 2号泵 | 1号泵 |
| 3 | 2号泵变频单机运行 | 2号泵 | 无 |
| 4 | 加泵状态:2号工频、1号变频 | 1号泵 | 2号泵 |
| 5 | 故障锁定 | 无 | 无 |
状态转换不是随便跳的,每一步都必须满足条件并经过确认延时。比如从STATE=1到STATE=2,要确认加泵条件持续成立,然后执行完整的接触器切换动作序列,每两个动作之间还要有互锁延时,全部成功后才更新STATE。
4.2 加泵判断与完整动作序列
单台泵变频运行频率已经顶到上限附近,压力还差一点到设定值,这是加泵的信号。判断条件我常用两个参数同时满足:PID输出大于等于95%(换算成频率就是47.5Hz以上),并且这个状态持续30秒。加30秒延时的目的是过滤用水高峰的瞬时大流量,避免用户一开龙头就加泵、一关龙头就减泵的振荡。
确认加泵后,动作顺序不能乱:
- 给变频器发停车指令,等待3秒,确认变频器输出频率降为零;
- 断开当前泵的变频输出接触器KM1;
- 延时200毫秒,闭合当前泵的工频接触器KM3,当前泵转为工频全速运行;
- 延时500毫秒,闭合另一台泵的变频输出接触器KM2;
- 给变频器发运行指令,频率目标值由PID输出从0Hz开始缓升,另一台泵开始变频调速;
- 确认第二台泵频率大于15Hz后,更新STATE为对应的加泵状态。
这里每一步的延时和互锁都不能省。变频接触器和工频接触器如果同时闭合,相当于变频器输出端被短接到工频电网上,轻则炸接触器,重则烧变频器模块。我程序里不仅做软件互锁,还在接触器线圈回路加了硬件机械互锁,双重保险。
工频切换时电机的冲击电流是额定电流的5到7倍,如果单台泵电机超过7.5千瓦,建议工频回路加软启动器,或者在接触器上串联限流电阻。小功率电机直接工频启动问题不大,但变频接触器和工频接触器之间的距离、相序都要确认好,防止电机反转。
4.3 减泵判断与动作序列
减泵的判断条件是PID输出持续低于20%(频率低于10Hz)且压力高于设定值0.03MPa,同样保持30秒确认。这个条件说明用水量很小,一台泵低频运行就能满足。
减泵动作比加泵简单:
- 断开工频接触器KM3,工频泵停止;
- 变频泵继续运行,PID自动下调频率到低频率区间;
- 更新STATE为对应的单泵变频状态。
但减泵后管网压力会有短暂下降,因为工频泵退出的瞬间损失了一部分流量,变频泵还没来得及提频。这个压降一般1到3秒,幅度0.02到0.05MPa,用户能感觉到但不至于投诉。如果压降特别明显,说明减泵时机偏早,可以把减泵判定频率从20%再调低一点,让变频泵再多扛一会儿。
4.4 累计运行时间轮换
两台泵长期只让一台干活,另一台一直闲着,轴承、机械密封容易出问题。轮换逻辑按累计运行时间做:分别对两台泵的变频运行时间和工频运行时间做累计,当某台泵累计运行时间超过设定阈值(比如100小时),系统把“优先启动泵”标志切换到另一台。轮换动作只在停机状态或者减泵动作之后执行,绝不在用水高峰期做切换,否则用户端压力会有一个明显波动。
每次切换之后加一个最短运行时间限制,比如一套工况投入运行后至少保持30分钟不允许再次切换。这个限制能有效防止“加泵减泵来回振荡”的恶劣工况。
4.5 小流量睡眠唤醒
夜间用水量极小,变频泵在超低频下运行容易憋泵,电机发热、效率还低。解决办法是做睡眠唤醒逻辑:当PID输出连续低于10%(频率5Hz)且压力高于设定值0.05MPa,持续120秒,系统进入睡眠状态,变频器停车,靠管网压力罐维持压力。当压力降到设定值减0.05MPa,系统自动唤醒,变频器重新启动并恢复PID调节。
这个功能在小区供水里属于刚需,不加的话夜间每隔十几分钟泵就启停一次,噪音扰民、接触器和电机都遭罪。判断时间设120秒是为了滤掉瞬时用水,避免马桶冲一次水就把泵叫起来。
5. Smart触摸屏画面设计与运行参数的人机交互
5.1 连接方式与变量定义
Smart触摸屏和S7-200 SMART PLC通过网络或RS485连接。实际项目我推荐用网线连接,一来编程调试方便,二来画面数据刷新速度比485快,趋势曲线更流畅。在组态软件里定义连接后,直接通过变量表访问PLC的V区和M区,不需要额外写通讯协议代码,这是这套组合的明显优势。
变量定义要分清楚读写权限。运行状态、压力、频率、电流这类只读变量,在触摸屏里设成“只读”,防止误操作。设定压力、PID参数、切换阈值、轮换时间这类允许修改的变量,设成“可写”,同时一定做数据限幅。
5.2 画面功能分区
触摸屏画面我一般分四到五个页面。
主监控页放一个大大的压力表和实时趋势曲线,趋势曲线能看到最近几分钟的压力波动和频率变化,排查问题非常有用。旁边放两台泵的运行状态指示灯、当前频率、电流、累计运行时间。
参数设置页放设定压力、PID比例增益、积分时间、加泵阈值频率、减泵阈值频率、切换保持时间、轮换时间等参数。这一页要设置操作员权限密码,防止普通运维人员误改PID参数导致系统失稳。
手动操作页供调试使用,每个泵单独给“变频启动”“工频启动”“停止”按钮,并且用互锁逻辑保证在手动模式下不能同时给同一台泵发变频和工频指令。这个页面在自动模式下应该是灰色的,禁止操作。
报警页显示历史报警和当前报警,包括压力高限、压力低限、变频器通讯故障、变频器故障、泵过载、接触器故障等。每条报警带时间戳,方便事后追溯。
5.3 参数保护的双保险
HMI界面里做限幅只是第一层保护,PLC程序内部还要再做一次钳位。因为触摸屏通讯偶尔会异常,写操作可能被干扰成异常值。我在PLC里每次读取设定参数后,都用比较指令把超范围的值钳位到合法区间。比如设定压力被钳位在0.2到1.2MPa,PID增益钳位在0.1到10.0,这样即使HMI写入了错误数据,程序也不会执行疯狂输出。
频率目标值同样做钳位:下限15Hz,上限50Hz。下限15Hz防止水泵长期超低频运行不出水还憋泵,上限50Hz是电机额定频率,防止过速。这个钳位放在PID输出映射到频率之前,把任何异常路径都堵死。
5.4 报警联动处理
故障处理逻辑要分级。变频器通讯故障属于中级故障,PLC连续三次通讯超时后,立即停止对变频器的频率写入,但保留当前接触器状态,同时触发HMI报警。这时变频器会按照自身的通讯超时参数决定是继续运行还是停机。我一般把变频器通讯超时动作设为“按当前频率继续运行”,这样即使PLC突然死机,泵也不会立刻掉压。
变频器故障属于高级故障,PLC收到变频器故障码后,自动执行减泵或切泵:如果当前是单泵变频运行,立刻切到另一台泵变频启动;如果当前是加泵状态,则停掉故障泵的工频回路,另一台泵维持变频运行。压力高限报警时只报警不停机,但禁止加泵动作;压力低限报警持续30秒以上,才考虑切泵或者报故障。
6. 试运行阶段最容易翻车的三个故障现场
6.1 案例一:变频器通讯频繁中断
某次调试泵房设备,现象是HMI上频率显示偶尔正常,大部分时间显示通讯超时,频率写入经常失败。我一开始怀疑波特率或者站号设置不对,反复核对没发现问题。万用表量A/B电压也是正常的,后来把变频器参数面板调出来才发现,它的命令源和频率源被恢复成了面板控制,通讯使能参数压根没生效。重新设置参数并保存后,通讯立刻稳定。
这个案例的教训是:变频器上电后务必确认通讯相关参数已经保存,恢复出厂设置、参数初始化操作都会清掉通讯配置。而且有些变频器有两个参数组,一组是面板操作参数,一组是通讯操作参数,只改面板组不会生效。
6.2 案例二:切泵瞬间水压飞升到0.6MPa
另一套设备加泵后压力直接冲到0.6MPa以上,震荡了好几轮才稳定下来。最开始以为是PID参数太激进,把P从1.5降到0.5,效果依然很差。后来在线监控PID输出值,发现问题在切换时序:停车之后重新启动,PID输出从0开始,但由于停车期间积分项在持续累积,重启瞬间PID输出直接跳到96%,频率一下拉到48Hz,压力自然冲顶。
解决办法就是前面第3.4节说的:切泵动作开始时把PID切到手动模式并清零积分,变频器重新启动后再切回自动。这个改动做完,压力波动从0.15MPa降到0.02MPa,现场效果立竿见影。
6.3 案例三:夜间泵频繁启停
还有一套系统白天运行正常,一到后半夜就每隔十几分钟启停一次,住在泵房旁边的住户投诉噪音。原因是夜间用水量几乎为零,变频器低频运行又没法停机,压力在设定值附近小幅波动,PID不断调节频率,泵始终处于“低速运转但没完全停”的状态。
加了睡眠唤醒功能后问题解决:夜间当频率低于下限且压力高于设定值,延时120秒进入休眠,变频器停机;压力下降到唤醒值再启动。这样整夜泵只启停两三次,噪音投诉消失,电机也不再憋着低频转了。
6.4 一个实用调试小技巧
调试阶段我会在程序里给每个切换动作加一个次数计数器,加泵计数器、减泵计数器、轮换计数器各一个,HMI上一页专门显示这些数值。切换次数异常频繁,说明阈值设置不合理或者用水规律判断有问题;切换次数为零,说明很多逻辑分支根本就没跑过,程序可能隐藏着逻辑漏洞。这套方法在试运行阶段特别管用,能快速暴露状态机里那些平时看不到的边界条件。
我做过几套类似的一拖二恒压供水系统,体会最深的是:通讯链路只要按照极性、参数、字节序三步检查法去搭,基本不会有大问题;真正决定系统好用不好用的,是切泵时序和PID切换期间的干预逻辑。把状态机想清楚、把无扰切换做扎实,现场一次调试成功的概率就很高。最后再分享一个小习惯:正式交付前,把每台泵的变频运行时间、工频运行时间、累计启停次数、最近一次报警记录都记录到HMI的数据存储里,运行一个月后回访,你就能拿数据说话,判断这套逻辑是否适配这个小区的真实用水规律。