[西门子] 数字滤波合集——CODESYS(ST语言)

[复制链接]
查看77 | 回复0 | 前天 14:15 | 显示全部楼层 |阅读模式
>
可编程逻辑控制器(PLC)是一种专门用于工业环境的数字运算电子系统,用来控制机械过程或生产过程。在PLC控制系统中,传感器等输入设备可能会受到电气噪声的影响,导致信号不稳定或者含有不需要的高频成分。为了提高系统的可靠性和准确性,常常需要对这些输入信号进行处理,这就引入了数字滤波的概念。

一、数字滤波的意义

  1. 减少噪声:通过过滤掉信号中的高频噪声,可以使得实际想要检测的变化更加清晰。

  2. 平滑数据:对于变化较慢的过程变量,采用适当的滤波算法能够平滑数据波动,避免因为瞬时干扰而导致误动作。

  3. 提取特征:某些情况下,可能需要从复杂的信号中提取特定频率范围内的信息,此时使用合适的滤波器设计非常重要。

  4. 改善响应特性:合理设置滤波参数有助于优化控制回路的动态性能,如加快响应速度同时保持系统稳定。

二、应用场合

  • 温度监测与控制:例如,在加热炉温控系统中,通过对测得的温度值应用低通滤波来去除由热电偶线缆感应到的电磁干扰。

  • 流量测量:在流体输送过程中,由于管道震动等因素引起的流量计读数跳动可通过软件实现的移动平均法来减小。

  • 位置伺服系统:当使用编码器作为反馈装置时,其输出信号容易受到外部因素影响而产生误差,利用高阶滤波技术可以帮助获得更准确的位置信息。

  • 振动分析:在机械设备的状态监测中,通过对采集到的振动信号进行频谱分析,并选择性地抑制非目标频段,以突出显示潜在故障特征。

  • 安全相关领域:比如紧急停止按钮状态监控,为防止误触发,通常会采用一定时间窗口内的多次采样确认机制。

三、滑动+最值滤波

//数据采集


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 
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_PUT:=IIR_A*DATA_IN_PUT+IIR_B*DATA_val[3];
        DATA_val[3]:=DATA_OUT_PUT; 
六、FIR滤波

IF  REAL_20 = 0 THEN        //初始化数组

FOR i:=1 TO DATA_NUM BY 1 DO

DATA_10:=0.0;

END_FOR;

REAL_20:=1;
END_IF;
    FOR i:=1 TO DATA_NUM BY 1 DO
DATA_11:=DATA_30;
END_FOR;
FOR i:=1 TO DATA_NUM BY 1 DO     
DATA_12:=DATA_10;
END_FOR
FOR i:=1 TO DATA_NUM-1 BY 1 DO     
DATA_10[i+1]:=DATA_12;
END_FOR
DATA_10[1]:=DATA_IN_PUT;
DATA_OUT_PUT:=0;
FOR i:=1 TO DATA_NUM BY 1 DO

DATA_OUT_PUT:=DATA_10*DATA_11+DATA_OUT_PUT;

END_FOR

本帖子中包含更多资源

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

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

本版积分规则