在自动化产线上摸爬滚打多年的工程师都清楚,模拟量信号就像个娇气的"大小姐"——热电偶的毫伏信号动不动就漂移,4-20mA电流信号常带着工频干扰,连最稳定的0-10V电压信号也免不了被变频器谐波污染。去年我在某汽车焊装车间就遇到过这样的案例:机器人抓取位置的压力传感器信号波动导致误判,每200件产品就会出现1-2次异常停机。
传统解决方案往往要动用硬件滤波器或外置信号调理模块,不仅增加BOM成本,更麻烦的是参数固化后无法在线调整。而西门子S7-1200/1500系列PLC自带的模拟量模块虽然提供了基础滤波功能,但面对如下场景时就显得力不从心:
程序核心采用FB(功能块)封装,通过输入参数"iSignalType"选择处理模式:
pascal复制CASE #iSignalType OF
0: // 0-10V电压
#rRawValue := NORM_X(MIN := 0.0, MAX := 10.0, VALUE := #iRawInput);
1: // 4-20mA电流
#rRawValue := NORM_X(MIN := 4.0, MAX := 20.0, VALUE := #iRawInput);
2: // K型热电偶
#rRawValue := SCALE_X(MAX := 1200.0, VALUE := TC_K(#iRawInput));
END_CASE;
关键技巧:热电偶处理要特别注意冷端补偿,建议在模块属性中启用"Enable_CJC"选项
采用二阶IIR滤波器实现,其差分方程为:
code复制y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2]
通过"rFilterFactor"参数(0.0~1.0)动态控制截止频率:
pascal复制#rFiltered := #rFilterFactor * (#rRawValue - #rLastOutput) + #rLastOutput;
#rLastOutput := #rFiltered;
实测表明,当滤波系数设为0.3时,对50Hz工频干扰的衰减可达-40dB。
在FB中集成以下诊断逻辑:
pascal复制IF ABS(#rRawValue - #rRedundantValue) > #rTolerance THEN
#iQuality := 16#8000; // 设置质量码为"Bad"
#bAlarm := TRUE;
END_IF;
通过"bHoldLastValue"参数选择滤波异常时的处理策略:
某注塑机温控系统出现周期性波动,频谱分析显示干扰峰值在2.5kHz(变频器载频)。通过以下步骤解决:
血泪教训:务必在硬件配置中将模拟量模块的"积分时间"设为20ms的整数倍,否则会引入附加相移!
原方案采用固定阈值判断,在加热炉启停阶段频繁误报。改进措施:
pascal复制// 动态阈值算法
#rDynamicThreshold := #rHeatingRate * 0.5 + 1.0;
IF (#rRateOfChange > #rDynamicThreshold) AND (#bHeatingPhase = FALSE) THEN
#bBrokenWire := TRUE;
END_IF;
建议创建以下用户数据类型:
pascal复制TYPE "AnalogSignal_UDT"
STRUCT
rRawValue : REAL;
rFiltered : REAL;
iQuality : WORD;
bAlarm : BOOL;
END_STRUCT;
END_TYPE
在S7-1516F CPU上测试(OB35周期10ms):
| 功能模块 | 执行时间(μs) | 内存占用(B) |
|---|---|---|
| 基础滤波 | 28 | 120 |
| 带冗余校验 | 42 | 184 |
| 全功能版本 | 67 | 256 |
对于超过100个模拟量点的项目,建议:
经过三年现场验证,这套滤波程序已成功应用于:
最让我自豪的是在某半导体厂的项目中,仅通过软件滤波改造就帮助客户省去了37台硬件滤波器,年节约维护成本超80万元。这再次证明:好的程序不仅要解决技术问题,更要创造商业价值。