Step 7 Array of XX Parameter Übergabe

AndiMo

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,
ich habe einen FB1 der aus dem OB1 aufgerufen wird und als VAR_IN_OUT ein Array of "Struct" übergeben bekommt. Dies funktioniert auch soweit. nun würde ich diese Array gerne aus dem FB an ein weiteres (untergeordneten) FB2 weitergeben.
Als VAR_INPUT ist dies auch möglich als VAR_IN_OUT jedoch nicht dafür muss ich im FB1 erst eine lokale Kopie erzeugen die an FB2 übergeben und danach in das Eingangarray im FB1 zurückkopieren um die Änderungen aus FB2 im Eingangs Array des FB1 zu haben.


Gibt es hierfür eine elegantere Lösung?


OB1
Code:
[INDENT]CALL  "FB1" , "DB1"
arr1:="DB".M   // Struct mit Array of Sruct in Variable M
[/INDENT]

FB1:
Code:
[INDENT]VAR_IN_OUT
arr1: ARRAY[0..6] OF "Struct";
END_VAR

VAR
   arr2: ARRAY[0..6] OF "Struct";
END_VAR

BEGIN

arr2 := arr1;

FB2.DB2(arr2 := arr2)

arr1 := arr2;

END_FUNCTION_BLOCK 
[/INDENT]



FB2:

Code:
[INDENT] VAR_IN_OUT
arr2: ARRAY[0..6] OF "Struct";

END_VAR

arr2.element := 1;[/INDENT]


Was genau passiert denn bei der Array Übergabe und bei der Zuweisung im FB1?
Werden die Inhalte kopiert oder Pointer gesetzt dazu habe ich leider noch keine gute Erlärung gefunden.

 
Meines Wissens nach geht das nicht, da ich vor ein paar Monaten selbst eine Lösung dafür gesucht habe. Der Compiler meckert immer an, dass es sich um einen Eingang handeln muss.

Wenn du eine Struktur als Parameter übergibst, dann ist das für den Baustein ein Pointer (egal wie groß die Struktur ist, die nimmt immer gleich viele Bytes in den Parametern/im IDB an Platz weg.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
okay dankeschön.

genau so wie ich es verstanden habe ist es ein Pointer wie auch beim Block_DB richtig?

Deswegen habe ich mich gewundert, wieso ich den Pointer nicht weiter geben kann.
 
Block_DB ist nur 2 Byte groß. Verhält sich wie ein Pointer, kann aber sein, dass da im Hintergrund schlichtweg die DB Nummer übergeben wird, wer weiß. Ein normaler Pointer ist 6 Byte groß und ein Anypointer 10 Bytes.
 
okay dann war mein Verständnis ja anscheinend richtig, dass es so funktionieren könnte aber es klappt aus irgendeinem Grund nicht.
Dankeschön
 
In AWL kann man den POINTER vom INOUT des FB1 zum INOUT des FB2 kopieren, aber Achtung: das verlinkte Beispiel (dort Beitrag #8) ist nicht multiinstanztauglich (das steht da auch als Hinweis). Und: man muß darauf achten, daß der an FB1 übergebene Aktualparameter nicht in TEMP liegt.

Harald
 
Zurück
Oben