変数:VAR_IN_OUT
A VAR_IN_OUT
variableは入力/出力変数であり、POUインターフェースの一部であり、正式な参照渡しパラメーターとして機能します。
構文
<keyword> <POU name> VAR_IN_OUT <variable name> : <data type>; END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
入出力変数を宣言できます。 VAR_IN_OUT
POU の宣言セクション PRG
、 FUNCTION_BLOCK
、 METHOD
、 または FUNCTION
。の VAR_IN_OUT
変数の読み書きが可能です。
電話:POUが呼び出されると、正式な
VAR_IN_OUT
variableは、引数として実際の変数( "pass-by-reference変数")を受け取ります。実行時に、パラメーターが渡されたときにコピーは生成されません。代わりに、仮変数は、リモートで渡された実際の変数への参照を受け取ります。参照変数には、実際の値に対する値として内部にメモリアドレスが含まれています(ポインタとして渡す、 コールバイリファレンス)。定数(リテラル)またはビット変数を引数として直接指定することはできません。POU内の読み取り/書き込みアクセス:変数がPOU内に書き込まれる場合、これは渡される変数に影響します。 POUが終了すると、実行された変更はすべて保持されます。これは、POUが
VAR_IN_OUT
呼び出し元のPOUがその変数を使用するのと同じように、変数。読み取りアクセスは常に許可されます。リモートでの読み取り/書き込みアクセス:
VAR_IN_OUT
変数 できません を介してリモートで直接読み取りまたは書き込み<function block instance name>.<variable name>
。これは次の場合にのみ機能しますVAR_INPUT
とVAR_OUTPUT
変数。文字列変数を渡す:文字列変数が引数として渡される場合、実際の変数と仮変数は同じ長さである必要があります。そうしないと、渡された文字列が意図せずに操作される可能性があります。この問題は、次の場合には発生しません。
VAR_OUTPUT CONSTANT
パラメーター。ビット変数の受け渡し:ビット変数を直接に渡すことはできません
VAR_IN_OUT
中間変数が必要なため、変数。プロパティの受け渡し: 許可されていません
ヒント
文字列が変数または定数としてフォーマルに渡される場合 VAR_IN_OUT CONSTANT
変数の場合、文字列は自動的に完全に渡されます。文字列の長さを確認する必要はありません。
詳細については、以下を参照してください。 「VAR_IN_OUTCONSTANT」転送変数
配列の受け渡し
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);

文字列を渡す
{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
変数 sDeviceStatus
のPOUインターフェースの一部です FB_B
。電話するとき fbDoB
、最初にデバイス名が文字列に割り当てられ、次に文字列が操作されます。

ビット変数の受け渡し
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;
プログラムは機能ブロックインスタンスを呼び出します DoSomething_1
と DoSomething_2
。ビット変数の直接割り当ての結果として xBit0
に VAR_IN_OUT
入力の場合、コンパイラエラーが生成されます。 DoSomething_1
インスタンスが呼び出されます。対照的に、 DoSomething_2
中間変数が割り当てられたインスタンスは正しいコードです。
転送変数 VAR_IN_OUT CONSTANT
A VAR_IN_OUT CONSTANT
変数は、定数の参照渡しパラメーターとして機能します。 STRING
また WSTRING
型変数または定数(リテラル)を渡すことができます。パラメータは読み取ることはできますが、書き込むことはできません。プロパティの通過は許可されていません。
構文宣言
<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
変数は、初期化値を割り当てずに宣言されます。
POUを呼び出す場合、
STRING
またWSTRING
定数変数またはリテラルを渡すことができます。したがって、書き込みアクセスは許可されません。文字列定数のパラメータの受け渡し:定数の文字列の長さは任意のサイズにすることができ、文字列の長さは文字列の長さに依存しません
VAR_IN_OUT CONSTANT
変数。
ヒント
の場合 定数を置き換える オプションはで選択されています の中に コンパイルオプション カテゴリの場合、基本データ型の定数または基本データ型の定数変数のパラメータを渡すと、コンパイラエラーが発生します。
ヒント
この変数は、コンパイラバージョン> = 3.5.2.0でサポートされています。
文字列定数と文字列変数のパラメータを渡す
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);
コードでは、文字列はに渡されます funManipulate
異なる経由で機能 VAR_IN_OUT
変数。文字列リテラルを渡すと、コンパイラエラーが出力されます。 VAR_IN_OUT
変数。定数変数をに渡すとき VAR_IN_OUT CONSTANT
変数、文字列変数を渡す場合でも正しいコードが生成されます。