Skip to main content

引言

在许多工业控制和自动化应用中,原始信号往往受到噪声干扰或其他因素的影响,需要通过滤波器进行处理以提取有用信息。然而,传统的滤波器在面对信号变化时,可能无法灵活调整其参数,从而导致响应迟缓或过度平滑。为了解决这一问题,本文介绍了一种自适应滤波器FB_AdaptiveFilter),它能够根据信号变化率动态调整滤波系数,平衡响应速度与滤波效果。

通过该滤波器,可以在信号变化剧烈时提供快速响应,而在信号变化较平缓时,则进行平滑滤波,以提高信号的稳定性。此功能块非常适合用于动态系统的信号处理,尤其是在需要实时调整滤波参数的场景中。


 

1

   

程序代码及介绍

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):


FUNCTION_BLOCK FB_AdaptiveFilter
VAR_INPUT
    RawValue : REAL;               // 原始值
    MaxChangeRate : REAL := 10.0;  // 最大变化率(单位/秒)
    SampleTime : TIME := T#100ms;  // 采样时间
END_VAR
VAR_OUTPUT
    FilteredValue : REAL;          // 滤波后值
    FilterFactor : REAL;           // 当前滤波系数
END_VAR
VAR
    Timer : TON;
    LastRawValue : REAL;
    ChangeRate : REAL;
    AdaptiveFactor : REAL;
END_VAR
// 功能说明:根据信号变化自动调整滤波参数,以平衡响应速度和滤波效果。
// 定时采样
Timer(IN := TRUE, PT := SampleTime);
a := TIME_TO_REAL(SampleTime);
IF Timer.Q THEN
    // 计算变化率
    ChangeRate := ABS(RawValue - LastRawValue) / (TIME_TO_REAL(SampleTime) / 1000);
    // 根据变化率自适应调整滤波系数
    IF ChangeRate > MaxChangeRate THEN
        // 变化剧烈,使用小滤波系数(快速响应)
        AdaptiveFactor := 0.1;
    ELSE
        // 变化平缓,使用大滤波系数(平滑滤波)
        AdaptiveFactor := 0.01 + (0.1 - 0.01) * (ChangeRate / MaxChangeRate);
    END_IF
    // 应用一阶低通滤波
    FilteredValue := FilteredValue + AdaptiveFactor * (RawValue - FilteredValue);
    FilterFactor := AdaptiveFactor;
    LastRawValue := RawValue;
    Timer(IN := FALSE);
END_IF

 

2

   

程序介绍

输入变量

  • RawValue:原始信号值,即待处理的输入数据。

  • MaxChangeRate:最大允许的信号变化率(单位:单位/秒),它决定了信号变化的灵敏度。

  • SampleTime:滤波器的采样时间,决定了数据采样的频率。

输出变量

  • FilteredValue:经过滤波器处理后的信号值,它代表着滤波后的结果。

  • FilterFactor:当前使用的滤波系数,指示了滤波器的灵敏度。

内部变量

  • Timer:定时器,用于控制采样间隔。

  • LastRawValue:上次的原始信号值,用于计算信号变化率。

  • ChangeRate:信号的变化率(单位:单位/秒)。

  • AdaptiveFactor:自适应滤波系数,根据信号变化动态调整。

功能说明

定时采样:定时器每隔SampleTime时间进行一次采样,从而计算当前信号与上次信号的差值。

变化率计算:计算原始信号值的变化率,即当前信号与上次信号值之间的差异。

滤波系数自适应调整

  • 如果信号变化率大于设定的MaxChangeRate,则采用较小的滤波系数(0.1),以便快速响应。

  • 如果信号变化平缓,则采用较大的滤波系数(范围从 0.01 到 0.1),以便平滑滤波,减少噪声。

一阶低通滤波:使用自适应滤波系数对信号进行滤波,减小噪声并平滑信号,同时保持一定的响应速度。

输出结果:输出滤波后的值FilteredValue和当前滤波系数FilterFactor


 

3

   

应用场景

动态信号处理:在一些工业控制系统中,信号可能会受到不同程度的噪声或干扰,FB_AdaptiveFilter能够自适应调整滤波参数,在快速变化的环境中提供及时的响应,同时在稳定环境中进行平滑滤波,确保信号的质量。

传感器数据处理:在传感器数据采集过程中,可能会遇到剧烈变化的信号,例如温度、压力等参数的突发波动,利用此滤波器可以平滑这些波动,使得数据更具可用性。

机器人控制:在机器人或自动化设备中,传感器信号常常包含噪声,通过自适应滤波器可以去除不必要的噪声,提高系统的控制精度。

医学仪器:医学监测设备(如心电图、血压监测等)往往需要平滑处理信号,以提高测量结果的准确性和稳定性,此功能块可以在这些设备中应用。


 

4

   

拓展思考

自适应控制系统:除了在滤波器中动态调整滤波系数外,可以进一步扩展此功能块,使其在更复杂的控制系统中动态调整多个控制参数(如 PID 控制中的比例、积分、微分系数)。

滤波算法的多样化:可以结合其他滤波算法(如卡尔曼滤波、加权平均滤波等)进行组合,以应对更加复杂的信号变化模式。

多级滤波:根据不同的变化率,可以设定多个不同级别的滤波策略,从而进一步优化信号处理效果。


 

总结

FB_AdaptiveFilter功能块通过自适应调整滤波系数,能够在信号变化剧烈时快速响应,在变化平缓时进行平滑滤波,平衡了响应速度和滤波效果。该功能块在需要实时处理动态信号的系统中,提供了灵活的解决方案。未来可以在此基础上进行更多的拓展,使其适用于更加复杂的应用场景,进一步提升自动化系统的性能与可靠性。

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾


 

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

每周一个编程小例子:自定义循环执行控制程序

每周一个编程小例子:步进控制功能块

每周一个编程小例子:PLC 权重比例分配器

每周一个编程小例子:数字量输入组监控

每周一个编程小例子:实时数据分析

每周一个编程小例子:PLC 多轴同步控制的理解与应用

每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)

每周一个编程小例子:模拟量信号报警

每周一个编程小例子:组合数概率的实现

每周一个编程小例子:多传感器信号融合与优化方案

每周一个编程小例子:监控模拟信号的健康状态

每周一个编程小例子:PLC 程序实现模拟信号的线性校准

每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序

每周一个编程小例子:使用 PLC 程序让灯光呼吸

图片

2026年4月

Tags