广东湘恒智能科技有限公司
主营产品: 西门子PLC代理商,plc变频器,伺服电机,人机界面,触摸屏,线缆,DP接头
​【SCL编程】博途中实现信号滤波的三种方法
发布时间:2024-11-21

滤波程序全局库概述(1)功能:实现对采集数据的滤波,调节滤波参数可达到理想曲线。(2)移植:功能块编写语言均为SCL,可方便移植到其它品牌PLC。(3)内容:内含三种滤波程序,一阶滞后/堆栈平均/中位值/滤波法。(4)版本:博途V15.1【三】滤波效果如下图一阶滞后滤波法【一】一阶滞后滤波法封装(二)SCL编程代码如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;堆栈平均滤波法(一)堆栈平均滤波法封装(二)SCL编程代码#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;中位值滤波法(一)中位值滤波法封装  (二)SCL编程代码//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];
展开全文
拨打电话 微信咨询 发送询价