Skip to main content

変数: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 の宣言セクション PRGFUNCTION_BLOCKMETHOD、 または 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_INPUTVAR_OUTPUT 変数。

  • 文字列変数を渡す:文字列変数が引数として渡される場合、実際の変数と仮変数は同じ長さである必要があります。そうしないと、渡された文字列が意図せずに操作される可能性があります。この問題は、次の場合には発生しません。 VAR_OUTPUT CONSTANT パラメーター。

  • ビット変数の受け渡し:ビット変数を直接に渡すことはできません VAR_IN_OUT 中間変数が必要なため、変数。

  • プロパティの受け渡し: 許可されていません

ヒント

文字列が変数または定数としてフォーマルに渡される場合 VAR_IN_OUT CONSTANT 変数の場合、文字列は自動的に完全に渡されます。文字列の長さを確認する必要はありません。

詳細については、以下を参照してください。 「VAR_IN_OUTCONSTANT」転送変数

84.

配列の受け渡し

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

文字列を渡す

{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、最初にデバイス名が文字列に割り当てられ、次に文字列が操作されます。

_cds_varinouts_string.png

ビット変数の受け渡し

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_1DoSomething_2。ビット変数の直接割り当ての結果として xBit0VAR_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でサポートされています。

85.

文字列定数と文字列変数のパラメータを渡す

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 変数、文字列変数を渡す場合でも正しいコードが生成されます。