L #iDB_Nr //DB Nummer einlesen
T #tDb_Nr //temp. speichern
L #iStartadresse //Startadresse laden
T #sStartadresse //statisch abspeichern
L #iBlockgroesse //Lade Sortierbereich
T #sBlockgroesse //statisch abspeichern
L #iSave_DB //Db Nummer Zwischenspeicher einlesen
T #sSave_DB //statisch abspeichern
L #sBlockgroesse //Blockoffsteberechnung
L P#1.0
*D
T #tBlockoffset
LAR1 P##tVergleichsblock1
L B#16#10 //10h für s7
T LB [AR1,P#0.0]
L B#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L #sBlockgroesse //Anzahl (Wiederholungsfaktor)
T LW [AR1,P#2.0]
L #tDb_Nr //Datenbaustein
T LW [AR1,P#4.0]
L #sStartadresse //Startadresse des ersten Bytes
SLD 3 //Pointer bauen
T LD [AR1,P#6.0] //Ergebnis in Anypointer eintragen
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]
LAR1 P##tVergleichsblock2
L B#16#10 //10h für s7
T LB [AR1,P#0.0]
L B#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L #sBlockgroesse //Anzahl (Wiederholungsfaktor)
T LW [AR1,P#2.0]
L #tDb_Nr //Datenbaustein
T LW [AR1,P#4.0]
L #tBlockoffset //Startadresse des ersten Bytes
T LD [AR1,P#6.0] //Ergebnis in Anypointer eintragen
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]
LAR1 P##tSaveBlock
L B#16#10 //10h für s7
T LB [AR1,P#0.0]
L B#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L #sBlockgroesse //Anzahl (Wiederholungsfaktor)
T LW [AR1,P#2.0]
L #sSave_DB //Datenbaustein
T LW [AR1,P#4.0]
L 0 //Startadresse des ersten Bytes
T LD [AR1,P#6.0] //Ergebnis in Anypointer eintragen
L B#16#84 //Speicherbereich (DB)
T LB [AR1,P#6.0]
U #iStart //bei Start
FP #tsm1 //pos. Flanke Sortieren
SPBN M001
AUF "DB3 Sortierung" //Aufruf Daten DB
L #sStartadresse //laden der Anfangsadresse
M003: LAR1
SET //Setze VKE 1
S #oSort_done //Setze Sortierung 1 Wert fertig
L #iAnz_Werte //Anzahl der Werte laden
L 1 // -1
-I
M004: T #sCount //Schleifenzaehler
AUF "DB3 Sortierung" //Auruf Sortier DB
L #sMD1 //Adresse Vergleichsbyte 1
T #tMD1
SLD 3
LAR1
L DBB [AR1,P#0.0]
T #sVergleichswert1
L #tMD2
SLD 3
LAR1
L DBB [AR1,P#0.0]
T #sVergleichswert2
L #sVergleichswert1
L #sVergleichswert2
<=I //Vergleichsyte 1 kleiner gleich Vergleichsbyte 2
SPB M002
LAR1 P##tVergleichsblock1
L #tMD1 //Speicherbereich (hier DB)
T LD 6 //Ergebnis in Anypointer eintragen
LAR1 P##tVergleichsblock2
L #tMD2 //Speicherbereich (hier DB)
T LD 6 //Ergebnis in Anypointer eintragen
CALL "BLKMOV" //Vergleichsblock1 zwischenspeichern
SRCBLK :=#tVergleichsblock1
RET_VAL:=#tRetval
DSTBLK :=#tSaveBlock
CALL "BLKMOV" //Vergleichsblock2 in Vergleichsblock1 schieben
SRCBLK :=#tVergleichsblock2
RET_VAL:=#tRetval
DSTBLK :=#tVergleichsblock1
CALL "BLKMOV" //gespeicherten Vergleichsblock1 in Vergleiochsblock2 schieben
SRCBLK :=#tSaveBlock
RET_VAL:=#tRetval
DSTBLK :=#tVergleichsblock2
SET //Setze VKE 1
R #oSort_done //Rücksetze Sortierung 1 Wert fertig
SPB M002
M002: L #tMD2 //Vergleichsadresse 2 in Vergleichsadresse 1 transferieren
T #tMD1
T #sMD1
L #tMD2
L #sBlockoffset // addieren des Blockoffsets zur Adresse des Vergleichsblock2
+D
T #tMD2
T #sMD2
L #sCount //Schleifenzaehler laden
LOOP M004
UN #oSort_done //Wenn Sortierung fuer 1 Wert nicht fertig
SPB M003
M001: NOP 0