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_OUTdie 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_OUTVariablen genauso verwendet wie die aufrufende POE ihre Variablen. Der Lesezugriff ist immer erlaubt. -
Lese-/Schreibzugriff aus der Ferne:
VAR_IN_OUTVariablen 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_INPUTundVAR_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 CONSTANTnicht 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