西门子PLC模拟量滤波程序西门子1200和1500通用有电压或者电流或者热电偶选择高低位和高高低低位报警有滤波功能非常实用的功能块配有详细的注释。车间里新来的电气工程师小李盯着示波器直挠头——温度信号跳得跟心电图似的十几个压力变送器的数值集体蹦迪。老师傅路过瞟了一眼模拟量不滤波等着半夜被报警吵醒吧西门子PLC模拟量滤波程序西门子1200和1500通用有电压或者电流或者热电偶选择高低位和高高低低位报警有滤波功能非常实用的功能块配有详细的注释。今天就给大家分享个实战中摸爬滚打出来的模拟量处理功能块在1200/1500上都验证过。先看功能全景支持4-20mA/0-10V/热电偶自由切换可调滞后滤波算法带高低限/高高-低低双阈值报警自动量程转换状态指示灯全开FUNCTION_BLOCK AnalogFilter VAR_INPUT RawValue : INT; // 原始AD值 SignalType : BYTE; // 信号类型 0:4-20mA 1:0-10V 2:TC FilterFactor : REAL : 0.2; // 滤波系数(0.1~0.9) ScaleMin : REAL; // 量程下限 ScaleMax : REAL; // 量程上限 HH_Limit : REAL; // 高高报警 H_Limit : REAL; // 高报警 L_Limit : REAL; // 低报警 LL_Limit : REAL; // 低低报警 END_VAR VAR_OUTPUT EngValue : REAL; // 工程值 HH_Alarm : BOOL; H_Alarm : BOOL; L_Alarm : BOOL; LL_Alarm : BOOL; SignalFault : BOOL; // 信号断线 END_VAR核心滤波算法用了一阶滞后滤波比移动平均省资源。注意REAL类型转换要放在滤波前// 量程转换 CASE SignalType OF 0: // 4-20mA转实际值 EngValueRaw : (INT_TO_REAL(RawValue)/27648.0)*(ScaleMax - ScaleMin) ScaleMin; 1: // 0-10V处理 EngValueRaw : (INT_TO_REAL(RawValue)/27648.0)*10.0; 2: // 热电偶需补偿冷端温度 EngValueRaw : TC_Compensation(RawValue); END_CASE; // 滞后滤波实现 EngValue : EngValue * (1 - FilterFactor) EngValueRaw * FilterFactor;报警逻辑处理有个坑——当启用双阈值时需要避免高低报警同时触发。这里用状态优先级解决// 报警优先级HH H L LL IF EngValue HH_Limit THEN HH_Alarm : TRUE; H_Alarm : FALSE; ELSIF EngValue H_Limit THEN H_Alarm : TRUE; L_Alarm : FALSE; ELSIF EngValue LL_Limit THEN LL_Alarm : TRUE; L_Alarm : FALSE; ELSIF EngValue L_Limit THEN L_Alarm : TRUE; ELSE HH_Alarm : FALSE; H_Alarm : FALSE; L_Alarm : FALSE; LL_Alarm : FALSE; END_IF;实际使用时给压力变送器配置参数这样写PressureFilter( RawValue : AI1.CHANNEL_VALUE, SignalType : 0, ScaleMin : 0.0, ScaleMax : 10.0, // 量程0-10MPa FilterFactor : 0.3, HH_Limit : 9.5, H_Limit : 8.8, L_Limit : 1.2, LL_Limit : 0.8 );记得在OB30循环中断里调用滤波效果更稳定。遇到信号跳变大的情况先检查接地和屏蔽——再好的软件滤波也救不了硬件干扰。调试时可在线修改FilterFactor观察曲线0.1是强滤波响应慢0.9基本不滤波。有个偷懒技巧把滤波后的值送到HMI的趋势图拖动系数看实时变化最直观。