Step 7 Bubblesort von 2000 Produkte

Vokal12

Level-1
Beiträge
27
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
mich würde interessieren, wie das Algorithmus im SCL nur mit IF-Anweisung aussehen wird. ich habe schon ein programm für 40 produkte und dies aber gut geklappt.
MfG
LG
Vokal
 
Hallo Zusammen,
mich würde interessieren, wie das Algorithmus im SCL nur mit IF-Anweisung aussehen wird. ich habe schon ein programm für 40 produkte und dies aber gut geklappt.
MfG
LG
Vokal

Wo ist dein Problem, was mit 40 geht, sollte auch mit 2000 funktionieren, es sei denn deine maximale Zykluszeit wird erreicht.
 
Der Vorteil von IF-anweisung, wäre ja ein zyklusübergreifendes Sortieren und sollte nicht schwer zu realisieren sein.
So ganz ohne Abbruch und Startbedingung einfachster Ansatz:

Code:
IF Produkt[i] > Produkt[i+1] 
    THEN Zwischenspeicher := Produkt[i]; 
          Produkt[i] := Produkt[i+1]; 
          Produkt[i+1] := Zwischenspeicher; 
          Unsortiert := TRUE;
EndIf;

i := i+1;

IF i>=2000
 THEN 
    IF Unsortiert :=  TRUE
      THEN i=0; 
       Unsortiert := FALSE;
    ELSE
        Sortiert := TRUE;
    EndIF;
EndIF;

Es gibt aber auch noch andere Algorithmen zum Sortieren mit mehr Code, die aber schneller sind.
MfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
REPEAT
Sort_Change:= False;
FOR i:=1 TO 2000 BY 1 DO ;
IF (DB1.Nummer) > (DB1.Nummer[i+1]) THEN
hilf:=DB1.Nummer;
DB1.Nummer:=DB1.Nummer[i+1];
DB1.Nummer[i+1]:=hilf;
Sort_Change:=True;
END_IF;

END_FOR;

UNTIL NOT Sort_Change
END_REPEAT;

Der Fehler war mit Zeitzyklus verbunden. ich will am Ende meinen sortierten DB1 in DB2 kopieren.
MfG
Vokal
 
Für N Datenpunkte wächst der Aufwand für Bubblesort mit n^2.
Bessere Sortieralgorithmen kommen hier auf n*log2(n).
Deine innere (die FOR-)Schleife braucht nur beim ersten Mal bis 2000 zu laufen, danach würde jedesmal eins weniger genügen.

Mußt du deine Daten innerhalb eines Zyklus sortieren?
Meiner Meinung nach ist es keine gute Idee, da es im Grunde die Echtzeitfähigkeit der SPS aushebelt.
Es belastet einen einzigen Zyklus mit 4000000 Ausführungen der inneren Schleife!

Der folgende Code führt eine Operation der inneren Schleife in jedem Zyklus aus:
Code:
// anstossZumSortieren: ein Merker, den du einmal setzt, um den Vorgang zu starten.
IF anstossZumSortieren THEN // initialisieren
  SortierenLaeuft:=true;
  SortChange:=false;
  innereZyklen=:2000;
  i:=0;
  anstossZumSortieren:=false;
END_IF


IF SortierenLaeuft THEN  // Zustand von Sort_Change aus dem letzten Zyklus

    IF (DB1.Nummer[i]) > (DB1.Nummer[i+1]) THEN 
             hilf:=DB1.Nummer[i];
             DB1.Nummer[i]:=DB1.Nummer[i+1];
             DB1.Nummer[i+1]:=hilf;
             Sort_Change:=True;
        END_IF;
           
i:=i+1; // das ist das i für den nächsten Zyklus
IF (i>innereZyklen) THEN 
  IF (NOT Sort_Change) THEN SortierenLaeuft:=FALSE; END_IF; // nix mehr zu sortieren;
  i:=0; // wieder bei 0 beginnen
  Sort_Change:=FALSE;
  innereZyklen=:innereZyklen-1;
END_IF;

END_IF;

Das braucht dann (n^2-n)/2 oder ungefähr 2 Millionen Zyklen. Wäre also bei 5ms Zykluszeit 100000 Sekunden zugange.
Wenn das nicht tragbar ist, kann man jetzt den obigen Code in einer Schleife z.B. 1000 mal ausführen.
 
Nachtrag:
Als Nächstes solltest du überlegen, wie oft sich eigentlich die Daten ändern, die du mühsam sortierst. Wenn der größte Teil gleich bleibt und nur selten etwas dazukommt, ist es besser, die neu hinzukommenden Daten in die sortierten Daten einzusetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das braucht dann (n^2-n)/2 oder ungefähr 2 Millionen Zyklen. Wäre also bei 5ms Zykluszeit 100000 Sekunden zugange.

ach du Pessimist :ROFLMAO:

Nachtrag:
Als Nächstes solltest du überlegen, wie oft sich eigentlich die Daten ändern, die du mühsam sortierst. Wenn der größte Teil gleich bleibt und nur selten etwas dazukommt, ist es besser, die neu hinzukommenden Daten in die sortierten Daten einzusetzen.

oder doch Optimist:rolleyes:
 
Zurück
Oben