发布于 2012-09-13 18:28:31
1楼
中位值平均滤波(这个功能块纯粹抄的西门子文档A0224中的例子程序)
FUNCTION_BLOCK FB1001
CONST
Length :=20; //数据记录宽度
END_CONST
VAR_INPUT //定义输入参数
Realtime_Value :REAL; //实时采样值
END_VAR
VAR_OUTPUT //定义输出参数
Filted_Value :REAL; //滤波后采样值
END_VAR
VAR_TEMP //定义临时变量
Loop_Count :INT; //循环计数
Max_Data :REAL; //最大值
Min_Data :REAL; //最小值
Total :REAL; //累加和
Total_Filted :REAL; //滤波后累加和
END_VAR
VAR //定义静态变量
Data_Store :ARRAY[1..Length] OF REAL; //数据记录区
END_VAR
BEGIN
(* 数据初始化 *)
Max_Data:=Data_Store[1];
Min_Data:=Data_Store[1];
Total:=0.0;
Total_Filted:=0.0;
(* 先入先出堆栈 *)
FOR Loop_Count := 1 TO (Length - 1) BY 1 DO
Data_Store[Loop_Count] := Data_Store[Loop_Count + 1];
END_FOR;
Data_Store[Length] := Realtime_Value;
(* 计算累加值 *)
FOR Loop_Count := 1 TO (Length - 1) BY 1 DO
IF Max_Data < Data_Store[Loop_Count] THEN
Max_Data := Data_Store[Loop_Count];
END_IF;
IF Min_Data > Data_Store[Loop_Count] THEN
Min_Data := Data_Store[Loop_Count];
END_IF;
Total := Total + Data_Store[Loop_Count];
END_FOR;
Total_Filted := Total - Max_Data - Min_Data;
Filted_Value := Total_Filted / (Length - 2);
END_FUNCTION_BLOCK