[西门子] SMART编写制作滑动平均中值滤波库

[复制链接]
查看100 | 回复0 | 2024-8-25 00:28:31 | 显示全部楼层 |阅读模式
滑动平均中值滤波的过程描述
滑动中值滤波相当于创造了一个数据池,刚开始时池子为空,随着每次采样,依次将池子填满。池子填满后就可以采取去掉一个最大值,去掉一个最小值,剩下的值取平均得到输出结果。池子填满后,下次采样的值会将数据向前推一个,推掉最前面的那个数据,将最新的数据写在最后面,然后再按刚才的方法计算输出结果。

程序可以分为三个过程

  • 池子填满前

每次采样都是完成向池子中填充数据的工作




  • 池子被填满后

将原池子中的数据都向前移动一个位置,1位置的数据放在0的位置,2位置的数据放在1的位置...7位置的数据放在6的位置,将最新的采样数据放在7的位置。再按照滤波规则将数据求和,剔除最大值和最小值,再求出平均值作为输出。




  • 数值滑动

先滑动数据,再按照滤波规则将数据求和,剔除最大值和最小值,再求出平均值作为输出。

编程实现上述功能子程序变量定义


以下程序描述均以SampleNum_Set=8为例做解释。

  • 池子填满前

根据实际采样计数来移动数据指针,将采样值填入相应位置。例如当SampleNum_Count=0时,Point_1=0*4+Begin_Point0=Begin_Point0,指向0的位置并将当前采样值填入这个位置,SampleNum_Count=0+1=1;当SampleNum_Count=1时,Point_1=1*4+Begin_Point0=Begin_Point0+4,指向1的位置并将当前采样值填入这个位置,SampleNum_Count=1+1=2;依次类推,当SampleNum_Count=7时,池子已被填满,SampleNum_Count=7+1=8。




  • 池子填满后

处理数据的条件满足,利用循环



找出待处理数据的最大值和最小值,并求出数据总和。



处理完最后一个位置的数据,用求和值减去最大值,再减去最小值,再求出平均值即为输出。



最后一行程序使SampleNum_Count=8+1=9。




  • 数值滑动

池子填刚满的时候不用滑动数据,即当SampleNum_Count=8时,不用做数据滑动处理。当SampleNum_Count=>8时,利用循环滑动数据。具体过程是在写入第8个数据之前,都是将后一个位置的数据填入前一个位置,当需要写入第8个数据时,将最新的采样数值写入位置7即可。



用表格将程序的循环过程展示出来如下:

循环值temp2

Point_1

Point_2

写入数据指令

写入数值

0

&VB100+0*4=&VB100

Point_1+4=&VB104

*Point_1=*Point_2

VD100=VD104

1

&VB100+1*4=&VB104

Point_1+4=&VB108

*Point_1=*Point_2

VD104=VD108

2

&VB100+2*4=&VB108

Point_1+4=&VB112

*Point_1=*Point_2

VD108=VD112

3

&VB100+3*4=&VB112

Point_1+4=&VB116

*Point_1=*Point_2

VD112=VD116

4

&VB100+4*4=&VB116

Point_1+4=&VB120

*Point_1=*Point_2

VD116=VD120

5

&VB100+5*4=&VB120

Point_1+4=&VB124

*Point_1=*Point_2

VD120=VD124

6

&VB100+6*4=&VB124

Point_1+4=&VB128

*Point_1=*Point_2

VD124=VD128

7

&VB100+7*4=&VB128

Point_1+4=&VB132

*Point_1=R_In

VD128=R_In

测试测试程序
库调用IO参数请参考上文“子程序变量定义”中的说明

在主程序中利用定时器,M0.0位接通后,从VD0开始每3s钟更新一次R_In采样值并调用滑动平均中值滤波子程序处理一次数据。即R_In的值每过3s,依次变更为VD0,VD4,VD6。。。。VD18中的值。





设置对照
先在EXCEL表格中填写待测试的数据,再按照规则利用公式计算正确的滤波结果。公式=(SUM(B2:B9)-MAX(B2:B9)-MIN(B2:B9))/(COUNT(B2:B9)-2)



测试过程
在状态表中从VD0开始创建18个变量



将EXCEL表格中的数据值复制粘贴至变量的新值中



将新值写入变量中



启动测试

可以看到,当采样计数<9时,滤波输出值为0,此过程为填写数据池的过程。



当采样计数>=9时,池子填满后,对这批数值进行滤波处理,滤波输出结果与EXCEL表格中计算结果相同。



用趋势图显示滤波的过程,第一条曲线是未滤波时每次采样的数值,第二条曲线是滤波后的输出值,经过滤波后的数据曲线更加平滑。



总结
实际使用过程中需要为数据处理留出存储空间,采样容量(池子容量)可根据情况设定看哪种效果最好。

库文件及测试程序下载链接

链接:https://pan.baidu.com/s/1y4RN7iBXIn-shN177pF8VQ

提取码:gwv9

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则