這個官方的STEP7編程語言介紹里有個現成的SCL的例子,可以拿去參考一下
例程如下:
這里取10個數據,去掉最小最大求平均的功能塊程序,用SCL編程一下就可以用了
FUNCTION_BLOCK FB2
VAR_INPUT
PIW_IN:INT;
HI_LIM_IN:REAL:=100.0;
LO_LIM_IN:REAL:=0.0;
BIPOLAR_IN:BOOL:=FALSE;
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
SCALED_VAL:REAL;
SCALED_FILTED:REAL;
ERR:BOOL;
END_VAR
VAR_TEMP
RET_VAL_105:WORD;
LOOP_COUNT:INT;
MAX_DATA:REAL;
MIN_DATA:REAL;
TOTAL:REAL;
TOTAL_FILTERD:REAL;
END_VAR
VAR
DATA_STORE:ARRAY[0..9]OF REAL;
END_VAR
RET_VAL_105:=SCALE(IN :=PIW_IN
,HI_LIM :=HI_LIM_IN
,LO_LIM :=LO_LIM_IN
,BIPOLAR :=BIPOLAR_IN
,OUT :=SCALED_VAL
);
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 8 BY 1 DO//FIFO堆棧
DATA_STORE[LOOP_COUNT]:=DATA_STORE[LOOP_COUNT+1];
END_FOR;
data_store[9]:=scaled_val;//加入新檢測值
FOR LOOP_COUNT:=0 TO 9 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-MIN_DATA-MAX_DATA;
//計算濾波后平均值
SCALED_FILTED:=TOTAL_FILTERD/8.0;
END_FUNCTION_BLOCK