[CODESYS] "Zeile" eines Arrays nach einer Spalte sortieren

zock3r1608

Level-1
Beiträge
15
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich möchte gerne eine Zeile in einem mehrdimensionalen Array nach einer Spalte sortieren. Die Funktion ARRAY_SORT aus OSCAT sortiert nur die erste Spalte / Index eines Arrays und ist daher nicht nützlich.

Ein Beispiel zur Veranschaulichung: In dem Screenshot ist die Batterienummer und ein Messwert in einem Array. Diese sollen nach dem Messwert sortiert werden. Mir bringt es aber nichts, wenn der kleinste Messwert oben im Array steht, wenn die zugehörige Batterienummer nicht mitsortiert wird und ich nicht weiß welche Batterie welchen Messwert hat.

Gibt es dafür vorhandene Funktionsblöcke oder muss man die ganzen Sortieralgorhytmen vom TG wieder herauskramen und selbst hand anlegen?

Was wäre die best practice bei solchen Vorgängen?

Danke & Gruß
Carsten
 

Anhänge

  • Battery.PNG
    Battery.PNG
    16,1 KB · Aufrufe: 36
Hi,

so habe nun den BubbleSort umgesetzt und lasse die erste Spalte des mehrdimensionalen Arrays einfach mitsortieren. Ging einfacher als Gedacht, ob das Effizient ist weiß ich allerdings nicht.
Falls andere eine Inspiration brauchen, hier meine Umsetzung:

Code:
IF Sort_USV1 THEN 
    REPEAT
        Sorting_Done := FALSE;
        FOR j:= 1 TO 39 BY 1 DO
        IF PersistentVars.Tabelle_USV1_Sorted[2,j] > PersistentVars.Tabelle_USV1_Sorted[2,j+1] THEN
            Temp_Sort := PersistentVars.Tabelle_USV1_Sorted[2,j+1];
            Temp_Sort2 := PersistentVars.Tabelle_USV1_Sorted[1,j+1];
            PersistentVars.Tabelle_USV1_Sorted[2,j+1] := PersistentVars.Tabelle_USV1_Sorted[2,j];
            PersistentVars.Tabelle_USV1_Sorted[1,j+1] := PersistentVars.Tabelle_USV1_Sorted[1,j];
            PersistentVars.Tabelle_USV1_Sorted[2,j] := Temp_Sort;
            PersistentVars.Tabelle_USV1_Sorted[1,j] := Temp_Sort2;
            Sorting_Done := TRUE;
            END_IF
        END_FOR
    UNTIL NOT Sorting_Done
    END_REPEAT
Sort_USV1 := FALSE;
END_IF
 
Zurück
Oben