Variable : VAR_IN_OUT
UNE VAR_IN_OUT variable est une variable d'entrée/sortie, qui fait partie d'une interface POU et sert de paramètre formel de passage par référence.
Syntaxe
<keyword> <POU name>
VAR_IN_OUT
<variable name> : <data type>;
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRGVous pouvez déclarer une variable d'entrée/sortie dans le fichier VAR_IN_OUT section de déclaration dans les POU PRG, FUNCTION_BLOCK, METHOD, ou FUNCTION. Le VAR_IN_OUT la variable peut être lue et écrite.
Appeler: Lorsqu'un POU est appelé, le formel
VAR_IN_OUTreçoit la variable réelle ("variable de passage par référence") comme argument. Lors de l'exécution, aucune copie n'est générée lorsque les paramètres sont passés. Au lieu de cela, la variable formelle reçoit une référence à la variable réelle transmise à distance. Les variables de référence contiennent en interne une adresse mémoire en tant que valeur par rapport à la valeur réelle (passer comme pointeur, appel par référence). Il n'est pas possible de spécifier une constante (littérale) ou une variable binaire directement comme argument.Accès en lecture/écriture au sein de la POU: Si la variable est écrite dans la POU, cela affecte la variable transmise. Lorsque vous quittez la POU, toutes les modifications effectuées sont conservées. Cela signifie qu'un POU utilise son
VAR_IN_OUTvariables tout comme le POU appelant utilise ses variables. L'accès en lecture est toujours autorisé.Accès en lecture/écriture à distance:
VAR_IN_OUTvariables ne peux pas être directement lu ou écrit à distance via<function block instance name>.<variable name>. Cela ne fonctionne que pourVAR_INPUTetVAR_OUTPUTvariables.Passer des variables de chaîne: Si une variable chaîne est passée en argument, alors la variable réelle et la variable formelle doivent avoir la même longueur. Sinon, la chaîne transmise peut être manipulée involontairement. Ce problème ne se produit pas dans le cas de
VAR_OUTPUT CONSTANTparamètres.Passer des variables de bit: Une variable bit ne peut pas être passée directement à un
VAR_IN_OUTvariable car il a besoin d'une variable intermédiaire.Passation de propriétés: Pas permis
Astuce
Si une chaîne est passée en tant que variable ou constante à un formel VAR_IN_OUT CONSTANT variable, la chaîne est automatiquement transmise complètement. Vous n'avez pas à vérifier la longueur de la chaîne.
Pour plus d'informations, consultez : Variable de transfert "VAR_IN_OUT CONSTANTE"
Passer des tableaux
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);
Passer des chaînes
{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 parameterLa variable sDeviceStatus fait partie de l'interface POU de FB_B. Lors de l'appel fbDoB, un nom de périphérique est d'abord attribué à la chaîne, puis la chaîne est manipulée.

Passer des variables de 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;Le programme appelle les instances du bloc fonction DoSomething_1 et DoSomething_2. En raison de l'affectation directe de la variable bit xBit0 à la VAR_IN_OUT entrée, une erreur de compilation est générée lorsque le DoSomething_1 instance est appelée. En revanche, appeler le DoSomething_2 instance avec l'affectation d'une variable intermédiaire est le code correct.
Variable de transfert VAR_IN_OUT CONSTANT
UNE VAR_IN_OUT CONSTANT variable sert de paramètre de passage par référence constant, auquel un STRING ou WSTRING type variable ou constant (littéral) peut être passé. Le paramètre peut être lu, mais pas écrit. Le passage des propriétés n'est pas autorisé.
Déclaration de syntaxe
<keyword> <POU name>
VAR_IN_OUT CONSTANT
<variable name> : <data type>; // formal parameter
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRGVAR_IN_OUT CONSTANT les variables sont déclarées sans affecter de valeur d'initialisation.
Lors de l'appel de la POU, un
STRINGouWSTRINGune variable constante ou un littéral peut être passé. Par conséquent, l'accès en écriture n'est pas autorisé.Passage des paramètres d'une constante de chaîne : la longueur de la chaîne des constantes peut être de n'importe quelle taille et la longueur de la chaîne ne dépend pas de la longueur de la chaîne du
VAR_IN_OUT CONSTANTvariables.
Astuce
Si la Remplacer les constantes l'option est sélectionnée dans dans le Options de compilation catégorie, puis passer les paramètres d'une constante avec le type de données de base ou d'une variable constante avec le type de données de base génère une erreur du compilateur.
Astuce
La variable est prise en charge dans la version du compilateur >= 3.5.2.0.
Passage de paramètres de constantes de chaîne et de variables de chaîne
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);Dans le code, les chaînes sont passées au funManipulate fonction via différents VAR_IN_OUT variables. Lors du passage d'un littéral de chaîne, une erreur du compilateur est émise vers un VAR_IN_OUT variable. Lors du passage d'une variable constante à un VAR_IN_OUT CONSTANT variable, un code correct est généré même pour le passage de variables de chaîne.