Sortierbasutein mit Any Pointer

Andere Sortierreihenfolge?

Muss nochmal nachhaken: Wenn ich die Sortierreihenfolge umdrehen will, wie müsste ich da vorgehen? Ich bräuchte den 1.Wert der größer ist als 0 an oberster Position.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss nochmal nachhaken: Wenn ich die Sortierreihenfolge umdrehen will, wie müsste ich da vorgehen? Ich bräuchte den 1.Wert der größer ist als 0 an oberster Position.

Jetzt mal ohne groß darüber nachzudenken würde ich sagen da wo auf >D verglichen wird auf <D vergleichen.
 
Das bringt mir den grössten Wert an unterste Position, und wenn einige Nullwerte dabei sind habe ich die an den ersten Positionen
 
Das bringt mir den grössten Wert an unterste Position, und wenn einige Nullwerte dabei sind habe ich die an den ersten Positionen

Das ist richtig, du kannst aber auch vor der Überprüfung auf <D die Werte auf 0 prüfen und in diesem Fall sie wie sehr große Werte (den maximal erreichbaren) behandeln und so die Tauschfunktion überspringen. Dann sollten zum Schluss die 0 Werte an den letzten Positionen stehen.

Noch eine Möglichkeit wäre, auf 0 zu prüfen und wenn ja dort wo eine 0 ist den maximal möglichen Wert (+2147483647) hin zu transferieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
nicht ganz richtig

Stimmt nicht ganz, hat mich aber auf den (hoffentlich?) richtigen Weg gebracht: Wenn der "Wert 1" 0 ist, muss ich auf jedenfall tauschen.
Tauschen muss ich überspringen, wenn der "Wert 2" 0 ist.
Habs mal überarbeitet und probiert, so scheints zu gehen:


Code:
Netzwerk 1: Register sichern
 
      L     DBNO                        // DB-Register
      T     #DB_REGISTER
      TAR1  #AR1_REGISTER               // AR1-Register
 
 
Netzwerk 2: Bubblesort
 
      AUF   #DATENBAUSTEIN              // Datenbaustein
      L     #STARTADRESSE               // Startadresse
      ITD   
      SLD   3
      T     #BEREICHSZEIGER             // Bereichszeiger
      L     #BLOCKANZAHL                // Blockanzahl
      L     1
      -I    
M01:  T     #SCHLEIFE_1
      L     #BEREICHSZEIGER             // Bereichszeiger
      LAR1  
      L     #SCHLEIFE_1
M02:  T     #SCHLEIFE_2
 
      L     0
      L     DBD [AR1,P#0.0]             // Wert 1-1
      ==D   
      SPB   M04
      L     0
      L     DBD [AR1,P#8.0]             // Wert 2-1
      ==D   
      SPB   M03
      L     DBD [AR1,P#0.0]             // Wert 1-1
      <D    
      SPBN  M03
M04:  L     DBD [AR1,P#0.0]             // Wert 1-1
      L     DBD [AR1,P#8.0]             // Wert 2-1
      T     DBD [AR1,P#0.0]             // Wert 2-1 => Wert 1-1
      TAK   
      T     DBD [AR1,P#8.0]             // Wert 1-1 => Wert 2-1
      L     DBD [AR1,P#4.0]             // Wert 1-2
      L     DBD [AR1,P#12.0]            // Wert 2-2
      T     DBD [AR1,P#4.0]             // Wert 2-2 => Wert 1-2
      TAK   
      T     DBD [AR1,P#12.0]            // Wert 1-2 => Wert 2-2
M03:  L     P#8.0
      +AR1  
      L     #SCHLEIFE_2
      LOOP  M02
      L     #SCHLEIFE_1
      LOOP  M01
 
Netzwerk 3:  Register wiederherstellen
 
      AUF   DB [#DB_REGISTER]
      LAR1  #AR1_REGISTER

Die Bausteine hab ich mal angehängt, Bitte mal prüfen ob ich was übersehen habe.
 

Anhänge

  • Bubble_1.zip
    38 KB · Aufrufe: 11
  • FC100.pdf
    17 KB · Aufrufe: 10
Stimmt nicht ganz, hat mich aber auf den (hoffentlich?) richtigen Weg gebracht: Wenn der "Wert 1" 0 ist, muss ich auf jedenfall tauschen.
Tauschen muss ich überspringen, wenn der "Wert 2" 0 ist.
Habs mal überarbeitet und probiert, so scheints zu gehen:

Hallo,
ja sorry, dass mit dem Tauschen wenn der "Wert1"(DBD [AR1,P#0.0]) 0 ist stimmt natürlich, sonst bleibt der ja einfach stehen wo er ist (hoffe ich habe nicht für zu viel Verwirrung gesorgt).
Deine Lösung sieht jetzt aber mal sehr vielversprechend aus. Testen kann ichs im Moment leider nicht.
 
Fertigmeldung ausgeben

Mal noch ne Frage:
Hab derzeit noch keine Peripherie ums auszuprobieren und ich denke die Simulation mit PLC-Sim ist hierfür nicht wirklich aussagekräftig.
Wenn ich bei 100 Datenblöcken ca. 4950 Durchläufe brauch, wäre eine Fertigmeldung, die mir anzeigt "Sortieren abgeschlossen" hilfreich.
Reicht es hierfür aus, hinter der letzen Schleife ein Bit zu setzen?
Zweite Frage:
Wie wirken sich die 4950 Durchläufe auf die Zyklus-Zeit aus?
Wenn ich das richtig verstehe werden die 4950 Durchläufe in einem Zyklus gemacht oder seh ich das falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Bit nach dem Beenden der letzten Schleife zu setzen sollte ausreichen (z.B. in NW3). Du musst es aber auch irgendwann wieder zurücksetzen.

Die Auswirkung auf die Zykluszeit hängt von deiner CPU ab, sollte aber nicht dramatisch sein falls dich nicht schon in einem kritischen Bereich bewegst.

Die Sortierung (also die 4950 Durchläufe) wird in einem Zyklus abgearbeitet.
 
Ich stell mir das so vor, das ich dieses Bit als "in-Out" deklariere und die Schleife nur bearbeite wenn das Bit 0 ist. Dann kann ich das Bit von Aussen zurücksetzen und damit die Sortierung anstossen.
CPU wird ne 319, die sollte damit keine Probleme haben.
Problematisch wäre das sicher nur wenn die 4950 jedesmal einen Zyklus bräuchten, das wären bei einer Zyklus-Zeit von 5 ms knapp 25 sek.....
 
Ich stell mir das so vor, das ich dieses Bit als "in-Out" deklariere und die Schleife nur bearbeite wenn das Bit 0 ist. Dann kann ich das Bit von Aussen zurücksetzen und damit die Sortierung anstossen.
CPU wird ne 319, die sollte damit keine Probleme haben.
Problematisch wäre das sicher nur wenn die 4950 jedesmal einen Zyklus bräuchten, das wären bei einer Zyklus-Zeit von 5 ms knapp 25 sek.....

Das mit dem Bit und das es mit ner 319er keine Probleme gibt ist soweit ok.
Aber mit der Berechnung deiner Zykluszeit komme ich nicht ganz mit. Wenn du eine Zykluszeit von 5ms hast, wird der Baustein innerhalb dieser 5ms bearbeitet. Er ist ja ein Teil deines Zyklus und benutzt nicht einen Zyklus oder habe ich da jetzt was nicht ganz verstanden?
 
Zurück
Oben