由于客户要求输出曲线比较平滑避免过多波动,同时输出值要实时响应也够快,试了一堆感觉都不是自己想要的,于是自己写了个简单的,封装成FB块方便大家使用
第一次写的不好大家见谅
1.程序运行后滤波效果


2.变量表

3.程序


4.程序总览

5.FB调用及参数说明

6.FB引脚参数说明

7.源程序
//*******************************************************************************************
//限制采样周期最小时间
IF #In_采样周期 <= 0 THEN
#In_采样周期 := 100;
END_IF;
//限制次数最小值
IF #In_采样次数 <= 0.0 THEN
#In_采样次数 := 10.0;
END_IF;
//*******************************************************************************************
//*******************************************************************************************
//采样次数转换数据类型,用于后面数据处理
#T_采样次数 := REAL_TO_DINT(#In_采样次数);
//*******************************************************************************************
//求出周期内采样次数
#T_采样时间 := #In_采样周期 / #T_采样次数;
//*******************************************************************************************
//采样时间周期触发
#T_采样定时器(IN := NOT #T_采样输出1,
PT := #T_采样时间,
Q => #T_采样输出1);
//每个采样周期+1
IF #T_采样输出1 AND NOT #T_采样输出2 THEN
#i := #i + 1;
END_IF;
#T_采样输出2 := #T_采样输出1;
//采样周期值进行传递到数组
#T_采样数组[#i] := #In_输入值;
//采样周期超过采样次数重新计数
IF #i >= #T_采样次数 THEN
#i := 0;
END_IF;
//*******************************************************************************************
//求采样数组总和
#T_输出值 := 0;
FOR #J := 1 TO #T_采样次数 DO
#T_输出值 := #T_输出值 + #T_采样数组[#J - 1];
END_FOR;
//初始化最大最小值赋值
#T_max := #T_采样数组[0];
#T_min := #T_采样数组[0];
//求取最大最小值
FOR #K := 1 TO #T_采样次数 DO
IF #T_采样数组[#K - 1] > #T_max THEN
#T_max := #T_采样数组[#K];
END_IF;
IF #T_采样数组[#K - 1] < #T_min THEN
#T_min := #T_采样数组[#K];
END_IF;
END_FOR;
//最大最小值赋值
#Out_max值 := #T_max;
#Out_min值:= #T_min;
//输出值是否过滤最大最小值
//
IF #In_滤波开关 THEN
IF #"In_Max/Min屏蔽" THEN
#Out_输出值 := (#T_输出值 - #T_max - #T_min) / (#In_采样次数 - 2);
ELSE
#Out_输出值 := (#T_输出值 / #In_采样次数);
END_IF;
ELSE
#Out_输出值 := #In_输入值;
END_IF;
8.FB块附件
滤波FB块.7z
9.曲线图采集的软
PLC-Recorder 大家可以自行网络搜索