Variabile: VAR_IN_OUT Permalink

Una variabile ‎VAR_IN_OUT‎ è una variabile di input/output che fa parte di un'interfaccia POU e funge da parametro formale pass-by-reference.

Sintassi

<keyword> <POU name>
VAR_IN_OUT
    <variable name> : <data type>;
END_VAR

<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG

È possibile dichiarare una variabile di input/output nella sezione di dichiarazione ‎VAR_IN_OUT‎ nei POU ‎PRG‎, ‎FUNCTION_BLOCK‎, ‎METHOD‎ o ‎FUNCTION‎. La variabile ‎VAR_IN_OUT‎ può essere letta e scritta.

Utilizzo

  • Chiama: Quando viene richiamata una POU, la variabile formale ‎VAR_IN_OUT‎ riceve come argomento la variabile reale ("variabile pass-by-reference"). In fase di esecuzione, non vengono generate copie quando vengono passati i parametri. Invece, la variabile formale riceve un riferimento alla variabile effettiva passata in remoto. Le variabili referenziali contengono internamente un indirizzo di memoria come valore al valore effettivo (pass as pointer, call-by reference). Non è possibile specificare una costante (letterale) o una variabile bit direttamente come argomento.

  • Accesso in lettura/scrittura all'interno del POU: Se la variabile viene scritta all'interno del POU, ciò influisce sulla variabile passata. Quando si esce dal POU, le modifiche effettuate vengono mantenute. Ciò significa che un POU usa le sue variabili ‎VAR_IN_OUT‎ proprio come il POU chiamante usa le sue variabili. L'accesso in lettura è sempre consentito.

  • Accesso in lettura/scrittura da remoto: le variabili ‎VAR_IN_OUT‎ non possono essere lette o scritte direttamente da remoto tramite ‎<function block instance name>.<variable name>‎. Questo funziona solo per le variabili ‎VAR_INPUT‎ e ‎VAR_OUTPUT‎.

  • Passaggio di variabili stringa: Se viene passata una variabile stringa come argomento, la variabile reale e quella formale devono avere la stessa lunghezza. In caso contrario, la stringa passata può essere manipolata involontariamente. Questo problema non si verifica nel caso dei parametri ‎VAR_OUTPUT CONSTANT‎.

  • Passaggio di variabili bit: Una variabile bit non può essere passata direttamente a una variabile ‎VAR_IN_OUT‎ perché necessita di una variabile intermedia.

  • Passaggio di proprietà: Non consentito

Se una stringa viene passata come variabile o costante a una variabile formale di ‎VAR_IN_OUT CONSTANT‎, la stringa viene automaticamente passata completamente. Non è necessario controllare la lunghezza della stringa.

Per ulteriori informazioni, vedere: "VAR_IN_OUT CONSTANT" Variabile di trasferimento

Esempio

Passaggio di array

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);
_cds_varinouts_array.png

Passaggio di stringhe

{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

La variabile ‎sDeviceStatus‎ fa parte dell'interfaccia POU di ‎FB_B‎. Quando si chiama ‎fbDoB‎, prima viene assegnato un nome di dispositivo alla stringa e poi la stringa viene manipolata.

_cds_varinouts_string.png

Passaggio di variabili bit

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;

Il programma chiama le istanze del blocco funzione ‎DoSomething_1‎ e ‎DoSomething_2‎. A causa dell'assegnazione diretta della variabile di bit ‎xBit0‎ all'ingresso di ‎VAR_IN_OUT‎, quando viene richiamata l'istanza di ‎DoSomething_1‎ viene generato un errore del compilatore. Al contrario, richiamare l'istanza di ‎DoSomething_2‎ con l'assegnazione di una variabile intermedia è un codice corretto.