Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Sortieren von DINT Werten mit Bubblesort Methode

  1. #1
    Registriert seit
    17.10.2012
    Beiträge
    6
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Sortieren von DINT Werten mit Bubblesort Methode  

  2. #2
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    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 ; 
    Temp : DWORD ; 
    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 D [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN
    L D [AR1,P#4.0]; 
    <=D ; 
    SPB M003; 
    // change M(INDEX+1) for M(INDEX)
    L D [AR1,P#0.0]; //LET TEMP = M(INDEX)
    T #Temp; 
    L D [AR1,P#4.0]; //LET M(INDEX) = M(INDEX+1)
    T D [AR1,P#0.0]; 
    L #Temp; //LET M(INDEX+1) = TEMP
    T D [AR1,P#4.0]; 
    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
    mfG Aventinus

  3. #3
    hermann67 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2012
    Beiträge
    6
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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??

  4. #4
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    hier noch eine winzige Kleinigkeit, die Aventinus nicht rot gekennzeichnet hat:
    Code:
    L 32; //NEXT INDEX

  5. Folgender Benutzer sagt Danke zu Perfektionist für den nützlichen Beitrag:

    hermann67 (20.11.2012)

  6. #5
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Sorry, stimmt.
    mfG Aventinus

  7. #6
    hermann67 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2012
    Beiträge
    6
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  8. #7
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    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.
    mfG Aventinus

  9. Folgender Benutzer sagt Danke zu Aventinus für den nützlichen Beitrag:

    hermann67 (20.11.2012)

  10. #8
    hermann67 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2012
    Beiträge
    6
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe im DB die Anfangswerte anstatt Aktuellwerte geändert.
    Deshalb lief es nicht. Bin halt Anfänger.

    Vielen Dank

    mfG hermann67

Ähnliche Themen

  1. Byteweise auslesen von DINT-Werten
    Von schneijo im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 20.01.2011, 11:13
  2. DINT nach INT bei positiven und ganzzahligen Werten (Frequenzmessung)
    Von poppycock im Forum Programmierstrategien
    Antworten: 9
    Letzter Beitrag: 23.07.2009, 21:28
  3. Bubblesort in ST
    Von timod79 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.02.2009, 09:07
  4. Bubblesort
    Von Milo_M im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 05.02.2008, 06:28
  5. Antworten: 9
    Letzter Beitrag: 19.04.2005, 13:46

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •