Daten in Datentabelle sortieren
Der FP-Befehl sortiert Werte (mit Vorzeichen) einer Datentabelle in auf- oder absteigender Reihenfolge.
Der Befehl sortiert nur eindimensionale Arrays. Er funktioniert nicht bei zweidimensionalen oder dreidimensionalen Arrays.
Eingang
Anfang der zu sortierenden Datentabelle
Ende der zu sortierenden Datentabelle
Spezifiziert Sortierreihenfolge:
0 = aufsteigend
1 = absteigend
Die Daten werden mit dem am Eingang s3_Control liegenden Wert beginnend in der festgelegten Reihenfolge durch Vertauschen (bubble sort) sortiert. Da die Zahl der erforderlichen Wortvergleiche der quadratischen Wortanzahl entspricht, kann das Sortieren bei vielen Wörtern einige Zeit dauern. Wenn die Adresse der Variablen an den Eingängen von s1_Start = s2_End ist, wird nicht sortiert.
wenn der mit dem Index-Modifizierer definierte Bereich größer ist als der zulässige Bereich
wenn die Adresse der Variablen an den Eingängen von s1_Start > s2_End ist.
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 die Adresse der Variablen an den Eingängen von s1_Start > s2_End ist.
wenn s1_Start und s2_End zu verschiedenen Datenbereichen gehören
Verwandte F-Befehle: F277_SORT, F278_DSORT, F353_FSORT
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:=[4,7,-32,13,5];
(*result after a 0->1 leading
edge from start: [-32,4,5,7,13]*)
iOrder: INT:=0;
(*which way to sort:
0 means ascending order
1 means descending order*)
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 := 7 ;
NETWORK_BODY
B(B_F,FP_DATA_SORT!,,11,1,20,7,,?DEN?Ds1_Start?Ds2_End?Ds3_Control?AENO);
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_VARIN,,adiDataField[0],9,3,11,5,);
B(B_VARIN,,adiDataField[4],9,4,11,6,);
B(B_VARIN,,iOrder,9,5,11,7,);
L(1,3,5,3);
L(7,3,11,3);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
END_BODY
If (bStart) then
FP_DATA_SORT(s1_Start := adiDataField[0],
s2_End := adiDataField[4],
s3_Control := iOrder);
End_if;