1. 项目概述
在工业自动化控制系统中,模拟量信号的稳定性直接关系到整个控制回路的可靠性。作为一名在工业自动化领域摸爬滚打多年的工程师,我深知现场环境中模拟量信号受到的各种干扰有多令人头疼——传感器信号抖动、电磁干扰、线路老化等问题,常常导致控制系统误动作。今天要分享的这个"西门子PLC模拟量滤波防抖程序"功能块,正是我在多个大型项目中反复验证过的实战解决方案。
这个功能块的核心价值在于:它不仅仅是简单的软件滤波,而是融合了信号处理算法、工程实践经验和特定场景优化的复合型解决方案。与市面上常见的移动平均滤波或一阶滞后滤波相比,我们开发的这个功能块具有自适应阈值调整、动态响应补偿和异常值剔除三大特色功能,特别适合处理冶金、化工等恶劣工业环境下的模拟量信号。
2. 核心需求解析
2.1 工业现场的信号干扰现状
在真实的工业现场,模拟量信号主要面临三类典型干扰:
- 高频噪声:主要来自变频器、大功率设备启停等,表现为信号的高频小幅抖动
- 瞬时干扰:如继电器动作、雷电感应等造成的突发性尖峰
- 基线漂移:由于线路老化、接地不良导致的信号缓慢偏移
传统解决方案往往只针对某一种干扰设计,而我们的功能块采用三级处理架构:
- 第一级:基于滑动窗口的快速滤波(处理高频噪声)
- 第二级:基于变化率判别的尖峰抑制(消除瞬时干扰)
- 第三级:带死区的趋势跟踪(补偿基线漂移)
2.2 西门子PLC的特殊考量
在西门子S7-300/400/1500系列PLC上实现这个功能块时,需要特别注意:
- 扫描周期的影响:滤波算法必须与PLC的循环扫描机制协调
- 数据类型处理:西门子PLC对浮点数的特殊处理方式
- OB块调用时机:建议在OB35(循环中断组织块)中调用
3. 功能块详细实现
3.1 数据结构定义
pascal复制FUNCTION_BLOCK FB_AnalogFilter
VAR_INPUT
RawValue : REAL; // 原始输入值
Enable : BOOL := TRUE; // 功能使能
FilterTime : TIME := T#1S; // 滤波时间常数
DeadBand : REAL := 0.5; // 死区范围(%)
END_VAR
VAR_OUTPUT
FilteredValue : REAL; // 滤波后输出
SignalQuality : INT; // 信号质量评估(0-100)
END_VAR
VAR
Buffer : ARRAY[0..9] OF REAL; // 滑动窗口缓冲区
Index : INT := 0;
Trend : REAL := 0.0; // 趋势跟踪值
AlarmCounter : INT := 0;
END_VAR
3.2 核心算法实现
3.2.1 滑动窗口滤波
pascal复制// 更新滑动窗口
Buffer[Index] := RawValue;
Index := (Index + 1) MOD 10;
// 计算窗口平均值
Sum := 0.0;
FOR i := 0 TO 9 DO
Sum := Sum + Buffer[i];
END_FOR;
WindowAvg := Sum / 10.0;
3.2.2 变化率判别
pascal复制// 计算瞬时变化率
Rate := (RawValue - LastValue) / CycleTime;
IF ABS(Rate) > MaxAllowedRate THEN
// 判定为干扰尖峰,启用替代值
CurrentValue := LastValue + MaxAllowedRate * CycleTime * SIGN(Rate);
ELSE
CurrentValue := RawValue;
END_IF;
LastValue := CurrentValue;
3.2.3 趋势跟踪
pascal复制// 死区处理
IF ABS(CurrentValue - Trend) > (Span * DeadBand / 100.0) THEN
// 超出死区,更新趋势值
Trend := Trend + (CurrentValue - Trend) * FilterFactor;
END_IF;
FilteredValue := Trend;
4. 参数整定指南
4.1 关键参数说明
| 参数名 | 推荐范围 | 作用 | 调整原则 |
|---|---|---|---|
| FilterTime | 0.5s-5s | 决定滤波强度 | 干扰越大取值越大 |
| DeadBand | 0.1%-2% | 抗微小波动能力 | 信号越不稳定取值越大 |
| MaxAllowedRate | 10%-50%量程/s | 尖峰识别阈值 | 根据信号正常变化速度设定 |
4.2 现场调试步骤
-
初始参数设置:
- 先设置较大的FilterTime(如3s)和DeadBand(1%)
- MaxAllowedRate设为量程的20%/s
-
观察信号响应:
- 人为制造干扰,观察输出响应
- 使用西门子PLCSIM Advanced进行波形分析
-
逐步优化:
- 先调FilterTime至信号基本稳定
- 再调DeadBand消除微小波动
- 最后根据工艺要求调整MaxAllowedRate
5. 工程应用案例
5.1 钢铁厂温度信号处理
在某热轧生产线中,热电偶信号受到轧机振动和电磁干扰严重。应用本功能块后:
- 信号波动幅度从±15℃降低到±2℃
- 误报警次数从每小时20次降为0次
- 参数设置:FilterTime=2s, DeadBand=0.8%, MaxAllowedRate=30℃/s
5.2 化工厂压力监测
氯气储罐压力信号存在周期性泵送干扰。通过功能块的特殊处理:
- 保留了真实的压力波动趋势
- 滤除了泵送引起的周期性尖峰
- 采用动态DeadBand技术(根据压力变化率自动调整)
6. 常见问题排查
6.1 信号响应迟钝
可能原因:
- FilterTime设置过大
- DeadBand过宽
- 在错误的OB块中调用
解决方案:
- 逐步减小FilterTime直至响应速度满足要求
- 检查是否在OB35中调用(建议循环中断时间100ms)
6.2 滤波效果不佳
典型表现:
- 输出信号仍有明显抖动
- 无法滤除特定频率干扰
处理步骤:
- 使用Trace功能记录原始信号频谱
- 对于高频干扰,可增加Buffer大小(需修改程序)
- 对于周期性干扰,建议结合硬件滤波
7. 高级优化技巧
7.1 自适应参数调整
在实际应用中,我发现固定参数往往难以应对工况变化。通过以下改进可实现参数自整定:
pascal复制// 根据信号波动自动调整滤波强度
IF SignalStdev > Threshold THEN
ActualFilterTime := FilterTime * (1 + Kp * (SignalStdev - Threshold));
ELSE
ActualFilterTime := FilterTime;
END_IF;
7.2 信号质量评估算法
在输出参数中增加SignalQuality评估:
pascal复制// 计算信号可信度
SignalQuality := 100 - INT(LIMIT(0.0, SignalStdev / MaxStdev * 100.0, 100.0));
// 当质量过低时触发预警
IF SignalQuality < 30 THEN
AlarmCounter := AlarmCounter + 1;
IF AlarmCounter > 5 THEN
GenerateAlarm();
END_IF;
ELSE
AlarmCounter := 0;
END_IF;
8. 不同PLC型号的适配
8.1 S7-300/400系列注意事项
- 浮点运算性能有限,建议:
- Buffer大小不超过10
- 避免在单个扫描周期内进行复杂运算
- 使用SFC67/SFC68进行时间测量
8.2 S7-1500/TIA Portal优化
- 可利用SCL语言的新特性:
- 使用ARRAY[*]动态数组
- 采用优化的数学函数
- 支持更小的循环中断周期(最低1ms)
9. 性能测试数据
在CPU317-2PN/DP上的测试结果:
| 功能 | 执行时间(μs) | 内存占用(bytes) |
|---|---|---|
| 基本滤波 | 120 | 56 |
| 完整处理 | 450 | 112 |
| 带质量评估 | 520 | 128 |
重要提示:在资源紧张的系统中,建议关闭SignalQuality计算以节省资源
10. 扩展应用方向
这个功能块经过适当修改还可用于:
- 数字量输入防抖(修改为BOOL型处理)
- 电机电流监测(增加频率分析功能)
- 流量计信号处理(结合累计算法)
我在最近的一个水处理项目中,将其扩展为带温度补偿的流量计算功能块,成功解决了管道振动导致的流量计信号异常问题。关键修改点是增加了基于PLC系统时间的滑动平均处理和温度-流量特性曲线补偿。
