信号采集后三种滤波方法

已锁定

奔驰的稻草人

  • 帖子

    5
  • 精华

    2
  • 被关注

    11

论坛等级:游侠

注册时间:2019-04-14

普通 普通 如何晋级?

信号采集后三种滤波方法

13548

99

2022-02-10 16:32:27

star star star

滤波程序全局库

软件版本:TIA15.1

功能:可实现对采集数据的滤波,根据现场不同情况,设置滤波参数,达到理想曲线。

移植性:功能块编写语言均为SCL,方便移植到其它品牌plc。

内容:此库内包含三中滤波程序,一阶滞后滤波法、中位值滤波法、堆栈平均滤波法。

滤波效果如下图:



①一阶滞后滤波法封装: 

代码:

IF #"a (0-1)" >= 1.0 THEN

    #"a (0-1)" := 0.5;

END_IF;


#ms_time := INT_TO_TIME(#time_ms);

#IEC_Timer_0_Instance(IN := NOT #p,

                      PT := #ms_time,

                      Q => #p);

IF #p THEN

    

    #new_value := (1 - #"a (0-1)") * #IN + #"a (0-1)" * #last_value;

    #last_value := #new_value;

    #OUT := #new_value;

END_IF;



②堆栈平均滤波法封装  

代码:

#IEC_Timer_0_Instance(IN:=NOT #TIMER_INOUT,

                      PT:=#time_采集时间,

                      Q=>#TIMER_INOUT);


#S_数组[#"N_采集数量(3-999)"] := #In_输入值;


IF #TIMER_INOUT THEN

   

    FOR #S_j := 1 TO  #"N_采集数量(3-999)" DO

        #S_数组[#S_j-1] := #S_数组[#S_j];

        

    END_FOR;

END_IF;


#T_max := #S_数组[0];

#T_min := #S_数组[0];

FOR #S_j := 0 TO #"N_采集数量(3-999)"-1 DO

    IF #S_数组[#S_j] > #T_max THEN

        #T_max := #S_数组[#S_j];

    END_IF;

    IF #S_数组[#S_j] < #T_min THEN

        #T_min := #S_数组[#S_j];

    END_IF;

    #T_sum := #T_sum + #S_数组[#S_j];

END_FOR;


IF #"MAX/MIN_EN" THEN

#Out_输出结果:=(#T_sum-#T_max- #T_min )/ (#"N_采集数量(3-999)"-2);

ELSE

    #Out_输出结果 := #T_sum / #"N_采集数量(3-999)";

END_IF;


#Out_max := #T_max;

#Out_min := #T_min;



③中位值滤波法封装  

代码:

//n 须为3<n<999的奇数

IF #N < 3 THEN

    #N := 3;

END_IF;

IF #N > 999 THEN

    #N := 999;

END_IF;

#MOD :=#N MOD 2;

IF #MOD = 0 THEN

    #N := #N + 1;

END_IF;


//转换成时间格式

#time_temp := INT_TO_TIME(#time_ms);


//生成脉冲,对n个数堆栈

#IEC_Timer_0_Instance(IN:=NOT #p,

                      PT:=#time_temp,

                      Q=>#p );

IF #p THEN

    FOR #x := 0 TO #N - 2 DO

        #value[#x] := #value[#x + 1];

    END_FOR;

   #value[#N-1] := #IN;

END_IF;

    

 // 将value数组中的数复制到temp_value数组中

MOVE_BLK(IN:=#value[0],

             COUNT:=1000,

             OUT=>#temp_value[0]);

    

    //对temp_value数组中数从小到大排序

    FOR #j := 0 TO #N - 3 DO

        FOR #i := #j TO #N - 2 DO

            IF #temp_value[#j] > #temp_value[#i + 1] THEN

                #value_temp := #temp_value[#i + 1];

                #temp_value[#i + 1] := #temp_value[#j];

                #temp_value[#j] := #value_temp;

            END_IF;

        END_FOR;

    END_FOR;

    

    //在排好序的数组中,取中间数做为输出

     #OUT := #temp_value[(#N - 1) / 2];


三种滤波方法全局库.rar

编辑不易给个赞呗


信号采集后三种滤波方法 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有8577条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。