Sortieren von DINT Werten mit Bubblesort Methode

hermann67

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
bin noch Anfänger und habe folgendes Problem:
Ich muß 12 DINT Werte in einem DB aufsteigend sortieren und habe mir dazu den untenstehenden FC1
bei Siemens runtergeladen. Dieser funktioniert mit INT Werte. Kann mir jemand sagen, ob ich diesen FC durch
umschreiben auch für DINT Werte nutzen kann ?? und wenn ja wie mach ich das.

schon mal vielen Dank für eure Hilfe.




FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
Data_DB : BLOCK_DB ;
DB_length : WORD ;
END_VAR
VAR_TEMP
Sort_done : BOOL ;
Temp : WORD ;
Count : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =Sort a Data Block using the bubble sort method
//Data Block will be sorted in ascending order.
//
AUF #Data_DB; //Open Data Block
M002: LAR1 P#DBX 0.0;
SET ; //LET #Sort_done = TRUE
S #Sort_done;
L #DB_length;
L 1;
-I ;
Loop: T #Count; //FOR INDEX = Count TO DB_length
L W [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN
L W [AR1,P#2.0];
<=I ;
SPB M003;
// change M(INDEX+1) for M(INDEX)
L W [AR1,P#0.0]; //LET TEMP = M(INDEX)
T #Temp;
L W [AR1,P#2.0]; //LET M(INDEX) = M(INDEX+1)
T W [AR1,P#0.0];
L #Temp; //LET M(INDEX+1) = TEMP
T W [AR1,P#2.0];
SET ;
R #Sort_done; //LET #Sort_done = FALSE
M003: TAR1 ;
L 16; //NEXT INDEX
+D ;
LAR1 ;
L #Count;
LOOP Loop; //End of sorting pass
UN #Sort_done; //If sorting is not done
SPB M002; //Jump Conditionally to M002
BE ;


END_FUNCTION
 
Code:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
Data_DB : BLOCK_DB ; 
DB_length : WORD ; 
END_VAR
VAR_TEMP
Sort_done : BOOL ; 
[COLOR=#b22222]Temp : DWORD ; [/COLOR]
Count : WORD ; 
END_VAR
BEGIN
NETWORK
TITLE =Sort a Data Block using the bubble sort method
//Data Block will be sorted in ascending order.
//
AUF #Data_DB; //Open Data Block
M002: LAR1 P#DBX 0.0; 
SET ; //LET #Sort_done = TRUE
S #Sort_done; 
L #DB_length; 
L 1; 
-I ; 
Loop: T #Count; //FOR INDEX = Count TO DB_length
[COLOR=#b22222]L D [AR1,P#0.0];[/COLOR] //IF M(INDEX) > M(INDEX+1) THEN
[COLOR=#b22222]L D [AR1,P#4.0]; [/COLOR]
[COLOR=#b22222]<=D ;[/COLOR] 
SPB M003; 
// change M(INDEX+1) for M(INDEX)
[COLOR=#b22222]L D [AR1,P#0.0];[/COLOR] //LET TEMP = M(INDEX)
T #Temp; 
[COLOR=#b22222]L D [AR1,P#4.0];[/COLOR] //LET M(INDEX) = M(INDEX+1)
[COLOR=#b22222]T D [AR1,P#0.0];[/COLOR] 
L #Temp; //LET M(INDEX+1) = TEMP
[COLOR=#b22222]T D [AR1,P#4.0];[/COLOR] 
SET ; 
R #Sort_done; //LET #Sort_done = FALSE
M003: TAR1 ; 
L 32; //NEXT INDEX
+D ; 
LAR1 ; 
L #Count; 
LOOP Loop; //End of sorting pass
UN #Sort_done; //If sorting is not done
SPB M002; //Jump Conditionally to M002
BE ;


Ist aber nicht getestet
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Aventinus,
erstmal Danke, aber funktioniert so nicht.
Habe den FC umgeschrieben und getestet.
Aufruf in OB1: CALL FC 1
Data_DB :=DB24
DB_length:=W#16#C
NOP 0

Der DB sieht dann so aus:DB_VAR DINT L#10000 L#0
DB_VAR1 DINT L#200000 L#0
DB_VAR2 DINT L#100000 L#0
DB_VAR3 DINT L#12345678 L#0
DB_VAR4 DINT L#87654321 L#10
DB_VAR5 DINT L#0 L#100
DB_VAR6 DINT L#2147483647 L#200
DB_VAR7 DINT L#1000 L#200
DB_VAR8 DINT L#60000000 L#300
DB_VAR9 DINT L#40000000 L#400
DB_VAR10 DINT L#22222222 L#500
DB_VAR11 DINT L#1 L#700

Habe ich vielleicht noch irgendwas falsch gemacht??
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
L 32; //NEXT INDEX war mir auch aufgefallen und von vornherein mit umgeschrieben.
Mach ich vielleicht noch einen anderen Fehler?
Die Aktuellwerte im DB ändern sich nicht, auch wenn ich andere Anfangswerte reinschreibe.
 
bei mir funktioniert es, allerdings musst du beim Aufruf noch die richtige Länge angeben.

Bei deinen 11 Einträgen ist das dann W#16#B und nicht W#16#C.
 
Habe im DB die Anfangswerte anstatt Aktuellwerte geändert.
Deshalb lief es nicht. Bin halt Anfänger.

Vielen Dank

mfG hermann67
 
Zurück
Oben