1. 西门子PLC模拟量滤波技术概述
在工业自动化控制系统中,西门子S7-1200和S7-1500系列PLC因其出色的性能和可靠性而广受欢迎。作为现场工程师,我们经常需要处理各种传感器采集的模拟量信号,这些信号在实际工业环境中往往会受到各种干扰。想象一下,当你正在监控一个关键的温度参数时,突然出现的干扰信号可能导致控制系统误判,轻则影响产品质量,重则可能引发安全事故。这就是为什么我们需要深入了解模拟量滤波技术。
模拟量滤波的本质是通过算法处理,去除信号中的噪声成分,保留真实的变化趋势。就像医生使用听诊器时,需要过滤掉环境杂音才能听清患者的心跳一样。在工业现场,电机启停、变频器工作、大功率设备切换等都会产生电磁干扰,这些干扰会叠加在有用的信号上,导致PLC读取的数值出现波动。
2. 一阶惯性滤波原理与实现
2.1 数学原理深度解析
一阶惯性滤波(First Order Lag Filter)本质上是一个低通滤波器,它的数学模型来源于电子电路中的RC滤波电路。其核心思想是:当前输出值是当前输入值与上一时刻输出值的加权平均。用公式表示为:
\[Y_n = α·X_n + (1-α)·Y_{n-1}\]
其中:
- \(Y_n\):当前滤波后的输出值
- \(X_n\):当前采样输入值
- \(Y_{n-1}\):上一时刻滤波输出值
- \(α\):滤波系数(0 < α ≤ 1)
这个公式的物理意义非常直观:α决定了新采样值对输出结果的影响程度。α越大,滤波器对输入变化的响应越快,但滤波效果越弱;α越小,滤波效果越强,但响应越迟缓。
提示:在实际工程中,α值通常需要根据信号特性和干扰情况现场调试确定。一般建议从0.1开始尝试,逐步调整。
2.2 SCL语言完整实现
下面给出一个完整的SCL函数块实现,可以直接在TIA Portal中使用:
scl复制FUNCTION_BLOCK "FB_FirstOrderFilter"
VERSION : 0.1
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : 'AutomationExpert'
FAMILY : 'Filter'
NAME : 'FirstOrder'
VAR_INPUT
InputValue : REAL; // 模拟量输入值
Alpha : REAL := 0.2; // 滤波系数,默认0.2
Reset : BOOL := FALSE; // 复位信号
END_VAR
VAR_OUTPUT
OutputValue : REAL; // 滤波后输出值
END_VAR
VAR
LastValue : REAL := 0.0; // 存储上一次的输出值
END_VAR
BEGIN
// 复位处理
IF Reset THEN
LastValue := 0.0;
OutputValue := 0.0;
RETURN;
END_IF;
// 一阶惯性滤波计算
OutputValue := Alpha * InputValue + (1 - Alpha) * LastValue;
// 更新历史值
LastValue := OutputValue;
END_FUNCTION_BLOCK
2.3 工程应用技巧
-
初始化处理:在实际应用中,建议在PLC启动时(OB100)对滤波器进行复位,避免使用未初始化的历史值。
-
采样周期匹配:滤波效果与PLC的循环扫描周期密切相关。如果程序扫描周期不固定,建议使用定时中断(如OB35)来保证固定的采样间隔。
-
参数调试方法:
- 首先将α设为1,观察原始信号特征
- 逐步减小α值,直到干扰被有效抑制,同时确保有用信号不被过度延迟
- 对于快速变化的信号(如流量),α建议在0.3-0.5
- 对于缓慢变化的信号(如温度),α建议在0.1-0.2
-
多通道处理:当需要处理多个模拟量通道时,可以为每个通道创建单独的滤波器实例,避免使用全局变量导致的数据混乱。
3. 蠕动平均值滤波技术详解
3.1 算法原理与窗口选择
蠕动平均值滤波(Moving Average Filter)通过维护一个固定长度的数据窗口,计算窗口内数据的算术平均值作为输出。其数学表达式为:
\[Y_n = \frac{1}{N}\sum_{i=n-N+1}^{n}X_i\]
其中N为窗口大小,这个参数的选择直接影响滤波效果:
- N值越大,滤波效果越好,但响应延迟也越大
- N值越小,响应越快,但滤波效果减弱
注意:窗口大小N一般选择奇数,便于处理。对于50Hz工频干扰,建议N选择10或20(对应采样周期10ms时正好覆盖1-2个工频周期)
3.2 优化实现方案
传统实现方式会带来较大的内存和计算开销,下面介绍一种优化的实现方法——环形缓冲区法:
scl复制FUNCTION_BLOCK "FB_MovingAverageFilter"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 输入值
WindowSize : INT := 5; // 窗口大小,默认5
Reset : BOOL := FALSE; // 复位信号
END_VAR
VAR_OUTPUT
OutputValue : REAL := 0.0; // 输出值
END_VAR
VAR
Buffer : ARRAY[0..49] OF REAL; // 环形缓冲区(最大支持50点)
Sum : REAL := 0.0; // 当前总和
Index : INT := 0; // 当前写入位置
Count : INT := 0; // 当前有效数据点数
END_VAR
BEGIN
// 复位处理
IF Reset THEN
Sum := 0.0;
Index := 0;
Count := 0;
OutputValue := 0.0;
RETURN;
END_IF;
// 更新总和:减去即将被覆盖的值(如果缓冲区已满)
IF Count >= WindowSize THEN
Sum := Sum - Buffer[(Index - WindowSize + 50) MOD 50];
ELSE
Count := Count + 1;
END_IF;
// 存储新值并更新总和
Buffer[Index] := InputValue;
Sum := Sum + InputValue;
// 更新索引(环形缓冲)
Index := (Index + 1) MOD 50;
// 计算平均值
IF Count > 0 THEN
OutputValue := Sum / Count;
ELSE
OutputValue := 0.0;
END_IF;
END_FUNCTION_BLOCK
这种实现方式相比传统方法有以下优势:
- 计算效率高:每次只需做一次加法和一次减法
- 内存占用固定:不受窗口大小影响
- 支持动态调整窗口大小
3.3 工程实践要点
-
初始填充问题:在滤波器刚开始工作时,缓冲区尚未填满,此时计算平均值时应注意除以实际数据点数而非窗口大小。
-
异常值处理:可以在存入缓冲区前增加限幅判断,避免明显异常值影响滤波效果。
-
数据类型选择:对于高精度要求的场合,建议使用LREAL(双精度浮点)类型,避免累加误差。
-
窗口大小动态调整:可以根据信号波动情况动态调整窗口大小,实现自适应滤波。
4. 中位值滤波技术深入剖析
4.1 算法原理与实现优化
中位值滤波(Median Filter)的核心思想是对一组采样值进行排序,取其中间值作为输出。这种算法对脉冲干扰有非常好的抑制效果,特别是那种突然出现又消失的尖峰干扰。
传统实现直接对数组排序,但实际工程中可以优化:
scl复制FUNCTION_BLOCK "FB_MedianFilter"
VERSION : 0.1
VAR_INPUT
InputValue : REAL; // 输入值
WindowSize : INT := 5; // 窗口大小(建议奇数)
Reset : BOOL := FALSE; // 复位信号
END_VAR
VAR_OUTPUT
OutputValue : REAL := 0.0; // 输出值
END_VAR
VAR
Buffer : ARRAY[0..20] OF REAL; // 采样缓冲区(最大支持21点)
Index : INT := 0; // 当前写入位置
Sorted : ARRAY[0..20] OF REAL; // 排序用数组
END_VAR
VAR_TEMP
i, j : INT;
Temp : REAL;
MedianPos : INT;
END_VAR
BEGIN
// 复位处理
IF Reset THEN
Index := 0;
OutputValue := 0.0;
RETURN;
END_IF;
// 存储新采样值(环形缓冲)
Buffer[Index] := InputValue;
Index := (Index + 1) MOD WindowSize;
// 复制到排序数组
FOR i := 0 TO WindowSize-1 DO
Sorted[i] := Buffer[(Index + i) MOD WindowSize];
END_FOR;
// 使用冒泡排序(小数组效率足够)
FOR i := 0 TO WindowSize-2 DO
FOR j := i+1 TO WindowSize-1 DO
IF Sorted[i] > Sorted[j] THEN
Temp := Sorted[i];
Sorted[i] := Sorted[j];
Sorted[j] := Temp;
END_IF;
END_FOR;
END_FOR;
// 取中位值
MedianPos := WindowSize / 2; // 整数除法自动取整
OutputValue := Sorted[MedianPos];
END_FUNCTION_BLOCK
4.2 性能优化技巧
-
窗口大小选择:通常3-7点即可获得良好效果,过大窗口会增加计算负担且可能导致信号失真。
-
排序算法优化:对于固定小窗口(如5点),可以硬编码比较逻辑,避免循环开销。
-
组合滤波:可以先进行中位值滤波去除尖峰,再进行蠕动平均或一阶滤波平滑信号。
-
采样策略:对于快速变化的信号,可以采用"采样-保持"方式,确保一个窗口内的数据时间分布均匀。
4.3 特殊场景处理
-
偶数窗口处理:当必须使用偶数窗口时,可以取中间两个值的平均值作为输出。
-
重复值处理:当中间位置有多个相同值时,无需特殊处理,直接取用即可。
-
初始阶段处理:在缓冲区未填满时,可以临时减小有效窗口大小,或使用当前所有数据的中间值。
5. 滤波算法选型指南与实战经验
5.1 算法对比与选型建议
| 滤波算法 | 最佳应用场景 | 优点 | 缺点 | 推荐参数 |
|---|---|---|---|---|
| 一阶惯性滤波 | 高频噪声、一般性干扰 | 计算量小,响应快 | 对脉冲干扰抑制差 | α=0.1~0.3 |
| 蠕动平均值滤波 | 周期性干扰(如工频干扰) | 对周期性干扰抑制好 | 内存占用大,响应延迟大 | N=5~20(根据干扰频率) |
| 中位值滤波 | 脉冲干扰、瞬时尖峰 | 对突发干扰抑制好 | 计算量较大,常规噪声抑制一般 | N=3~7 |
5.2 组合滤波策略
在实际工程中,单一滤波算法往往难以满足所有需求,这时可以采用组合滤波策略:
-
中位值+平均值滤波:先通过中位值滤波去除明显尖峰,再用平均值滤波平滑信号。
-
多级惯性滤波:采用两个串联的一阶惯性滤波,相当于二阶滤波,可以获得更好的高频抑制效果。
-
自适应滤波:根据信号波动程度动态调整滤波参数,如当检测到大波动时自动减小α值或增大窗口。
5.3 常见问题排查
-
信号响应迟钝:
- 检查一阶滤波的α值是否过小
- 检查平均值滤波的窗口是否过大
- 确认采样周期是否合理
-
滤波效果不佳:
- 确认干扰类型是否与滤波算法匹配
- 检查模拟量接线是否规范(双绞线、屏蔽层单端接地)
- 确认PLC模拟量模块的滤波设置是否冲突
-
数据跳变异常:
- 检查变量初始化是否正确
- 确认缓冲区索引处理是否正确
- 检查是否有除零风险
5.4 高级应用技巧
-
死区处理:对于在某个阈值附近波动的信号,可以设置死区,只有当变化超过阈值时才更新输出,避免微小波动。
-
变化率限制:对信号的变化率进行限制,避免突变,特别适用于保护性控制。
-
数字信号验证:结合数字量输入状态验证模拟量信号的合理性,如电机停止时流量计读数应为零。
-
故障自诊断:通过分析滤波前后信号的关系,自动判断传感器是否故障,如信号长时间不变或突变超出合理范围。
在实际项目中,我通常会先使用在线趋势图观察原始信号特征,然后选择合适的滤波算法和参数。调试时可以先将滤波结果和原始信号同时显示,直观对比滤波效果。记住,滤波算法只能改善信号质量,不能替代良好的硬件设计和规范的布线施工。对于特别恶劣的电磁环境,还需要考虑增加信号隔离器、磁环等硬件措施。