Eine VAR_IN_OUT
-Variable ist eine Eingabe-/Ausgabevariable, die Teil einer POE-Schnittstelle ist
und als formaler Übergabeparameter dient.
Syntax
<keyword> <POU name> VAR_IN_OUT <variable name> : <data type> ( := <initialization value> )? ; END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
Sie können eine Eingangs-/Ausgangsvariable im Deklarationsabschnitt VAR_IN_OUT
in den POEs PRG
, FUNCTION_BLOCK
, METHOD
oder FUNCTION
deklarieren. Optional kann eine Konstante des deklarierten Datentyps als Initialisierungswert
zugewiesen werden. Die Variable VAR_IN_OUT
kann gelesen und geschrieben werden.
Verwendung als
-
Rufen Sie an: Wenn eine POE aufgerufen wird, erhält die formale Variable
VAR_IN_OUT
die tatsächliche Variable ("pass-by-reference variable") als Argument. Zur Laufzeit werden bei der Übergabe von Parametern keine Kopien erzeugt. Stattdessen erhält die formale Variable einen Verweis auf die tatsächliche Variable, die aus der Ferne übergeben wird. Die referenziellen Variablen enthalten intern eine Speicheradresse als Wert zum eigentlichen Wert (pass as pointer, call-by-reference). Es ist nicht möglich, eine Konstante (Literal) oder eine Bitvariable direkt als Argument anzugeben. -
Lese-/Schreibzugriff innerhalb der POE: Wird die Variable innerhalb der POE beschrieben, so wirkt sich dies auf die übergebene Variable aus. Wenn die POE verlassen wird, bleiben alle vorgenommenen Änderungen erhalten. Das bedeutet, dass eine POE ihre
VAR_IN_OUT
Variablen genauso verwendet wie die aufrufende POE ihre Variablen. Der Lesezugriff ist immer erlaubt. -
Lese-/Schreibzugriff aus der Ferne:
VAR_IN_OUT
Variablen können nicht direkt aus der Ferne über<function block instance name>.<variable name>
gelesen oder geschrieben werden. Dies funktioniert nur für die VariablenVAR_INPUT
undVAR_OUTPUT
. -
Übergabe von String-Variablen: Wenn eine String-Variable als Argument übergeben wird, sollten die tatsächliche Variable und die formale Variable die gleiche Länge haben. Andernfalls kann die übergebene Zeichenkette ungewollt manipuliert werden. Dieses Problem tritt bei den Parametern von
VAR_OUTPUT CONSTANT
nicht auf. -
Übergabe von Bit-Variablen: Eine Bit-Variable kann nicht direkt an eine
VAR_IN_OUT
-Variable übergeben werden, da sie eine Zwischenvariable benötigt. -
Weitergabe von Eigenschaften: Nicht erlaubt
Wird eine Zeichenkette als Variable oder Konstante an eine formale VAR_IN_OUT CONSTANT
Variable übergeben, so wird die Zeichenkette automatisch vollständig übergeben. Sie
müssen die Länge der Zeichenfolge nicht überprüfen.
Für weitere Informationen siehe: "VAR_IN_OUT CONSTANT" Übergabevariable
Beispiel
Übergabe von Arrays
TYPE DUT_A : STRUCT xA: BOOL; iB: INT; END_STRUCT END_TYPE FUNCTION_BLOCK FB_SetArray VAR_IN_OUT aData_A : ARRAY[0..1] OF DUT_A; // Formal variable END_VAR aData_A[0].xA := TRUE; aData_A[0].iB := 100; PROGRAM PLC_PRG VAR fbSetA : FB_SetArray; aSpecialData : ARRAY[0..1] OF DUT_A; // Actual variable END_VAR fbSetA(aData_A := aSpecialData);

Übergabe von Zeichenketten
{attribute 'qualified_only'} VAR_GLOBAL g_sDEV_STATUS : STRING(25) := 'Device_A'; END_VAR FUNCTION_BLOCK FB_SetStatus VAR_IN_OUT sDeviceStatus : STRING(25); // Formal parameter END_VAR sDeviceStatus := CONCAT(sDeviceStatus, ' Activ'); PROGRAM PLC_PRG VAR fbDoB : FB_SetStatus; END_VAR fbDoB(sDeviceStatus := GVL.g_sDEV_STATUS); //Call with actual parameter
Die Variable sDeviceStatus
ist Teil der POE-Schnittstelle von FB_B
. Beim Aufruf von fbDoB
wird der Zeichenkette zunächst ein Gerätename zugewiesen und dann die Zeichenkette
manipuliert.

Übergabe von Bit-Variablen
VAR_GLOBAL xBit0 AT %MX0.1 : BOOL; xTemp : BOOL; END_VAR FUNCTION_BLOCK FB_DoSomething VAR_INPUT xIn : BOOL; END_VAR VAR_IN_OUT xInOut : BOOL; END_VAR IF xIn THEN xInOut := TRUE; END_IF PROGRAM PLC_PRG VAR xIn : BOOL; DoSomething_1 : FB_DoSomething; DoSomething_2 : FB_DoSomething; END_VAR // The following line of code causes a compiler error: // C0201: Typ 'BIT' is not equal to type 'BOOL' of VAR_IN_OUT 'xInOut' DoSomething_1(xIn := xIn, xInOut := xBit0); // Workaround xTemp := xBit0; DoSomething_2(xIn := xIn, xInOut := xTemp); xBit0 := xTemp;
Das Programm ruft die Funktionsblockinstanzen DoSomething_1
und DoSomething_2
auf. Durch die direkte Zuweisung der Bitvariablen xBit0
an den Eingang VAR_IN_OUT
wird beim Aufruf der Instanz DoSomething_1
ein Compilerfehler erzeugt. Im Gegensatz dazu ist der Aufruf der Instanz DoSomething_2
mit der Zuweisung einer Zwischenvariablen korrekter Code.
-
Variable übertragen
VAR_IN_OUT CONSTANT