TIA Variable in einem Array of UDT adressieren

MrTrustMir

Level-2
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

vorhanden sei ein Array[0..10] eines UDTs mit verschiedensten Datentypen, unter anderem eine Variable "Count" mit dem Datentypen Int.
In einem FB benötige ich eben genau diese 10 Count-Werte. Das sauberste wär meiner Meinung nach ein Array[0..10] of Int als Eingang beim FB. Lässt sich das irgendwie realisieren oder muss man zwangsweise das gesamte Array of UDT als Eingang des FBs nutzen?

Was möglich wäre, ist als Eingang nur ein Int zu definieren und dann im FB eine Variable laufen lassen und pro Zyklus einen Eintrag des Arrays einlesen. Ist aber nicht das, was ich gerne hätte.

Viele Grüße

Trust

TIA V16, CPU 1512SP F-1 PN
 
In deinem Fall würde ich eher das ganze UDT nutzen.
Das macht aber eigentlich nichts, denn nicht das komplette UDT wird übergeben, sondern eine Referenz. Im FB ist allerdings so ein Zugriff intern mit etwas mehr Aufwand verbunden und kostet ein wenig Zykluszeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, das hatte ich mir schon gedacht.
Ich bin gerade nicht vor dem Rechner. Würde sich die Situation ändern, wenn es kein Array of UDT sondern ein Array of Struct wäre?
 
Moin,

Das ist egal da beides Strukturierte Datentypen sind.

Wichtig für dich ist nur das du bei einem FB den InOut nehmen solltest da nur dort die Referenz übergeben wird.

Du musst auch darauf achten das die Bausteine optimiert sind, ansonsten wird eine Kopie übergeben.

Im Programmierleitpfaden unter Kapitel 3.3 Bausteinschnittstellentypen findest du noch mehr Infos.

IMG_20220106_200346.jpg
 
Danke, das hatte ich mir schon gedacht.
Ich bin gerade nicht vor dem Rechner. Würde sich die Situation ändern, wenn es kein Array of UDT sondern ein Array of Struct wäre?
prinzipiell würde sich nichts ändern. Nur was hätte man davon für einen Vorteil?
Einen UDT kann ich überall als Datentyp für eine Variable angeben. Wenn ich eine Struct verwenden will, muss ich diese bei jeder Verwendung neu erstellen.

Hinweis:
Auch wenn die UDT dem Aufbau einer struct entspricht, kann man dann nur die Einzelelemente kopieren. Das gesamte Konstrukt kann man nicht kopieren, da ein UDT ein anderer Datentyp als ein struct ist.

Pseudocode:
Code:
Array1 | Array[0..9] of UDT1
Array2 | Array[0..9] of UDT1
Array3 | Array[0..9] of struct // wobei der Aufbau von struct dem UDT1 entspricht!

Array1[0] := Array2[0]; // geht!
Array1[0] := Array3[0]; // geht nicht!

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

Das ist egal da beides Strukturierte Datentypen sind.

Wichtig für dich ist nur das du bei einem FB den InOut nehmen solltest da nur dort die Referenz übergeben wird.

Du musst auch darauf achten das die Bausteine optimiert sind, ansonsten wird eine Kopie übergeben.

Im Programmierleitpfaden unter Kapitel 3.3 Bausteinschnittstellentypen findest du noch mehr Infos.
Da hast du Recht, ich hab mir anggewöhnt UDT fast immer als INOUT zu übergeben, da ich dann auch problemlos und vor allem Regelkonform Daten aus diesen lesen und schreiben kann. Warum Siemens bei dem FB einen Unterschied macht ist mir allerdings auch schleierhaft. Bringt das irgendeinen Nutzen, dort eine Kopie zu übergeben? Evtl. ist der Zugriff auf die Kopie im FB schneller?
 
.. Du musst auch darauf achten das die Bausteine optimiert sind, ansonsten wird eine Kopie übergeben...
Ich hoffe mal, dass das nicht ganz richtig ist. Es sollten entweder beide Bausteine optimiert, oder beide Bausteine nicht optimiert sein, damit für den Zugriff Referenzen verwendet werden.

Allerdings ist die Unterscheidung optimiert/nicht optimiert für die weitere Bearbeitung im Baustein von großer Bedeutung. Hier bietet "optimiert" wohl die besseren Möglichkeiten.
 
Da hast du Recht, ich hab mir anggewöhnt UDT fast immer als INOUT zu übergeben, da ich dann auch problemlos und vor allem Regelkonform Daten aus diesen lesen und schreiben kann. Warum Siemens bei dem FB einen Unterschied macht ist mir allerdings auch schleierhaft. Bringt das irgendeinen Nutzen, dort eine Kopie zu übergeben? Evtl. ist der Zugriff auf die Kopie im FB schneller?
Vermutlich weil damit außerhalb des Bausteins die Bytereihenfolge angepasst werden kann, da sich diese zwischen optimiert/nicht optimiert unterscheidet. Ich vermute mal, das funktioniert dann ähnlich wie bei der S7-300/400 bei einem FC InOut Parameter und elementarem Datentyp. Dort wird der Parameter auf den Lokaldatenbereich geschrieben, und der FC bekommt nicht den Zeiger zur eigentlichen Variable sonder zur Kopie in Lokaldatenbereich übermittelt. Nach FC Bearbeitungsende wird der Wert vom Lokaldatenbereich wieder auf die eigentliche Variable geschrieben.

Bei großen UDTs ist das entsprechend aufwändig umzukopieren / Bytereihenfolge anzupassen. Hauptnachteil wäre aber meiner Meinung, wenn du auf Daten in den UDTs z.B. von einem HMI schreibend zugreifst. Wenn dann nicht als Referenz übergeben wird, dann gehen bei der 1200/1500 wegen der asynchronen Kommunikation Befehle vom HMI schon mal verloren.
 
Moin!

in Bezug auf:
Hinweis:
Auch wenn die UDT dem Aufbau einer struct entspricht, kann man dann nur die Einzelelemente kopieren. Das gesamte Konstrukt kann man nicht kopieren, da ein UDT ein anderer Datentyp als ein struct ist.

Pseudocode:
Code:
Array1 | Array[0..9] of UDT1
Array2 | Array[0..9] of UDT1
Array3 | Array[0..9] of struct // wobei der Aufbau von struct dem UDT1 entspricht!

Array1[0] := Array2[0]; // geht!
Array1[0] := Array3[0]; // geht nicht!
VG

MFreiberger

Siemens unterscheidet nicht zwischen UDT und STRUCT solange beide gleich aufgebaut sind (kurzer Test unter V16 liefert keine Fehler)!
Auch UDT zu UDT funktioniert ohne Probleme solange der Aufbau gleich ist.

Für CoDeSys hingegen stimmt die die Aussage und alle Elemente müssen einzeln kopiert werden.
 
Siemens unterscheidet nicht zwischen UDT und STRUCT solange beide gleich aufgebaut sind (kurzer Test unter V16 liefert keine Fehler)!
Auch UDT zu UDT funktioniert ohne Probleme solange der Aufbau gleich ist.
Wenn SIEMENS (gar) nicht unterscheidet, warum funktioniert dann die Zuweisung

Code:
UDT-Variable := STRUCT-Variable;

nicht, auch wenn beide Variablen gleich aufgebaut sind?

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hauptnachteil wäre aber meiner Meinung, wenn du auf Daten in den UDTs z.B. von einem HMI schreibend zugreifst. Wenn dann nicht als Referenz übergeben wird, dann gehen bei der 1200/1500 wegen der asynchronen Kommunikation Befehle vom HMI schon mal verloren.
Hmm, ja, das mit der parallelen Bearbeitung der Kommunikation ist auch bei Referenz ein (kleineres) Problem, da Inkonsistenzen auftreten können. Aber zumindest geht mal nix verloren...
Macht schon echt Kopfschmerzen, wenn man immer alles korrekt verstehen und machen will...
 
Moin LNy,

tatsächlich. Ging das vielleicht mit einer vorhergehenden TIA-Version nicht :unsure:

Vielen Dank für die Information. Das wusste ich nicht.

Es erscheint mir zwar nicht sinnvoll UDT und STRUCT zu mischen, aber wenn es geht ...

VG

MFreiberger
 
Zurück
Oben