基于博途SCL 语言的平均值滤波算法分析

2022-04-28 00:23张明珠
电声技术 2022年3期
关键词:模拟量干扰信号赋值

吴 凯,张明珠

(上海齐耀螺杆机械有限公司,上海 201100)

0 引言

滤波是从含有干扰的接收信号中提取有用信号的一种技术。干扰信号在工程中一般可以分为两种:一种是随机性的脉冲,此种干扰毫无规律性可言;另一种包含周期性的干扰信号。两种干扰信号的波形分别如图1 和图2 所示[1]。

图1 随机脉冲干扰信号

图2 周期性干扰信号

针对上述两种不同的干扰信号,工程上一般会设计不一样的滤波算法进行滤波。滤波算法也称滤波器,一般分为模拟滤波器和数字滤波器两种。模拟滤波器的滤波过程如图3 所示。模拟滤波器一般采用由电子元件搭建的电路进行滤波。模拟信号经过模拟滤波器后再进入A/D 转换环节转换为数字信号,滤波在A/D 转换之前就完成了。针对不同的干扰信号,需要设计不同的滤波电路[2]。

图3 模拟滤波过程

数字滤波器的滤波过程如图4 所示,因为其滤波过程在A/D 转换以后进行,所以其相对于模拟滤波器来说更加灵活,只需要改变不一样的算法就可处理不同的干扰信号。工程中常用的滤波算法有算术平均滤波法、加权平均滤波法、中位值平均滤波法以及限幅滤波法。本文主要介绍平均值滤波法,其主要用来消除周期性的干扰信号。

图4 数字滤波过程

1 中位值平均滤波算法分析

博图平台内处理的模拟量原始数据来源可以是模拟量模块的输入、网络传输的数据以及内部程序块二次处理的输出。平均值滤波是对一组数据求平均值,在可编程逻辑控制器(Programmable Logic Controller,PLC)中以窗口的形式来处理数据。先在PLC 中定义窗口值大小,软件按照窗口值定义数组,针对这一组数据进行处理。数据窗口值的处理方式又分为固定窗口和滑动窗口两种[3]。

1.1 固定窗口处理

固定窗口处理中,数据按照扫描周期依次填满整个窗口,当窗口满时,对窗口内的数据求取平均值。之后抛弃整组数据,重新开始填满窗口,直至窗口再次充满,再求平均值。

对于固定窗口来讲,第一组求平均的数据和第二组的数据在时间上是完全不同的两组数据,每组数据都不包含之前的信息。在程序执行上,求取平均值不是每周期执行的,而是每n周期执行一次,n是设置的窗口值。如图5 所示,每5 个周期存满一组数据,求取一次平均值。当窗口值比较大,会产生比较大的滞后。

图5 固定窗口处理

1.2 滑动窗口处理

滑动窗口处理中,数据充满窗口后求取平均值,再有新数据进入时窗口向右滑动,舍弃最旧的数据,加入最新的数据,再求取平均值。对于滑动窗口,当窗口充满之后,每次加入新数据舍弃最旧的数据,每个周期都会求取平均值。在PLC 中,当窗口被充满,新的数据会覆盖最初的数据,形成一个环形的数据队列,如图6 所示。

图6 滑动窗口处理

针对滑动窗口优化后的环形队列的数据存储算法如图7 所示。

图7 环形窗口

此方式定义头指针和尾指针两个指针。头指针初始化为-1,尾指针初始化为0。

第一个周期,数据写入尾指针指向的元素0,然后尾指针后移,将头指针赋值为0 指向第一个元素;

第二个周期,数据写入尾指针指向的元素1,然后尾指针后移,头指针不变;

第三个周期,数据写入尾指针指向的元素2,然后尾指针后移,头指针不变;

第四个周期,数据写入尾指针指向的元素3,然后尾指针后移,头指针不变;

第五个周期,数据写入尾指针指向的元素4,然后尾指针移到第一个元素0,头指针与尾指针重合,这时候通过尾指针等于头指针,以此判断缓冲区满,完成判断后头指针移动到元素1 的位置;

第六个周期,数据写入尾指针指向的元素0,然后尾指针移动到第一个元素1,此时判断尾指针和头指针相等,缓存区满,判断完成后,头指针移动到元素2 的位置。

以上为滑动窗口的数据处理方式,可以使用尾指针等于头指针来判断队列是否已满。

1.3 平均值滤波算法

当缓存区满后,开始对窗口内的数据进行求平均值操作。本文采用去掉最大值和最小值,再对剩余的数求平均值的方法。对应的公式为:平均值=(窗口值总和-窗口最大值-窗口最小值)/(窗口尺寸大小-2)。

考虑到此算法的通用性和可移植性,可以在博途软件中建立一个FB 函数块。调用这个FB 块时,不用再修改这个FB 内部的程序代码,只需要给此FB 的输入输出接口赋予实参即可[4]。

首先,可以在FB 的静态变量存储区STATIC中定义一个数组ARRAY 用来存储缓存的数据,将缓存区数据中的最大值、最小值也在静态变量缓存区STATIC 中进行定义,并将最大值以及最小值初始化为数组ARRAY 中的第一个值ARRAY[0]。随着时间的推移,缓存区存储的数据会趋向于一个稳定的值,因此可以将第一个存储进ARRAY 的数值定义为临时的最大最小值,之后使用一个FOR循环来确认数组ARRAY 中实际的最大最小值以及对所有窗口值求和。在FOR 循环过程中,如果ARRAY[i]比定义的临时最小值ARRAY[0]小,就将ARRAY[i]赋值给最小值;如果ARRAY[i]比定义的临时最大值ARRAY[0]大,就将ARRAY[i]赋值给最大值。其次,通过累加运算对缓存区的所有值进行求和,最后按照公式可以求出平均值的大小。

2 博图V15 平台下算法的仿真及实现

以下以西门子博途V16 软件为例介绍模拟量滤波功能数据块的实现。模拟量滤波功能数据块接口定义如表1 所示。

表1 FB 接口数据定义表

2.1 初始化及复位程序处理

初始化及复位程序处理部分的代码如下。

首先进入初始化程序段,清除错误状态并将报错代码初始化为没有错误发生。一旦复位开关赋值为TRUE,程序将求和值、头指针、尾指针分别赋值为0、#头指针初始值、0。将堆栈以满的状态赋值为FALSE,按下复位开关时,将上个周期窗口值赋值给本周期窗口值。执行完复位程序之后,执行RETURN 指令,跳出该程序段,直到下周期开始,从第一条指令开始重新执行。

2.2 使用滑动窗口优化后的数据缓存程序处理

滑动窗口优化后的数据缓存程序处理代码如下。

本段程序首先读取写入一个新的扫描周期中的模拟量值并将尾指针后移加一,然后判断尾指针是否等于头指针。如果尾指针等于头指针,则判断数据缓存区堆栈已满,一旦堆栈已满状态为TRUE,则进行滤波算法。最后进行头指针的处理,如果头指针等于头指针初始值-1,此时将头指针复位为0并指向第一个元素,如果数据缓存区堆栈已满,头指针后移加一,在复位开关按下时,头指针也可赋值为-1,其他情况下头指针不会被初始化为-1。

2.3 滤波算法程序处理

滤波算法程序处理部分代码如下。

本程序段首先判断数据缓存区堆栈是否已满。如果堆栈已满=FALSE,则将数据缓存区的数值直接输出;如果堆栈已满=TRUE,则进行滤波算法程序处理。在滤波程序中首先将数据缓存区中的第一个元素分别赋值给最大值、最小值、求和值3 个变量,再执行FOR 循环,从缓存区的第二个元素开始一直循环到最后一个元素。在循环过程中,如果该元素小于最小值,则用该元素值替代原最小值;如果该元素大于最大值,则用该元素值替代原最大值,之后执行累加求和程序,最后根据求平均值公式将计算结果值赋值给滤波后信号输出。

2.4 随机信号的产生及模拟仿真方法

随机信号的产生部分程序代码如下。

本程序段利用西门子S71200/1500 系列PLC自带的时钟存储器位产生随机数进行滤波算法的仿真验证。首先定义一个扫描周期,在该扫描周期内利用2 个延时关断定时器产生一个固定频率的脉冲信号,利用该脉冲的上升沿结合时钟存储器,可以产生一个随机数。利用该随机数可以模拟实际的PLC 模拟量模块读取的数值。再组态一个TP1200 的触摸屏,可以将随机数的波形及滤波后信号输出的波形实时地在触摸屏上显示出来。仿真结果波形如图8 所示。

由图8 可知,对于同样的模拟量输入信号,如果采用平均值滤波算法,得到的滤波后的波形的平滑度要比实际的未经过滤波算法处理的波形的平滑度高[5]。

图8 仿真结果波形

3 结语

随着实际工程中模拟量的使用范围越来越广,滤波算法变得尤为重要。对于变化较快的模拟量输入信号存在的偶发性干扰,本文提出的算法可以有效地去除干扰造成的影响,且算法具有较高的灵敏度。该滤波函数程序块具有很好的移植性,可以生成为库文件,在不同的项目中调用。

猜你喜欢
模拟量干扰信号赋值
激光角度欺骗和高重频复合干扰有效概率研究
基于小波域滤波的电子通信信道恶意干扰信号分离方法
基于DJS的射频噪声干扰信号产生方法及其特性分析
模拟量液位计在液压站节能中的应用
基于单片机的一种新型角度传感器的设计
算法框图问题中的易错点
抽象函数难度降 巧用赋值来帮忙
利用赋值法解决抽象函数相关问题オ
学生为什么“懂而不会”