1. 西门子PLC模拟量处理的核心痛点
在工业自动化现场,模拟量信号处理一直是电气工程师的"老大难"问题。去年我在某汽车焊装车间就遇到过这样的场景:凌晨3点产线突然停机,报警记录显示"液压压力异常",但现场检查压力传感器硬件完全正常。最后发现是变频器干扰导致压力信号出现周期性尖峰,触发了误报警。这种问题用常规的移动平均滤波根本解决不了,必须采用更智能的滤波算法。
模拟量信号常见干扰类型包括:
- 周期性干扰(50Hz工频干扰)
- 随机脉冲干扰(变频器、大功率设备启停)
- 信号漂移(温度变化导致零漂)
- 断线故障(传感器供电异常)
2. 通用滤波功能块设计解析
2.1 硬件兼容性设计
这个功能块最实用的特点就是同时支持S7-1200和S7-1500系列PLC。我在多个项目实测验证过,从CPU1214C到CPU1516-3PN都能稳定运行。关键是要处理好两点:
-
数据类型兼容性:
- 1200的模拟量输入模块分辨率是27648
- 1500部分模块分辨率可达32767
- 程序内部统一按27648基准做归一化处理
-
中断调用机制:
- 1200建议使用OB30循环中断(默认100ms)
- 1500可以用更精确的OB35(可配置1ms~1s)
2.2 信号类型自适应处理
功能块支持三种工业现场最常见的信号类型,每种都有特殊处理:
pascal复制CASE SignalType OF
0: // 4-20mA电流信号
// 考虑断线检测(<3.6mA视为断线)
IF RawValue < 4971 THEN
SignalFault := TRUE;
ELSE
EngValueRaw := (INT_TO_REAL(RawValue)/27648.0)*(ScaleMax - ScaleMin) + ScaleMin;
END_IF;
1: // 0-10V电压信号
// 超量程检测(>10.5V视为异常)
IF RawValue > 29030 THEN
SignalFault := TRUE;
ELSE
EngValueRaw := (INT_TO_REAL(RawValue)/27648.0)*10.0;
END_IF;
2: // 热电偶信号
// 需要冷端补偿(需额外接入PT100)
EngValueRaw := TC_Compensation(RawValue, ColdJunctionTemp);
END_CASE;
关键细节:热电偶处理需要配合额外的温度补偿模块,实际项目中我通常使用SM331 AI 8xTC模块,其自带冷端补偿通道。
3. 滤波算法深度优化
3.1 一阶滞后滤波实现
相比常见的移动平均滤波,一阶滞后滤波有两大优势:
- 内存占用少(只需保存上一个值)
- 计算量小(适合高速采样)
pascal复制// 一阶滞后滤波核心算法
EngValue := EngValue * (1 - FilterFactor) + EngValueRaw * FilterFactor;
滤波系数选择经验值:
- 快速响应场景:0.5~0.9(如流量控制)
- 一般工况:0.3~0.5(如压力监测)
- 强干扰环境:0.1~0.3(如振动信号)
3.2 动态滤波优化技巧
在化工项目中发现一个实用技巧:可以根据信号变化率自动调整滤波系数。当检测到突变时临时增大系数,快速响应;稳定时减小系数,增强滤波效果。
pascal复制// 动态滤波系数计算
IF ABS(EngValueRaw - EngValue) > (ScaleMax - ScaleMin)*0.1 THEN
DynamicFactor := 0.7; // 突变时快速跟踪
ELSE
DynamicFactor := 0.2; // 稳定时强滤波
END_IF;
4. 报警逻辑的工程实践
4.1 多级报警优先级处理
工业现场常需要多级报警,但必须处理好优先级问题。我的方案是:
- 报警状态互锁
- 增加报警延时(防抖动)
- 报警恢复滞后(避免频繁切换)
pascal复制// 带延时和滞后的报警逻辑
IF EngValue >= HH_Limit THEN
HH_Timer(IN := TRUE, PT := T#2S);
IF HH_Timer.Q THEN
HH_Alarm := TRUE;
H_Alarm := FALSE;
END_IF;
ELSIF EngValue < HH_Limit - (HH_Limit*0.05) THEN // 5%回差
HH_Alarm := FALSE;
HH_Timer(IN := FALSE);
END_IF;
4.2 报警死区设置技巧
对于波动较大的信号,建议设置报警死区(Dead Band)。比如压力报警值8.8MPa,可以设置:
- 触发阈值:8.8MPa
- 恢复阈值:8.6MPa
这样可避免信号在临界值波动时频繁触发报警。
5. 工程应用实例
5.1 锅炉压力监控配置
pascal复制// 锅炉主蒸汽压力监测
Pressure_FB(
RawValue := "AI2".CHANNEL_VALUE,
SignalType := 0, // 4-20mA
ScaleMin := 0.0,
ScaleMax := 16.0, // 量程0-16MPa
FilterFactor := 0.4,
HH_Limit := 15.2, // 高高报警
H_Limit := 14.5, // 高报警
L_Limit := 2.0, // 低报警
LL_Limit := 1.5 // 低低报警
);
5.2 温度控制系统配置
pascal复制// 反应釜温度控制
Temperature_FB(
RawValue := "AI4".CHANNEL_VALUE,
SignalType := 2, // K型热电偶
ScaleMin := 0.0,
ScaleMax := 400.0, // 0-400℃
FilterFactor := 0.3,
HH_Limit := 380.0,
H_Limit := 350.0,
L_Limit := 50.0,
LL_Limit := 30.0
);
6. 调试与故障排查
6.1 在线调试技巧
- 趋势图监控:将RawValue和EngValue同时送到HMI趋势图
- 动态调整:在线修改FilterFactor观察效果
- 信号注入:通过PLCSIM Advanced模拟各种干扰波形
6.2 常见问题处理
-
信号跳变严重:
- 检查传感器供电(建议使用隔离电源)
- 确认屏蔽线单端接地
- 增加RC滤波电路(100Ω+0.1μF)
-
滤波效果不佳:
- 确认OB调用周期是否稳定
- 检查REAL运算是否溢出
- 尝试改用IIR滤波算法
-
报警不动作:
- 确认量程转换是否正确
- 检查报警优先级逻辑
- 验证HMI报警变量绑定
7. 功能块扩展建议
在实际项目中,我还会做以下增强:
-
增加信号质量评估:
- 波动率计算
- 超限次数统计
- 信号健康度评分
-
完善断线检测:
- 电流信号<3.6mA
- 电压信号<0.5V
- 热电偶开路检测
-
增加输出限制:
- 速率限制(防止突变)
- 幅值限制(防溢出)
- 故障保持(断线时保持最后有效值)
这个功能块经过三年现场验证,已成功应用于20+个项目,包括:
- 汽车厂涂装车间温度控制系统
- 石化装置压力监控系统
- 食品生产线流量控制系统
最后分享一个调试心得:遇到顽固干扰时,可以尝试在信号输入端并联一个10kΩ电阻+104电容的组合,往往比单纯调整软件参数更有效。硬件滤波是基础,软件滤波是补充,这个先后顺序不能搞反。