TIA Strukturinhalte fortlaufend in Strukturen in Arrays kopieren

Ralf DD

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

eine Struktur aus drei Variablen mit unterschiedlichen Datentypen soll, z.B. im Sekundentakt, in eine gleiche Struktur, eingebettet in ein Array [0..10] of Struct, kopiert werden, aber mit aufsteigendem Index.
Mit FieldWrite funktioniert das Schreiben in Array-Elemente mit aufsteigendem Index wunderbar, Strukturen werden aber abgelehnt, da Struct nicht zu den auswählbaren Datentypen zählt.
Ich habe mich u.a. mit den Variant-Anweisungen beschäftigt, finde aber keine passende Lösung.
Da SCL noch nicht zu meinen bevorzugten Sprachen zählt, freue ich mich auf Eure Lösungsvorschläge in KOP/FUP oder in verständlichem Deutsch. ;)

Vielen Dank!
Ralf
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.
Aber:
Bei Array[0..10] 11x Move, um die 11 Adressen zu erreichen? Bei Array [1..1000] dann 1000 Movebefehle? Ich möchte die aktuellen Werte auf aufsteigende Adressen/Indizes schreiben. Gibt es bei Move einen Trick, um an Out auf immer neue Adressen zu zeigen?
Gruß
Ralf
 
Ich würde hier zu Typisierten Strukturen "UDT" greifen - UDT auf gleich UDT kopieren geht und Array vom Typ UDT anlagen geht auch.
Strukturen sind ja nicht typisierte Zusammenstellungen von Variablen, jede Struktur kann anders sein - wie soll das ein Kompiler handeln beim vergleich oder kopieren? :)
 
Ich würde hier zu Typisierten Strukturen "UDT" greifen - UDT auf gleich UDT kopieren geht und Array vom Typ UDT anlagen geht auch.
Strukturen sind ja nicht typisierte Zusammenstellungen von Variablen, jede Struktur kann anders sein - wie soll das ein Kompiler handeln beim vergleich oder kopieren? :)

Ja grundsätzlich sollte man für sowas einen UDT (Step7 5.x) bzw. einen PLC-Datentyp (TIA) verwenden. Damit ist es definitiv sauberer programmiert und man stößt auf weniger Hindernisse. ABER das kopieren geht auch mit unterschiedlichen Strukturen durch einen Pointer (ggfs. dann nicht symbolisch), es müssen nur beide Strukturen gleich groß sein, der Inhalt ist egal. Der UDT ist aber sicherlich die deutlich schönere/bessere Variante. Damit gehts dann auch in SCL sehr einfach.

@Ralf DD:
Für deinen Anwendungsfall wäre SCL sicherlich sinnvoll. Auch wenn du da keine Erfahrung hast sollte das für dich kein Problem sein, da das in SCL nur ein Micro Programm ist. Du kannst nämlich einfach den Index des Array Elements als Variable verwenden.

Ein Beispiel:
Trigger ist ein Bool den du einmal pro Sekunde setzt,
INDEX ist ein Integer,
die beiden Variablen können z.B. in einem deiner Global DBs stehen.

Code:
IF Trigger = TRUE THEN
    "DB2".ARRAY_STRUCT[INDEX] := "DB1".STRUCT_AKTUELL; //Beides vom gleichen UDT!
    INDEX := INDEX + 1;
END_IF;

Vielleicht hilft dir das ja.

Gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die bisherigen Antworten! Nächste Woche werde ich mich mit der Lösung beschäftigen, fange mit den Tipps von Stoky an. Aktuell klaut mir ein anderes Projekt die Zeit. Bin gespannt!
Ralf
 
Zurück
Oben