Maximalwert in Datentabelle suchen
Dieser FP-Befehl ermittelt den Maximalwert und seine Position in einer Datentabelle und gibt beide Werte aus.
Eingang
Anfang der Datentabelle
Ende der Datentabelle
Ausgang
Oberster Wert
Position des Maximalwertes
Der Anfang der Datentabelle wird dem Eingang s1_Start und das Ende dem Eingang s2_End übergeben. Der Maximalwert wird am Ausgang d1_Max und seine Position am Ausgang d2_Pos zurückgegeben.
Die Position d2_Pos entspricht der Position des ersten Vorkommens des Maximalwerts relativ zum Anfang der Datentabelle.
wenn der mit dem Index-Modifizierer definierte Bereich größer ist als der zulässige Bereich
wenn s1_Start > s2_End
wenn s1_Start und s2_End zu verschiedenen Datenbereichen gehören
wenn der mit dem Index-Modifizierer definierte Bereich größer ist als der zulässige Bereich
wenn s1_Start > s2_End
wenn s1_Start und s2_End zu verschiedenen Datenbereichen gehören
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden.Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
adiDataField: ARRAY [0..4] OF DINT:=[2,3,222222,-333333,1];
diOutputMax: DINT:=0;
(*the maximum value of
data_array; here: 222222*)
diOutputPos: DINT:=0;
(*the position of the
maximum value; here: 2*)
END_VAR
Wenn die Variable bStart auf TRUE gesetzt wird, wird die Funktion ausgeführt.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,FP_DATA_MAX_POS!,,12,1,22,6,,?DEN?Ds1_Start?Ds2_End?AENO?Cd1_Max?Cd2_Pos);
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_VARIN,,adiDataField[0],10,3,12,5,);
B(B_VARIN,,adiDataField[4],10,4,12,6,);
B(B_VAROUT,,diOutputMax,22,3,24,5,);
B(B_VAROUT,,diOutputPos,22,4,24,6,);
L(1,3,5,3);
L(7,3,12,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF bStart then
FP_DATA_MAX_POS(s1_Start := adiDataField[0],
s2_End := adiDataField[4],
d1_Max => diOutputMax,
d2_Pos => diOutputPos);
END_IF;