水塔水位西门子S7-1200PLC和MCGS7.7联机程序博途V16,带io表和注释,V20变频器接线说明
水塔水位控制是工业自动化中常见的应用场景,今天咱们聊聊如何用西门子S7-1200 PLC和MCGS7.7触摸屏搭个联机控制系统。实际项目中遇到过水位传感器信号跳变的问题,最后用了个简单的滤波程序搞定,这事儿后面细说。
硬件配置这块,S7-1200 CPU选的是1214C DC/DC/DC款,数字量输入用了I0.0-I0.3接水位浮球开关,Q0.0控制水泵启停。V20变频器的模拟量输出接PLC的AI0,用来读取频率反馈。IO表大概长这样:
//----数字量输入----
I0.0 低水位开关
I0.1 高水位开关
I0.2 急停按钮
//----模拟量输入----
AI0 变频器频率反馈(4-20mA)
//----数字量输出----
Q0.0 水泵接触器
Q0.1 变频器运行信号
PLC程序里最核心的是自动控制逻辑。在博途V16里建个FB块,关键代码如下:

NETWORK 1: 手动/自动模式切换
A "HMI_ManualMode" //触摸屏手动模式信号
JNB _001
L "HMI_ManualOutput" //直接取手动设定值
T "Pump_Cmd"
JU _002
001: L "AutoOutput" //自动模式输出
T "Pump_Cmd"
_002: NOP 0
这段切换逻辑有个坑要注意------手动模式切换时要做好输出无扰切换,要不然水泵会突跳。之前现场调试时就因为没做斜坡处理,把机械密封给冲坏了。
变频器控制部分用的是MODBUS RTU协议,西门子这个CM1241模块配置参数时,记得把报文间隔时间设成大于100ms。调试时用下面的指令抓包发现丢帧,后来改到150ms就稳了:
MBMASTERDB(REQ:=TRUE,
MB_MODE:=0,

MBDATAADR:=P#DB3.DBX0.0 BYTE 8,
MBDATALEN:=8);
触摸屏这边用MCGS7.7做了个双水位指示动画,把PLC里的实数变量"WaterLevel"绑定到进度条控件。有个小技巧是把水位量程转换成百分比时,用线性标定公式做了个死区补偿,防止浮球开关抖动:
WaterLevelPercent = (RawValue - 500) * 0.1;
if(WaterLevelPercent <0) WaterLevelPercent=0;
if(WaterLevelPercent >100) WaterLevelPercent=100;
说到V20变频器接线,DI1端子接PLC的Q0.1,模拟量输出AO1的+端接PLC AI0+,别忘了在变频器参数里把P0771设成27(输出实际频率)。电源端子U1/V1/W1接水泵电机时,一定要先确认电机铭牌上的额定电流,有次新手同事接错线导致变频器炸机,那味道现在还记得...
调试过程中发现个有意思的现象:当水位接近设定值时,PID调节输出会频繁波动。后来在程序里加了带死区的PID算法,当偏差小于5%时不调节,直接让变频器保持当前频率,效果立竿见影。具体实现是在PID指令前加了个比较块:
A "WaterLevel_Error"
L 5.0
>R
= "PID_Enable"
这套系统跑起来后,最直观的感受是触摸屏上的历史曲线功能真香,能清楚看到早中晚三个用水高峰期的水位波动规律。有次夜班水位异常下降,就是靠曲线记录抓到是哪个熊孩子把进水阀给关了。

最后说下接地------PLC柜、变频器、传感器必须共地!之前省事没接,结果模拟量信号时不时抽风,用万用表量出1.2V的共模电压,接地后马上正常。这血泪教训值两包华子钱,各位同行切记。