发布于 2009-02-20 11:04:20
0楼
用SCL编程,这是一个仅供参考例子,希望对你有点用吧! 错误之处难免,请多指教,谢谢!
FUNCTION_BLOCK FB800
//中位值平均滤波法
CONST
N := 10;//总数值N的选取
END_CONST
VAR_INPUT//定义输入参数
PIW_IN: INT;//模拟量输入值
HI_LIM_IN: REAL;//工程量上限值
LO_LIM_IN: REAL;//工程量下限值
BIPOLAR_IN: BOOL;//信号状态为1表示输入值为双极性,信号状态0表示输入值为单极性。
END_VAR
VAR_OUTPUT //定义输出参数
SCALED_VAL: REAL;//转换的结果
SCALED_FILTED: REAL;//滤波后平均值
ERR: BOOL;
END_VAR
VAR_TEMP//定义临时参数
RET_VAL_105: WORD;//FC105的RET_VAL
LOOP_COUNT: INT;
MAX_DATA: REAL;
MIN_DATA: REAL;
TOTAL: REAL;
TOTAL_FILTERD: REAL;
END_VAR
VAR
DATA_STORE: ARRAY[0..N-1] OF REAL;//定义静态参数
END_VAR
BEGIN
RET_VAL_105 := SCALE(IN := PIW_IN //与转换为以工程单位表示的输入整型值。
,HI_LIM := HI_LIM_IN //以工程单位表示的上限值(实数)。
,LO_LIM := LO_LIM_IN //以工程单位表示的下限值(实数)。
,BIPOLAR := BIPOLAR_IN //信号状态为1表示输入值为双极性,信号状态0表示输入值为单极性。
,OUT := SCALED_VAL //转换的结果(实数)。
);//如果该指令的执行没有错误,将返回值W#16#0000。
IF RET_VAL_105 <> 0 THEN ERR := TRUE;
ELSE ERR := FALSE;
END_IF;
MAX_DATA := DATA_STORE[0];//初始化
MIN_DATA := DATA_STORE[0];
TOTAL := 0.0;
TOTAL_FILTERD := 0.0;
FOR LOOP_COUNT:= 0 TO N-2 BY 1 DO//FIFO 堆栈
DATA_STORE[LOOP_COUNT] := DATA_STORE[LOOP_COUNT + 1];
END_FOR;
DATA_STORE[N-1] := SCALED_VAL;//加入新检测值
FOR LOOP_COUNT:= 0 TO N-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_FILTERD := TOTAL -MAX_DATA -MIN_DATA;//计算滤波后累加和
SCALED_FILTED := TOTAL_FILTERD/INT_TO_REAL(N-2);//计算滤波后平均值
END_FUNCTION_BLOCK