作 者: 凌飞翼(张建设) 洁能公司技术部历经数月的努力,在西门子论坛众多同仁的协助下,于2010年11月研发成功中值滤波库。 中值滤波库适用于PID回路反馈控制信号的滤波处理,减少受控设备在运行过程中的抖动【特别适用于以调节阀为执行器的调节回路】。由于避免了调节过程中尖峰干扰,受控回路可以更快靠近设定值,大幅节约预备运行时间。 以往的数学平均值滤波、移动平均滤波、加权平均滤波,都有一个无法回避的缺陷:那就是有了稳定,就有了滞后、有了偏差。中值滤波库的设计目的,就是在保证精度的同时,不损失响应速度。是一个适用于各种不同类型模拟量的通用滤波方案。通过调节表长,可以改变滤波输出的响应速度。
中值滤波程序运行步骤详解如下:
读数——需要滤波的数据(数据类型为整型,取值范围是-32000~32000)
表长——参与滤波计算数据区的数据个数(数据类型为长整型,取值范围4~64)
最大值——存储在数据区内的最大值
最小值——存储在数据区内的最小值
输出——数据区内去除最大值和最小值后的平均值
输出=(总和—最大值—最小值)/(表长—2)
前值——前一次的输出值
读入存储区特征单元16B。
读数大于数据区最大值时,如果最大值标志位=0,直接舍弃,令最大值标志位=1,直接输出前值。
读数大于数据区最大值时,如果最大值标志位=1,记入数据区。
读数小于数据区最小值时,如果最小值标志位=0,直接舍弃,令最小值标志位=1直接输出前值。
读数大于数据区最小值时,如果最小值标志位=1,记入数据区。
记入数据: 读数写入当前指针指向的数据单元。
最小值标志位、最大值标志位复位。
将当前值传递给最大值、最小值寄存器(实现最大值、最小值寄存器的初始化,该值在下面将要进行的比较、替换操作结束后得到数据区的最大值和最小值)。
当前指针如果已经是表尾,令当前指针指向数据区开始单元,否则下移。
累加数据区数据,同时与最大值、最小值寄存器比较,找出最大值、最小值。
从累加器减掉当前最大值,减掉当前最小值之后,用(数据个数—2)去除,得到平均值。
刷新存储区的特征单元16B。
中值滤波库使用提示【以西门子S7-200为例】:
中值滤波库使用时,需要一个与表长相关的存储区,这里的首地址就是该区域的开始位置。比如该存储区在VB1000开始,表长为15的话,你必须保证从VB1000开始到“16B(表头)+2*15B(数据区)=46B”即VB1045。
注意:这个区间为该滤波器独享。
首地址,可以是存有地址指针值的VDnn或直接是获取指针值的操作符&VBnn。
这是一个从VB0开始的表长为7的滤波回路表。
此中值滤波库已在工程项目中使用验证,效果良好。经验数据(在系统块中,模拟量输入滤波样本数选16):
l 用于压力反馈,建议表长=6~10;
l 用于流量、温度反馈建议表长=4~6。
滤波效果测试:
由系统产生一个正弦曲线,随机在曲线上叠加干扰脉冲,观察传统滤波算法与中值滤波算法的区别。
图中,绿色——未滤波曲线,蓝色——中值滤波曲线,红色——仿西门子滤波曲线。由图可以看出,中值滤波后的曲线较仿西门子滤波后的曲线毛刺明显减少,与实际值的偏差也明显减小。