作者 | 主题 |
---|---|
奔驰的稻草人 游侠 经验值:345 发帖数:5 精华帖:2 |
楼主 2022-02-10 16:32:27
主题:信号采集后三种滤波方法 滤波程序全局库 软件版本: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];
仰天大笑出门去我辈岂是蓬蒿人
|