# Kopieren von Strukturen



## byfluffy (4 Februar 2022)

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.


```
"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:


```
"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


----------



## hucki (4 Februar 2022)

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?


----------



## byfluffy (4 Februar 2022)

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.


```
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;
```


----------



## hucki (4 Februar 2022)

Dann müsste #io_delete_Status schon wieder gesetzt werden, bevor neue Part-Daten eingefügt wurden.



OT:


byfluffy schrieb:


> ```
> IF #io_delete_Status THEN
> ...
> #io_delete_Status := 0;
> ...


Ich liebe es, wenn auf Bool-Variablen mit INT und impliziter Wandlung zugegriffen wird...


----------



## byfluffy (4 Februar 2022)

Habe es gerade noch einmal getestet. Die Funktion wird zweimal aufgerufen.

Vielen Dank für die Hilfe.

MfG Olli


----------



## DOD666 (11 Februar 2022)

hucki schrieb:


> Dann müsste #io_delete_Status schon wieder gesetzt werden, bevor neue Part-Daten eingefügt wurden.
> 
> 
> 
> ...


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ß


----------



## Mrtain (12 Februar 2022)

Ok, aber ein Boolean hat meines Wissens nur true oder false. Oder ich verstehe deine Absicht falsch


----------



## DOD666 (12 Februar 2022)

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.


----------



## Mrtain (12 Februar 2022)

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.


----------



## hucki (12 Februar 2022)

DOD666 schrieb:


> 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.


Aber eben nur 1 und keine 16 Bit, was zumindest die Umgebungen, die ich kenne, aus der allgemeinen Angabe 0 und 1 automatisch machen.


----------



## DOD666 (12 Februar 2022)

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?


----------



## PN/DP (12 Februar 2022)

DOD666 schrieb:


> 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


----------



## hucki (12 Februar 2022)

DOD666 schrieb:


> True und false sind doch nur konstanten in TIA die 1 und 0 repräsentieren.


TRUE und FALSE sind keine Konstanten sondern die Werte:



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.


----------

