发布于 2007-05-11 11:47:17
0楼
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1
VAR_INPUT
PV_IN : REAL ; //所采集的PV值
END_VAR
VAR_OUTPUT
PV_OUT : REAL ; //滤波后的PV值
END_VAR
VAR
PV_SAVE : ARRAY [1 .. 50 ] OF //存储固定间隔采集的PV值
REAL := 0.000000e+000;
Adress_index : DWORD := DW#16#85000040; //index of array
PV_TOTAL : REAL ; //累计量
PV_MAX : REAL ; //本轮循环中采集的PV最大值
PV_MIN : REAL := 7.000000e+003; //本轮循环中采集的PV最小值
END_VAR
VAR_TEMP
Add_INDEX : DWORD ;
MAX_TEMP : REAL ;
MIN_TEMP : REAL ;
SAVE_AR1 : DWORD ; //AR1存储单元
END_VAR
BEGIN
NETWORK
TITLE =
NETWORK
TITLE =循环存储
L #Adress_index;
LAR1 ;
L #PV_TOTAL; //覆盖新值之前减掉旧值
L D [AR1,P#0.0];
-R ;
T #PV_TOTAL;
L #PV_IN; //存储
T D [AR1,P#0.0];
L #PV_TOTAL; //重新计算累计量
+R ;
T #PV_TOTAL;
L #Adress_index; //队列
L P#4.0;
+D ;
T #Adress_index;
A( ;
L #Adress_index;
L P#DIX 204.0;
<=D ;
) ;
JC _001;
L P##PV_SAVE;
T #Adress_index;
_001: TAR1 #SAVE_AR1; //因为多个实例用AR1作为基数
NOP 0;
NETWORK
TITLE =最大值,最小值
L 0.000000e+000;
T #PV_MAX;
L 7.000000e+003;
T #PV_MIN;
L P##PV_SAVE;
T #Add_INDEX;
_003: L #Add_INDEX;
LAR1 ;
L D [AR1,P#0.0];
L #PV_MAX;
JC _002;
L D [AR1,P#0.0]; //计算最大值
T #PV_MAX;
_002: L D [AR1,P#0.0];
L #PV_MIN;
>R ;
JC _004;
L D [AR1,P#0.0]; //计算最小值
T #PV_MIN;
_004: L #Add_INDEX;
L P#4.0;
+D ;
T #Add_INDEX;
L #Add_INDEX;
L P#DIX 204.0;
<=D ;
JC _003;
NETWORK
TITLE =求平均
L #PV_TOTAL;
L #PV_MAX; //剔出最大值
-R ;
L #PV_MIN; //剔出最小值
-R ;
L 4.800000e+001;
/R ;
T #PV_OUT;
NETWORK
TITLE =
LAR1 #SAVE_AR1; //恢复AR1
BE ;
NOP 0;
END_FUNCTION_BLOCK
DATA_BLOCK DB 11
TITLE =
VERSION : 0.1
FB 1
BEGIN
PV_IN := 0.000000e+000; DID0
PV_OUT := 0.000000e+000; DID4
PV_SAVE[1] := 0.000000e+000; …..
PV_SAVE[2] := 0.000000e+000;
PV_SAVE[3] := 0.000000e+000;
PV_SAVE[4] := 0.000000e+000;
PV_SAVE[5] := 0.000000e+000;
PV_SAVE[6] := 0.000000e+000;
PV_SAVE[7] := 0.000000e+000;
PV_SAVE[8] := 0.000000e+000;
PV_SAVE[9] := 0.000000e+000;
PV_SAVE[10] := 0.000000e+000;
PV_SAVE[11] := 0.000000e+000;
PV_SAVE[12] := 0.000000e+000;
PV_SAVE[13] := 0.000000e+000;
PV_SAVE[14] := 0.000000e+000;
PV_SAVE[15] := 0.000000e+000;
PV_SAVE[16] := 0.000000e+000;
PV_SAVE[17] := 0.000000e+000;
PV_SAVE[18] := 0.000000e+000;
PV_SAVE[19] := 0.000000e+000;
PV_SAVE[20] := 0.000000e+000;
PV_SAVE[21] := 0.000000e+000;
PV_SAVE[22] := 0.000000e+000;
PV_SAVE[23] := 0.000000e+000;
PV_SAVE[24] := 0.000000e+000;
PV_SAVE[25] := 0.000000e+000;
PV_SAVE[26] := 0.000000e+000;
PV_SAVE[27] := 0.000000e+000;
PV_SAVE[28] := 0.000000e+000;
PV_SAVE[29] := 0.000000e+000;
PV_SAVE[30] := 0.000000e+000;
PV_SAVE[31] := 0.000000e+000;
PV_SAVE[32] := 0.000000e+000;
PV_SAVE[33] := 0.000000e+000;
PV_SAVE[34] := 0.000000e+000;
PV_SAVE[35] := 0.000000e+000;
PV_SAVE[36] := 0.000000e+000;
PV_SAVE[37] := 0.000000e+000;
PV_SAVE[38] := 0.000000e+000;
PV_SAVE[39] := 0.000000e+000;
PV_SAVE[40] := 0.000000e+000;
PV_SAVE[41] := 0.000000e+000;
PV_SAVE[42] := 0.000000e+000;
PV_SAVE[43] := 0.000000e+000;
PV_SAVE[44] := 0.000000e+000;
PV_SAVE[45] := 0.000000e+000;
PV_SAVE[46] := 0.000000e+000;
PV_SAVE[47] := 0.000000e+000;
PV_SAVE[48] := 0.000000e+000;
PV_SAVE[49] := 0.000000e+000;
PV_SAVE[50] := 0.000000e+000; DID204
Adress_index := DW#16#85000040; DID208
PV_TOTAL := 0.000000e+000; DID212
PV_MAX := 0.000000e+000; DID216
PV_MIN := 7.000000e+003; DID220
END_DATA_BLOCK
一个人的精彩,是不可能的!