PLC信号滤波的三种方法(博途版)
滤波程序全局概述与下载方式【一】下载方式公众号对话框回复“333”获取下载链接,不会的请参考下图。https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/dd377c0d53cf4d6dae39d98e94b4d716~tplv-tt-shrink:640:0.image?traceid=202305011139039ED531050821F6F13DAA&x-expires=2147483647&x-signature=nKmxMjGN3ZpDU16azIgFgwZjxd0%3D【二】滤波程序全局库概述(1)功能:实现对采集数据的滤波,调节滤波参数可达到理想曲线。(2)移植:功能块编写语言均为SCL,可方便移植到其它品牌PLC。(3)内容:内含三种滤波程序,一阶滞后/堆栈平均/中位值/滤波法。(4)版本:博途V15.1【三】滤波效果如下图https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/358fc1e041e146ce82cc29349eff3e42~tplv-tt-shrink:640:0.image?traceid=202305011139039ED531050821F6F13DAA&x-expires=2147483647&x-signature=PTuOfzhqMZf4pA%2BjJnlZsXkgwQU%3D
一阶滞后滤波法【一】一阶滞后滤波法封装https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/ccb094aa5ed44bce81e2f4f2d7abd07d~tplv-tt-shrink:640:0.image?traceid=202305011139039ED531050821F6F13DAA&x-expires=2147483647&x-signature=nkOnjmrO89zH8e17UG1CQNAHh6I%3D
(二)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;堆栈平均滤波法(一)堆栈平均滤波法封装https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/c8a44641db2a40cbb45eaad08fb270f5~tplv-tt-shrink:640:0.image?traceid=202305011139039ED531050821F6F13DAA&x-expires=2147483647&x-signature=AkDx%2FrQG%2BxG43mrvknJzydc5Vn4%3D
(二)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_数组;#T_min := #S_数组;FOR #S_j := 0 TO #"N_采集数量(3-999)"-1 DOIF #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;中位值滤波法(一)中位值滤波法封装https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/59133a9f49a843a1a4a95153b59dcce8~tplv-tt-shrink:640:0.image?traceid=202305011139039ED531050821F6F13DAA&x-expires=2147483647&x-signature=%2FVA%2BPhgZLIexEerfmK4gdImFSYg%3D
(二)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 THENFOR #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,COUNT:=1000,OUT=>#temp_value);
//对temp_value数组中数从小到大排序FOR #j := 0 TO #N - 3 DOFOR #i := #j TO #N - 2 DOIF #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];
滤波程序全局 这逻辑绝了,分析得太到位了吧 水个经验,支持楼主,加油呀 楼主太会说了,字字句句都在理~ 哈哈哈哈笑不活,楼主这脑洞绝了! 画面感太强了,仿佛身临其境! 谁懂啊!真的被戳中笑点 / 泪点了 楼主太会说了,字字句句都在理 占个楼慢慢看,先马克一下
楼主辛苦啦,期待下一篇分享
页:
[1]
2