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

引言

在自动化控制系统中,采集到的原始模拟量往往会受到环境噪声或传感器精度的影响,导致测量值波动不稳定。为了获得更为平稳、可靠的信号输出,我们通常会对这些信号进行滤波处理。滤波是一种常见的信号处理技术,通过抑制不需要的高频噪声,保留有用的低频信号,从而提升系统的性能和精度。

本文将介绍一款基于 PLC 的模拟量输入滤波程序,通过一阶滞后滤波方法平滑输入信号,避免了高频噪声对系统的干扰。接下来,我们将详细分析程序代码,讲解其应用场景,并进行思考和总结。

1  程序代码

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

  • FUNCTION_BLOCK PM_AnalogInputFilter
  • VAR_INPUT   
  •         I_Input       : INT;           // 原始值映射输入   
  •         I_InputMin    : INT := 0;       // 原始值下限   
  •         I_InputMax    : INT := 27648;     // 原始值上限   
  •         I_ScaledMin   : REAL := 0;   // 比例值下限   
  •         I_ScaledMax   : REAL := 100;   // 比例值上限   
  •         I_Alpha       : REAL := 0.5;     // 滤波系数(0-1)
  • END_VAR
  • VAR_IN_OUT   
  •         IO_Filtered   : REAL;       // 按比例滤波输出
  • END_VAR
  • VAR_OUTPUT   
  •         O_Scaled      : REAL; // 未滤波输出值输出
  • END_VAR
  • VAR   
  •         LastFilter    : REAL; // 上一次的滤波值
  • END_VAR
  • // 模拟量转化的通用公式是:Ov=[(Osh-Osl)*(Iv-Isl)/(Ish-Isl)]+Osl
  • // 一阶滞后滤波
  • I_Alpha := LIMIT(0, I_Alpha, 1);  // 限制滤波系数范围在0到1之间
  • IF I_Input < I_InputMin THEN   
  •         O_Scaled := I_ScaledMin;  // 输入值低于最小值时,输出设为最小比例值
  • ELSIF I_Input > I_InputMax THEN   
  •         O_Scaled := I_ScaledMax;  // 输入值高于最大值时,输出设为最大比例值
  • ELSE   
  •         // 将原始输入值转换为比例值   
  •         O_Scaled := ((I_ScaledMax - I_ScaledMin) * (I_Input - I_InputMin) / (I_InputMax - I_InputMin)) + I_ScaledMin;    
  •         // 应用一阶滞后滤波器平滑信号   
  •         IO_Filtered := I_Alpha * O_Scaled + (1 - I_Alpha) * LastFilter;   
  •         LastFilter := IO_Filtered;  // 更新滤波后的值
  • END_IF;

2  代码解析

输入变量
I_Input 为原始输入值,它通常来源于传感器或其他外部设备。I_InputMin 和 I_InputMax 分别表示原始输入值的下限和上限,I_ScaledMin 和 I_ScaledMax 是输出值的比例范围。

滤波系数 (I_Alpha)
I_Alpha 控制滤波器的响应速度。值为 0 时表示完全不滤波,值为 1 时表示完全跟随当前输入。通常设置在 0 到 1 之间,值越大,滤波效果越强,但响应速度变慢。

滤波逻辑
程序首先检查输入值是否在设定的范围内,如果超出范围,将输出限定为最小或最大比例值。然后,程序将输入值按比例转换成一个新的输出值,并通过一阶滞后滤波器(即利用上次滤波值与当前输入进行加权平均)平滑输出信号。

输出变量
IO_Filtered 存储经过滤波后的输出信号。O_Scaled 是未经过滤波的输出信号,用于显示原始转换后的结果。

3  应用场景

这一程序在许多自动化系统中都有广泛的应用,特别是在以下几种场景中:

工业过程控制
在化工、冶金、食品加工等行业中,常常需要对来自传感器的模拟量信号进行处理。这些信号可能受到环境噪声或设备误差的影响,使用此程序可以有效去除噪声,提供更稳定的控制信号。

数据采集与监控系统
在数据采集系统中,为了确保数据的准确性和一致性,经常需要对模拟量输入信号进行滤波,减少因干扰带来的误差。

温度与压力监测
在温度或压力的监控系统中,传感器的数据可能会有波动。滤波算法能够帮助平滑这些波动,提高测量精度。

4  拓展思考

滤波系数的动态调整
在某些应用场景下,滤波系数 I_Alpha 可以根据系统的动态特性进行实时调整。例如,当系统变化较快时,可以适当减小滤波系数,以便更快速地响应变化;当系统稳定时,可以增大滤波系数,以减少噪声影响。

更高级的滤波方法
本文介绍的是一种简单的一阶滞后滤波器,在一些高精度要求的应用中,可能需要更为复杂的滤波算法,如卡尔曼滤波或低通滤波器。这些方法可以提供更好的滤波效果,尤其是在多噪声源干扰的环境中。

硬件优化
虽然软件滤波能够有效改善信号质量,但对于大规模系统,硬件滤波器的引入也可以显著降低系统的计算负担。硬件滤波器通常能提供更快的响应速度和更高的精度。

总结

模拟量输入信号的滤波处理在许多自动化控制系统中都是非常重要的一环。本程序通过简单的一阶滞后滤波算法,能够有效地去除输入信号中的高频噪声,提供更加平稳和可靠的输出。通过适当的参数调整,我们可以根据实际应用需求灵活地优化滤波效果。

滤波技术的深入应用不仅能提高系统的稳定性和可靠性,还能为自动化设备提供更精确的反馈,从而提升整体控制性能。随着技术的发展,未来的滤波方法将更加智能和高效,值得我们在实际应用中不断探索和完善。

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

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

图片

往期回顾

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

图片

2025年11月

Tags: