软件版本: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];