Strukturkomponenten sortieren

nutellahase

Level-2
Beiträge
180
Reaktionspunkte
28
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen!

Da ich jetzt wieder im Nachtdienst bin, habe ich etwas mehr Zeit mich mit dem Thema SCL zu beschäftigen.

Ich betreibe gerne das "learning by doing", also hab ich mir gedacht ich mache folgendes:

Ich habe eine CPU (315-2DP; Step7 Prof. V5.4) wo ich ein Eingangsbyte bitweise einlese. Sobald eine Flanke am Eingang kommt, soll mir die aktuelle Systemzeit und ein bestimmter Wert in einem globalen DB (="unsortiert") geschrieben werden.

Das hab ich hinbekommen. Probleme (und jetzt auch schon Kopfschmerzen) bereitet mir das Sortieren der Daten! Die Daten aus dem DB "unsortiert" sollen nach der Systemzeit in einem anderen (globalen) DB (="sortiert") sortiert werden.

Nun habe ich in der Hilfe von SCL ein Beispiel mit dem Bubblesort-Algorithmus gefunden! Aber ich bekomme es einfach nicht hin (vl. liegts ja an der Strukturkomponente...)

Ein Beispiel:

Bit E0.1 wird heute um 06:03:20s eingelesen, die Systemzeit und ein Integerwert (=1 für Bit 1) in ein Array of Struct im DB geschrieben.
Bit E0.0 wird heute um 06:03:50s eingelesen, die Systemzeit und ein Integerwert(=0 für Bit 0) in den DB eingetragen.
So, nun soll mir das Programm das Array mittels Bubblesort durchsuchen.

Dabei will ich aber nur nach der Systemzeit sortieren! Wenn getauscht werden muss, muss der Integerwert der Strukturkomponente mitkopiert werden!

Und ich bin mir nicht sicher ob es überhaupt so geht, hier erstmal der Code (ev. auch auf die Kommentare achten..):

Code:
FUNCTION_BLOCK FB2

VAR_INPUT
        unsort: ARRAY [0..7] OF 
    STRUCT
        Zeit:Date_and_Time;
        Nummer:INT;
    END_STRUCT;
END_VAR

VAR_OUTPUT
    sort:ARRAY [0..7] OF
    STRUCT
        Zeit:DATE_AND_TIME;
        Nummer:INT;
    END_STRUCT;
END_VAR


VAR
tauschen:BOOL;
index:INT;
Hilfsmerker:DATE_AND_TIME;
HIlfsmerker_1:INT;
END_VAR

BEGIN
REPEAT
      tauschen:=false;
      FOR index:=0 TO 7 DO   // Angenommen index = 0
        IF unsort[index].Zeit > unsort[index + 1].Zeit THEN   //Ist der Wert in Zeile unsort[0].Zeit größer als in Zeile unsort[1].Zeit? Wenn ja dann...
           Hilfsmerker:= unsort[index + 1].Zeit;  //Schreibe den Wert aus Zeile unsort[1].Zeit in den Hilfsmerker
           Hilfsmerker_1:= unsort[index + 1]. Nummer;   // schreibe den Wert aus Zeile unsort[1].Nummer in den Hilfsmerker
           unsort[index + 1].Zeit:=unsort[index].Zeit;  // Schreibe Inhalt aus Zeile 1 in Zeile 0 (also immer direkt in die Strukturkomponente)
           unsort[index + 1].Nummer:=unsort[index].Nummer; //Schreibe Inhalt aus Zeile 1 in Zeile 0
           unsort[index].Zeit:= Hilfsmerker;   // Schreibe Inhalt aus Hilfsmerker in Zeile 0
           unsort[index].Nummer:= Hilfsmerker_1; // Schreibe Inhalt aus Hilfsmerker in Zeile 0
           tauschen:= true;   // setze tauschen auf true
           sort[index].Zeit:= unsort[index].Zeit;              // kopiere von Zeile 0 (Db1) in die Zeile 0 des (DB2) ???? Stimmt meine Überlegung überhaupt??
           sort[index].Nummer:=unsort[index].Nummer; // 
         END_IF;
    END_FOR;
UNTIL NOT tauschen
END_REPEAT;   
    
END_FUNCTION_BLOCK
Stimmt das überhaupt mit der Schnittstelle? Kann ich Strukturen so einlesen? Ich hab neben div. CPU Stops es nur einmal geschafft dass ich immer in Zeile 0 (sprich ganz oben) den zuletzt geflankten Eingang habe (der aber eigentlich ganz unten stehen sollte)!

Wie schnell eine Nacht vergehen kann wenn man verzweifelt etwas versuchen will. ;)

Leider habe ich nur in der Arbeit die Möglichkeit das zu testen. Wisst ihr woher ich eine günstige Trial-Version herbekomme? Dann könnte ich das auch zu Hause simulieren/testen!

Hier sind noch Screenshots von dem DB (der andere ist identisch aufgebaut) und dem Aufruf im OB1.

Vielen Dank im Voraus.
 

Anhänge

  • DB_Strukturaufbau.jpg
    DB_Strukturaufbau.jpg
    60,6 KB · Aufrufe: 18
  • Bausteinaufruf im OB1.png
    Bausteinaufruf im OB1.png
    4 KB · Aufrufe: 21
Zurück
Oben