有个项目,S7-1200读一个4-20mA液位传感器,数值一直在上下跳,波动幅度超过10%。现场电工换了传感器、换了屏蔽线,问题照旧。最后我进PLC看了下模拟量输入模块的滤波设置——根本没配。
模拟量输入滤波是S7-1200里一个有但很少人注意的功能。今天把它讲清楚。
为什么要做模拟量滤波?
工业现场电磁干扰多,变频器启停、大电机运行都会在信号线上感应出噪声。如果PLC直接读原始值,你看上去就是一个忽大忽小的信号。液位这种变化慢的工艺参数,跳动10%根本没法用。
滤波的作用就是把这个噪声平滑掉,让数值稳定。代价是响应会慢一点——但对于液位、温度、压力这些变化不快的信号来说,完全没有影响。
S7-1200模拟量滤波在哪里设置?
路径:设备组态 → AI模块 → 属性 → AI测量通道 → 输入滤波器
注意:这个设置不是在每个通道属性里都有。S7-1200的模拟量模块SM1231、SM1234都支持,但早期的SM1231 V1.0固件不支持,需要确认模块固件版本。
设置项只有一个——滤波时间常数,单位毫秒。
滤波时间常数怎么选?
说白了,这个值决定了对信号变化的”敏感度”:
- 0ms(不滤波):原始值直接出来,反应最快但最跳。适合快速变化的信号,比如流量计脉冲
- 2.5ms-10ms:轻度滤波,适合振动监测等需要快速响应的场景
- 50ms-100ms:中档滤波,液位、压力信号通常用这个范围
- 300ms-1000ms:重度滤波,适合温度信号,变化本来就慢
我处理4-20mA液位信号,一般从50ms起步。如果还是跳再加到100ms。
实操案例:液位信号跳动处理
刚才说的那个项目,液位传感器量程0-5m,输出4-20mA,PLC里量程转换后正常显示范围0-5000mm。
没滤波时:数值在4200-4700mm之间乱跳,无法用于控制。
加50ms滤波后:数值稳定在4450±50mm,但偶尔还有小波动。
加200ms滤波后:数值稳定在4450±10mm,完全可用。
注意:加滤波后液位从0到满量程的阶跃响应时间大约3倍时间常数。200ms滤波下,从0变到满量程大约需要0.6秒。对液位控制来说,这个速度完全能接受。
程序里自己做滤波也可以
如果不想用硬件滤波(或者模块不支持),可以在程序里写一个简单的一阶低通滤波:
// 一阶低通滤波 // IN:原始模拟量值 // OUT:滤波后的值 // K:滤波系数(0-1),越小滤波越强 #temp_RawValue : Real; #temp_Filtered : Real; #temp_K : Real; // 从AI通道读取原始值(0-27648) #temp_RawValue := INT_TO_REAL(#RawInput); // 滤波系数:0.1表示强滤波,0.5表示弱滤波 #temp_K := 0.15; // 一阶低通滤波公式 #temp_Filtered := #temp_K * #temp_RawValue + (1.0 - #temp_K) * #temp_Filtered_Old; // 保存本次值给下次用 #temp_Filtered_Old := #temp_Filtered; // 输出到量程转换 #FilteredValue := #temp_Filtered;
K=0.15的效果大致相当于50-100ms的硬件滤波。如果你需要更平滑,把K降到0.05。
滤波不是万能的
滤波只能平滑噪声,不能消除噪声。如果信号跳得太厉害,先检查:
- 屏蔽线接地了没有(单端接地,别两头都接)
- 信号线和动力线分开了没有(至少间隔20cm)
- 传感器供电稳不稳(别和变频器共电源)
- AI模块和传感器共地了没有
我见过最离谱的一个项目,信号线和变频器输出线绑在同一根线槽里走的,加再大的滤波也没用。重新走线之后,不滤波都稳。
你们遇到过模拟量信号跳动的怪事吗?欢迎分享经验。