在PLC中编写滤波程序,可以根据不同的滤波需求和系统特性选择合适的滤波方法。以下是几种常见的滤波方法及其在PLC程序中的实现步骤:
滑动平均滤波器
实现步骤:
定义一个数组来存储输入信号的历史数据。
使用循环不断更新数组中的数据,保持数组中的数据与输入信号的最近一段时间内的观测值一致。
在每次循环迭代中,将最新的输入值添加到数组中,并删除数组中最旧的数据,以保持数组长度不变。
使用数组中的数据计算平均值作为输出值。
示例代码(以5次采样平均值为例):
```PLC
; 初始化
D0: 0
D100: 0
D2: 0
; 1秒时钟脉冲
; 每秒产生一个脉冲
; 将每次的采样值D100累加到累加器D0中
; 采样次数计数器D2加1
; 计算平均值
; 每5次采样后计算平均值
IF D2 == 5 THEN
; 计算平均值
LOUT = (D0 / 5)
; 重置累加器和计数器
D0: 0
D2: 0
END_IF
```
限幅滤波法
实现步骤:
设定两次采样允许的最大偏差值。
每次检测到新值时,判断本次值与上次值之差是否超过允许的最大偏差值。
如果超过,则本次值无效,用上次值代替;否则,本次值有效。
示例代码:
```PLC
; 设定最大偏差值
A: 10
; 采样值存储在D100
; 每次采样
IF NOT (D100 > (last_value + A) OR D100 < (last_value - A)) THEN
; 本次值有效,更新last_value
last_value: D100
ELSE
; 本次值无效,用上次值代替
D100: last_value
END_IF
```
中位值滤波法
实现步骤:
连续采样N次(N取奇数)。
将N次采样值按大小排列。
取中间值为本次有效值。
示例代码:
```PLC
; 采样值存储在D100
; 连续采样5次
FOR i = 1 TO 5 DO
; 采样
; 将采样值存储在数组中
array[i]: D100
END_FOR
; 对数组进行排序
SORT array
; 取中间值作为有效值
median_value: array[(5 + 1) / 2]
```
算术平均滤波法
实现步骤:
连续取N个采样值进行算术平均运算。
N值较大时,信号平滑度较高,但灵敏度较低;N值较小时,信号平滑度较低,但灵敏度较高。
示例代码:
```PLC
; 采样值存储在D100
; 连续采样N个值
FOR i = 1 TO N DO
; 采样
; 将采样值累加到sum中
sum: sum + D100
END_FOR
; 计算平均值
average_value: sum / N
```
递推平均滤波法
实现步骤:
把连续取N个采样值看成一个队列。
队列的长度固定为N。
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则)。
把队列中的N个数据进行算术平均运算,获得新的滤波结果。
示例代码: