Skip to main content

Variabile: VAR_IN_OUT

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

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 nel file VAR_IN_OUT sezione dichiarazioni nei POU PRG, FUNCTION_BLOCK, METHOD, O FUNCTION. IL VAR_IN_OUT la variabile può essere letta e scritta.

. Utilizzo
  • Chiamata: Quando viene chiamata una POU, il formale VAR_IN_OUT variabile riceve la variabile effettiva ("variabile pass-by-reference") come argomento. In fase di esecuzione, non vengono generate copie quando vengono passati i parametri. Al contrario, la variabile formale riceve un riferimento alla variabile effettiva passata in remoto. Le variabili di riferimento contengono internamente un indirizzo di memoria come valore rispetto al valore effettivo (passare come puntatore, call-by referenza). Non è possibile specificare una costante (letterale) o una variabile bit direttamente come argomento.

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

  • Accesso in lettura/scrittura da remoto: VAR_IN_OUT variabili non può essere letto direttamente o scritto a distanza tramite <function block instance name>.<variable name>. Questo funziona solo per VAR_INPUT e VAR_OUTPUT variabili.

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

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

  • Passaggio di proprietà: Non consentito

Suggerimento

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

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

Esempio 84. Esempio

Matrici di passaggio

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

Passare le 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, quindi 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 richiama le istanze del blocco funzione DoSomething_1 e DoSomething_2. Come risultato dell'assegnazione diretta della variabile bit xBit0 al VAR_IN_OUT input, viene generato un errore del compilatore quando il file DoSomething_1 viene chiamata l'istanza. Al contrario, chiamando il DoSomething_2 istanza con l'assegnazione di una variabile intermedia è codice corretto.



Variabile di trasferimento VAR_IN_OUT CONSTANT

UN VAR_IN_OUT CONSTANT La variabile funge da parametro di riferimento costante, a cui a STRING o WSTRING è possibile passare una variabile di tipo o una costante (letterale). Il parametro può essere letto, ma non scritto. Non è consentito il passaggio di proprietà.

Dichiarazione di sintassi

<keyword> <POU name>
VAR_IN_OUT CONSTANT
    <variable name> : <data type>; // formal parameter
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG

VAR_IN_OUT CONSTANT le variabili vengono dichiarate senza assegnare un valore di inizializzazione.

. Utilizzo
  • Quando si chiama la POU, a STRING o WSTRING è possibile passare una variabile costante o un letterale. Di conseguenza, l'accesso in scrittura non è consentito.

  • Passaggio dei parametri di una costante stringa: la lunghezza della stringa delle costanti può essere di qualsiasi dimensione e la lunghezza della stringa non dipende dalla lunghezza della stringa del VAR_IN_OUT CONSTANT variabili.

Suggerimento

Se la Sostituisci le costanti l'opzione è selezionata in Progetto → Impostazioni progetto nel Opzioni di compilazione categoria, quindi il passaggio dei parametri di una costante con tipo di dati di base o di una variabile costante con tipo di dati di base genera un errore del compilatore.

Suggerimento

La variabile è supportata nella versione del compilatore >= 3.5.2.0.

Esempio 85. Esempio

Passaggio di parametri di costanti stringa e variabili stringa

FUNCTION funManipulate : BOOL
VAR_IN_OUT
        sReadWrite : STRING(16); (* Can be read or written here in POU *)
        dwVarReadWrite : DWORD; (* Can be read or written here in POU *)
END_VAR
VAR_IN_OUT CONSTANT
        c_sReadOnly : STRING(16); (* Constant string variable can only be read here in POU *)
END_VAR

sReadWrite := 'String_from_POU';
dwVarReadWrite := STRING_TO_DWORD(c_sReadOnly);

PROGRAM PRG_A
VAR
        sVarFits : STRING(16);
        sValFits : STRING(16) := '1234567890123456';
        dwVar: DWORD;
END_VAR

// The following line of code causes the compiler error C0417:
// C0417: VAR_IN_OUT parameter 'sReadWrite' needs a variable with write access as input.
funManipulate(sReadWrite:='1234567890123456', c_sReadOnly:='1234567890123456', dwVarReadWrite := dwVar);

//  Correct code
funManipulate(sReadWrite := sValFits, c_sReadOnly := '23', dwVarReadWrite := dwVar);
funManipulate(sReadWrite := sVarFits, c_sReadOnly := sValFits, dwVarReadWrite := dwVar);

Nel codice, le stringhe vengono passate a funManipulate funzione tramite diverso VAR_IN_OUT variabili. Quando si passa una stringa letterale, viene restituito un errore del compilatore a a VAR_IN_OUT variabile. Quando si passa una variabile costante ad a VAR_IN_OUT CONSTANT variabile, viene generato il codice corretto anche per il passaggio di variabili stringa.