>可编程逻辑控制器(PLC)是一种专门用于工业环境的数字运算电子系统,用来控制机械过程或生产过程。在PLC控制系统中,传感器等输入设备可能会受到电气噪声的影响,导致信号不稳定或者含有不需要的高频成分。为了提高系统的可靠性和准确性,常常需要对这些输入信号进行处理,这就引入了数字滤波的概念。
一、数字滤波的意义减少噪声:通过过滤掉信号中的高频噪声,可以使得实际想要检测的变化更加清晰。 平滑数据:对于变化较慢的过程变量,采用适当的滤波算法能够平滑数据波动,避免因为瞬时干扰而导致误动作。 提取特征:某些情况下,可能需要从复杂的信号中提取特定频率范围内的信息,此时使用合适的滤波器设计非常重要。 改善响应特性:合理设置滤波参数有助于优化控制回路的动态性能,如加快响应速度同时保持系统稳定。
二、应用场合温度监测与控制:例如,在加热炉温控系统中,通过对测得的温度值应用低通滤波来去除由热电偶线缆感应到的电磁干扰。 流量测量:在流体输送过程中,由于管道震动等因素引起的流量计读数跳动可通过软件实现的移动平均法来减小。 位置伺服系统:当使用编码器作为反馈装置时,其输出信号容易受到外部因素影响而产生误差,利用高阶滤波技术可以帮助获得更准确的位置信息。 振动分析:在机械设备的状态监测中,通过对采集到的振动信号进行频谱分析,并选择性地抑制非目标频段,以突出显示潜在故障特征。 安全相关领域:比如紧急停止按钮状态监控,为防止误触发,通常会采用一定时间窗口内的多次采样确认机制。
三、滑动+最值滤波 //数据采集
FOR 指针:=1 TO 滤波长度 BY 1 DO data_1[指针]:=滤波前输入; END_FOR
//最大值滤波
data_max:=0;
FOR 指针:=1 TO 滤波长度 BY 1 DO IF data_max<data_1[指针] THEN data_max:=data_1[指针]; END_IF END_FOR
//最小值滤波
data_min:=data_max;
FOR 指针:=1 TO 滤波长度 BY 1 DO IF data_min>data_1[指针] THEN data_min:=data_1[指针];
END_IF END_FOR
//求平均值输出 数据和:=0; FOR 指针:=1 TO 滤波长度 BY 1 DO 数据和:=data_1[指针]+数据和; END_FOR
滤波后输出:= (数据和-data_max-data_min)/(滤波长度-2);
//滑动滤波数据交换
FOR 指针:=1 TO (滤波长度-滤波强度) BY 1 DO data_2[指针]:=data_1[指针]; END_FOR
FOR 指针:=1 TO (滤波长度-滤波强度) BY 1 DO data_1[指针+滤波强度]:=data_2[指针]; END_FOR
//数字滤波强度计算 IF 滤波长度>=10 THEN IF 滤波强度设定值0_3>3 THEN 滤波强度设定值0_3:=3; END_IF; 滤波强度:=(滤波长度/10)*2*滤波强度设定值0_3; END_IF IF 滤波长度<10 THEN IF 滤波强度设定值0_3>2 THEN 滤波强度设定值0_3:=2; END_IF; 滤波强度:=2*滤波强度设定值0_3; END_IF KM_X_1:=KM_A*KM_X+KM_B; KM_P_1:=KM_A*KM_P*KM_A+KM_Q;
KM_K:=KM_P_1*KM_C/(KM_C*KM_P_1*KM_C*KM_R); KM_X:=KM_X_1+KM_K*(DATA_Slide_NUM-KM_C*KM_X_1); KM_P:=(1-KM_K*KM_C)*KM_P_1;
IF IIR_A <> DATA_val[1] THEN IIR_B:=1-IIR_A; DATA_val[1]:=IIR_A ; DATA_val[2]:=IIR_B; END_IF
IF IIR_B <> DATA_val[2] THEN IIR_A:=1-IIR_B; DATA_val[1]:=IIR_A; DATA_val[2]:=IIR_B; END_IF DATA_OUT_IIR:=LREAL_TO_REAL(IIR_A*DATA_Slide_NUM+IIR_B*DATA_val[3]); DATA_val[3]:=DATA_OUT_IIR;
FILTER_Coeffs[1]:=0.25; FILTER_Coeffs[2]:=0.5; FILTER_Coeffs[3]:=0.25; FOR i:=1 TO BUFFER_SIZE BY 1 DO Buffer_temp:=Buffer_temp[i+1]; END_FOR; Buffer_temp[1]:=DATA_OUT_IIR; DATA_OUT_PUT :=FIR_OUT_PUT; FOR i:=1 TO FILTER_LENGTH BY 1 DO FIR_OUT_PUT:=FILTER_Coeffs*Buffer_temp+FIR_OUT_PUT; END_FOR; FOR i:=1 TO FILTER_LENGTH BY 1 DO Buffer:=Buffer_temp; END_FOR; 五、IIR滤波 IF IIR_A <> DATA_val[1] THEN IF IIR_B <> DATA_val[2] THEN DATA_OUT_PUT:=IIR_A*DATA_IN_PUT+IIR_B*DATA_val[3]; DATA_val[3]:=DATA_OUT_PUT; IF REAL_20 = 0 THEN //初始化数组 FOR i:=1 TO DATA_NUM BY 1 DO FOR i:=1 TO DATA_NUM BY 1 DO FOR i:=1 TO DATA_NUM BY 1 DO FOR i:=1 TO DATA_NUM-1 BY 1 DO FOR i:=1 TO DATA_NUM BY 1 DODATA_OUT_PUT:=DATA_10*DATA_11+DATA_OUT_PUT;
|