Kopieren von Strukturen

wollbit

Level-2
Beiträge
53
Reaktionspunkte
8
Guten Morgen zusammen,

ich habe in meinem aktuellen Projekt an einer bestehenden Anlage mehrere Werkzeugträger (WTs).
Für jeden dieser WTs gibt es eine Struktur, die alle Werkstückspezifischen Daten enthält. (Array / UDTs) Etwa 3000 Byte groß.

Sobald ein WT an die Grundposition zurückkehrt, wird der Inhalt überschrieben. Dafür wird eine leere Struktur in den WT kopiert.

Code:
"DB_Part".WT[#WT_Nr] := "DB_Part".WT[0]; // WT[0] ist leer

Soweit funktioniert das auch alles.


Ich soll die Daten des letzten WTs zwischenspeichern, damit diese visualisiert werden können.
Meine Überlegung war:

Code:
"DB_Part".WT_last := "DB_Part".WT[#WT_Nr];
"DB_Part".WT[#WT_Nr]  := "DB_Part".WT[0]; // WT[0] ist leer

Dies funktioniert gelegentlich!?
Mal wird es richtig kopiert, ein anderes Mal ist die Struktur leer.
Ich bin jetzt davon ausgegangen, dass der Befehl der ersten Zeile erst komplett abgearbeitet werden muss, bevor der nächste Befehl ausgeführt wird.
WT_Nr ist bei ausführen des Codes immer >0.


Hat jemand eine Idee?

MfG Olli
 
Wie bestimmst Du den Zeitpunkt, wann Dein Code ausgeführt wird?
Ist dabei sichergestellt, dass der Code nicht direkt mehrfach nacheinander (also z.B. in 2 aufeinanderfolgenden Zyklen) ausgeführt werden kann?
 
Der aktuelle Schritt der Schrittkette (Graph) setzt das Bit zum Löschen. (IO Variable einer Funktion)
Die Transitionsbedingung fragt ab, ob das Bit zurückgesetzt wurde.
Das mit den zwei Zyklen kann schon sein. Ich werde das einmal testen.

Code:
IF #io_delete_Status THEN
   
    "DB_Part".WT_last := "DB_Part".WT[#WT_Nr];
    
    "DB_Part".WT[#WT_Nr] := "DB_Part".WT[0];
    "DB_Part".WT[#WT_Nr].Allgemein.WT_Nr := #WT_Nr;
        
    #io_delete_Status := 0;
    ;
END_IF;
 
Dann müsste #io_delete_Status schon wieder gesetzt werden, bevor neue Part-Daten eingefügt wurden.



OT:

Ich liebe es, wenn auf Bool-Variablen mit INT und impliziter Wandlung zugegriffen wird...
:rolleyes:
Was ist da jetzt schlimm dran?
Ich muss das so machen, sonst kann ich meinen Code in Rockwell komplett ändern.
Bei mir muss ich auf einige Dinge achten um den Code schnell in eine etwas andere Herstellersprache wandeln zu können.

Gruß
 
Es ist ein Bit und es kann den Zustand 0 oder 1 haben. Das mit true und false ist nur Beiwerk um es dem Programmierer einfacher zu machen.
 
Oh, ich dachte es wäre ein einzelnes bool. Das dass ein bit ist, hab ich voll überlesen 😱
Bei bitstrukturen mach ich das auch so, wenn ich alle bits der Struktur löschen will.
 
True und false sind doch nur konstanten in TIA die 1 und 0 repräsentieren.
Siehe Handbuch.

Also warum was benutzen was nicht allgemeingültig ist?
 

Anhänge

  • Screenshot_20220212_161418_com.google.android.apps.docs~3.jpg
    Screenshot_20220212_161418_com.google.android.apps.docs~3.jpg
    221,6 KB · Aufrufe: 29
True und false sind doch nur konstanten in TIA die 1 und 0 repräsentieren.
Siehe Handbuch.

Also warum was benutzen was nicht allgemeingültig ist?
Nicht ganz. True und False sind boolsche Konstanten. Versuche doch mal, True und False an numerische Variablen (INT, UINT, ...) zuzuweisen...

Umgekehrt wird ein Schuh draus. Man sollte nicht numerische Werte 0 und 1 an BOOL-Variablen zuweisen, das verschlechtert unnötig die Verständlichkeit des Codes. Und verhindert ggf. eine Warnung, falls man sich beim Variablenname vertippt hat.

Harald
 
True und false sind doch nur konstanten in TIA die 1 und 0 repräsentieren.
TRUE und FALSE sind keine Konstanten sondern die Werte:
1644680920637.png

Und ja, Du hast Recht, dass TIA automatisch erkennt, dass auch mit 0 und 1 nur ein Bit verwendet werden soll.
In der Tabelle unter meinem obigen Hilfe-Ausschnitt ist es u.a. als mögliche Angabe mit aufgeführt.
Letztendlich ist alles nur "Strom fließt" oder "Strom fließt nicht", was irgendwie für uns verständlich dargestellt wird.

Für mich wirkt es jedenfalls seltsam, wenn ein Zahlenwert dafür verwendet wird.
Aber ich bin ja auch kein Programmierer.
 
Zuletzt bearbeitet:
Zurück
Oben