Skip to main content

条件付きプラグマ

重要

ST POU の実装では条件付きプラグマを使用します。 CODESYS 条件付きプラグマを宣言部分で使用する場合、条件付きプラグマは評価されません。

例外は、次の条件付きプラグマです。 {project_define (<global define>)} POU の実装部分と宣言部分で使用できる演算子 (「 project_defined (<global define>))。

条件付きプラグマの目的は、プリコンパイルまたはコンパイルプロセスでコードが生成される方法に影響を与えることです。 ST実装言語は、これらのプラグマをサポートします。

条件付きプラグマを使用すると、コンパイルで実装コードが考慮されるかどうかに影響を与えます。たとえば、これを特定の変数が宣言されているかどうか、特定のPOUが存在するかどうかなどに依存させることができます。

プラグマ

説明

{define <identifier> <string>}

値を照会して比較することができます hasvalue 後で。

{undefine <identifier>}

The {define} 識別子のステートメント <identifier> が削除され、識別子は今後も「未定義」になります。指定された識別子がまったく定義されていない場合、プラグマは無視されます。

{IF <expr>}...

{ELSIF <expr>}...

{ELSE}...

END_IF}

これらは、条件付きコンパイルのプラグマです。

指定された式 <expr> コンパイル時に一定である必要があります。式の1つがゼロ以外の値になるまで、ここに表示される順序で評価されます。ステートメントにリンクされているテキストがコンパイルされます。他の行は無視されます。セグメントの順序は固定されています。 The ELSIFELSE セグメントはオプションです。 The ELSIF セグメントは何度でも発生する可能性があります。定数内で複数の条件付きコンパイル演算子を使用できます <expr>

<expr>

1つまたは複数を使用できます 演算子 定数式内 <expr> 条件付きコンパイルプラグマ内 {IF} また {ELSIF}

ヒント

式を指定して、 define としての定義 コンパイラ定義建てる POUの[プロパティ]ダイアログのタブ。指定した場合 define プロパティダイアログの定義では、用語を省略する必要があります {define}、実装コードの定義とは対照的です。さらに、複数のカンマ区切りを指定できます define プロパティダイアログの定義。

オペレーター

defined (variable: <variable name> )

演算子により、式に値が与えられます TRUE 変数が <variable name> 現在のスコープ内で宣言されています。さもないと FALSE が返されます。

要件:2つのアプリケーション App1App2 存在。変数 g_bTest で宣言されています App1、しかしではない App2

{IF defined (variable: g_bTest)}
    (* the following code is only processed in App2*)
    g_bTest := x > 300;
{END_IF}

defined (<identifier>)

演算子により、式に値が与えられます TRUE。要件は、識別子が <identifier> によって定義されています {define} ステートメントであり、後で未定義ではありません {undefine} 声明。さもないと FALSE が返されます。

要件:アプリケーション App1App2 存在。 The pdef1 変数はによって定義されます {define} のステートメント App1、しかしではない App2

{IF defined (pdef1)}
(* This code is processed in App1 *)
{info 'pdef1 defined'}
    hugo := hugo + SINT#1;
{ELSE}
(* the following code is only processed in App2 *)
{info 'pdef1 not defined'}
    hugo := hugo - SINT#1;
{END_IF}

これには、メッセージプラグマの例も含まれます。メッセージのみ pdef1 defined アプリケーションがコンパイルされると、メッセージビューにが表示されます。 pdef1 実際に定義されています。メッセージ pdef1 not defined が表示されるとき pdef1 定義されていません。

defined (type: <identifier> )

演算子により、式に値が与えられます TRUE データ型が識別子で宣言されている場合 <identifier>。さもないと FALSE が返されます。

要件:2つのアプリケーション App1App2 存在。データ型 DUT で宣言されています App1、しかしではない App2

{IF defined (type: DUT)}
    (* the following code is only processed in App1*)
    bDutDefined := TRUE;
{END_IF}

defined (pou: <pou name>)

演算子により、式に値が与えられます TRUE 名前を持つ次のオブジェクトのいずれか <pou-name> 存在します:

  • 機能ブロック

  • 関数

  • プログラム

  • アクション

  • 方法

  • インターフェース

さもないと FALSE 返されます。

要件:2つのアプリケーション App1App2 存在。 POU CheckBounds に存在します App1、しかしではない App2

{IF defined (pou: CheckBounds)}
    (* the following code is only processed in App1 *)
    arrTest[CheckBounds(0,i,10)] := arrTest[CheckBounds(0,i,10)] + 1;
{ELSE}
    (* the following code is only processed in App2 *)
    arrTest[i] := arrTest[i]+1;
{END_IF}

defined (resource: <identifier>)

重要

まだ実装されていません

演算子により、式に値が与えられます TRUE 名前の付いたリソースオブジェクトの場合 <identifier> アプリケーション用に存在します。それ以外は FALSE が返されます。

要件:2つのアプリケーション App1App2 存在。リソースオブジェクト glob_var1 グローバル変数リストの App1、ただし App2

{IF defined (resource:glob_var1)}
    (* the following code is only processed in App1 *)
    gvar_x := gvar_x + ivar;
{ELSE}
    (* the following code is only processed in App2 *)
    x := x + ivar;
{END_IF}

defined (task: <task name> )

演算子により、式に値が与えられます TRUE タスクが名前で定義されている場合 <task name>。さもないと FALSE が返されます。

構文

{ IF defined (task: <task name> }
{ ELSIF defined (task: <task name> }
293.

{IF defined (task: Task_D)}



294.

要件:2つのアプリケーション App1App2 存在。タスク PLC_PRG_Task で定義されています App1、しかしではない App2

{IF defined (task: PLC_PRG_Task)}
    (* the following code is only processed in App1 *)
    erg := plc_prg.x;
{ELSE}
    (* the following code is only processed in App2 *)
    erg := prog.x;
{END_IF}


defined (IsLittleEndian)

演算子により、式に値が与えられます FALSE CPUメモリがビッグエンディアン(モトローラバイトオーダー)で編成されている場合。

defined (IsSimulationMode)

演算子により、式に値が与えられます TRUE アプリケーションがシミュレートされたデバイスで実行されている場合(シミュレーションモード)。

詳細については、以下を参照してください。 シミュレーションモードでのテスト

defined (IsFPUSupported)

式が値を返す場合 TRUE、次に、コードジェネレータは、で計算するときにFPUコード(浮動小数点ユニットプロセッサ用)を生成します。 REAL 値。それ以外の場合、FPU操作はエミュレートされますが、これははるかに低速です。

hasattribute (pou: <pou name>, ' <attribute name> ')

演算子により、式に値が与えられます TRUE 属性が <attribute> 関数ブロックの宣言部分の最初の行で指定されます <pou name>。さもないと FALSE が返されます。

295.

要件:2つのアプリケーション App1App2 存在。関数 fun1 で宣言されています App1App2。ただし、 App1 プラグマも付属しています {attribute 'vision'}

App1

{attribute 'vision'}
FUNCTION fun1 : INT
VAR_INPUT
    i : INT;
END_VAR
VAR
END_VAR

App2

FUNCTION fun1 : INT
VAR_INPUT
    i : INT;
END_VAR
VAR
END_VAR

プラグマステートメント:

{IF hasattribute (pou: fun1, 'vision')}
    (* the following code is only processed in App1 *)
    ergvar := fun1(ivar);
{END_IF}


hasattribute (variable: <variable name> , ' <attribute name> ')

演算子により、式に値が与えられます TRUE プラグマが {attribute '<attribute>'} 変数宣言の前の行の変数に割り当てられます。さもないと FALSE が返されます。

296.

要件:2つのアプリケーション App1App2 存在。変数 g_globalInt で使用されます App1App2、しかしで App1 属性 'DoCount' にも割り当てられています。

の宣言 g_GlobalIntApp1

VAR_GLOBAL
    {attribute 'DoCount'}
    g_globalInt : INT;
    g_multiType : STRING;
END_VAR

宣言 g_GlobalIntApp2

VAR_GLOBAL
    g_globalInt : INT;
    g_multiType : STRING;
END_VAR

プラグマステートメント:

{IF hasattribute (variable: g_globalInt, 'DoCount')}
    (* the following code is only processed in App1 *)
    g_globalInt := g_globalInt + 1;
{END_IF}


hasconstanttype( <constant name> , <boolean literal> )

オペレーターは、次のように識別される定数かどうかを確認します。 <constant name>、置き換えられました。 2番目のパラメーター(ブール値)は、チェック対象を制御します。

  • TRUE:定数が置き換えられているかどうかを確認します

  • FALSE:定数が置き換えられていないかどうかを確認します

それぞれのケースが発生すると、オペレーターは TRUE

構文

{ IF hasconstanttype( <constant namne> , <boolean literal> ) }
{ ELSIF hasconstanttype( <constant namne> , <boolean literal> ) }
297.

{IF hasconstanttype(PLC_PRG.aConst, TRUE)}



. 定数の自動置換は、原則として以下に依存します。
  • コンパイルオプション 定数を置き換える

  • 定数型(たとえば、 STRING タイプが置き換えられることはありません。)

  • 属性の使用法 {attribute 'const_non_replaced'}

  • 属性の使用法 {attribute 'const_replaced'}

298.
VAR
    iCntMAXIsReplaced: INT;
    xErrorOccured : BOOL;
END_VAR
VAR CONSTANT
    c_iMAX: INT := 99;
END_VAR

{IF hasconstanttype(c_iMAX, TRUE)}
    iCntMAXIsReplaced := iCntMAXIsReplaced + 1;
{ELSE}
    xErrorOccured := FALSE;
{END_IF}


hasconstantvalue( <constant name> , <variable name> , <comparison operator> )

演算子は、定数の値を比較します。 <constant name>、2番目のパラメーターの値を使用します。 2番目のパラメーターは、リテラルとして指定できます <literal> または変数として <variable name>

. 比較演算子 <comparison operator>
  • 大なり記号(>)。

  • 以上 (>=)。

  • に等しい (=)。

  • (に等しくない<>)。

  • (以下)<=)。

  • 未満 (<)。

構文

{ IF hasconstantvalue( <constant name> , <variable name> , <comparison operator> )
{ IF hasconstantvalue( <constant name> , <literal> , <comparison operator> )
{ ELSIF hasconstantvalue( <constant name> , <variable name> , <comparison operator> )
{ ELSIF hasconstantvalue( <constant name> , <literal> , <comparison operator> )
299.

{IF hasconstantvalue(PLC_PRG.aConst, 99, >)}

{ELSIF hasconstantvalue(PLC_PRG.aConst, GVL.intconst99, =)}



300.
PROGRAM PRG_ConditionConstantValue
VAR
    iCntMAX: INT;
    iCntGlobalMAX : INT;
    iCntABC: INT;
    iCntGlobalABC : INT;
    xErrorOccured : BOOL;
END_VAR
VAR CONSTANT
    c_iMAX: INT := 999;
    c_sABC: STRING := 'ABC';
    {attribute 'const_non_replaced'}
    c_iNonReplaceable: INT := 888;
END_VAR

{IF hasconstantvalue(c_iMAX, 999, =)}
    iCntMAX := iCntMAX + 1;
{ELSE}
    xErrorOccured := FALSE;
{END_IF}

{IF hasconstantvalue(c_iMAX, GVL.gc_iMAX, =)}
    iCntGlobalMAX := iCntGlobalMAX + 1;
{ELSE}
    xErrorOccured := FALSE;
{END_IF}

{IF hasconstantvalue(c_sABC, 'ABC', =)}
    iCntABC := iCntMAX + 1;
{ELSE}
    xErrorOccured := FALSE;
{END_IF}
{IF hasconstantvalue(c_sABC, GVL.gc_sABC, =)}
    iCntGlobalABC := iCntMAX + 1;
{ELSE}
    xErrorOccured := FALSE;
{END_IF}


hastype (variable: <variable name>, <data type> )

演算子により、式に値が与えられます TRUE 変数が <variable> データ型です <type-spec>。さもないと FALSE が返されます。

可能なデータ型:

BOOL | BYTE | DATE | DATE_AND_TIME | DT | DINT | DWORD | INT | LDATE | LDATE_AND_TIME | LDT | LINT | LREAL | LTIME | LTIME_OF_DAY | LTOD | LWORD | REAL | SINT | STRING | TIME | TIME_OF_DAY | TOD | ULINT | UDINT | UINT | USINT | WORD | WSTRING

301.

要件:2つのアプリケーション App1App2 存在。変数 g_multitype で宣言されています App1 データ型付き LREAL、 の App2 データ型付き STRING

{IF (hastype (variable: g_multitype, LREAL))}
    (*  the following code is only processed in App1 *)
    g_multitype := (0.9 + g_multitype) * 1.1;
{ELSIF (hastype (variable: g_multitype, STRING))}
    (* the following code is only processed in App2 *)
    g_multitype := 'this is a multitalent';
{END_IF}


hasvalue (PackMode, ' <pack mode value> ')

チェックパックモードは、個々のDUTに指定できるプラグマではなく、デバイスの説明に依存します。

hasvalue (RegisterSize, ' <register size> ')

<register size>:CPUレジスタのサイズ(ビット単位)

演算子により、式は値を返します TRUE CPUレジスタのサイズが等しい場合 <register size>

の可能な値 <register size>

  • 16 C16xの場合、

  • 64 X86-64ビットの場合

  • 32 X86-32ビット用

hasvalue (<define-ident>, ' <character string> ')

演算子により、式に値が与えられます TRUE 変数が識別子で定義されている場合 <define-ident> と値を持っています <char-string>。さもないと FALSE が返されます。

要件:2つのアプリケーション App1App2 存在。変数 test アプリケーションで使用されます App1App2。の App1、値が与えられます 1。の App2、値が与えられます 2

{IF hasvalue(test,'1')}
    (*  the following code is only processed in App1 *)
    x := x + 1;
{ELSIF hasvalue(test,'2')}
    (*  the following code is only processed in App2 *)
        x := x + 2;
{END_IF}

project_defined (<global define>)

このオペレータは以下から使用できます CODESYS V3.5 SP20

演算子により、式は値を受け取ります。 TRUE グローバル定義の場合 <global define> のグローバル定義のリストに含まれています。 コンパイルオプション プロジェクト設定の。

演算子は条件として指定されます。 IF ステートメントで使用でき、ST POU およびライブラリの実装部分と宣言部分の両方で使用できます。これらは、次の方法で他の定義と組み合わせることができます。 AND そして OR 演算子がそれぞれの位置で許可されている場合。

POU の宣言部分では、 IF 演算子を使用したステートメント project_defined (<global define>) には次の構造を含めることができます。

  • 変数の宣言

    例:

    {If project_defined(define1)}
        x : DINT;
    {END_IF}
  • コメント

  • 属性の宣言

  • プラグマステートメント

次の構造は次のとおりです。 ない 可能:

  • 完全な変数宣言

    {If project_defined(define1)}
    VAR
        x : DINT;
    END_VAR
    {END_IF}
  • POU からの完全な申告

    例:

    {If project_defined(define1)}
    FUNCTION POU : BOOL
    VAR_INPUT
        x : INT;
    END_VAR
    {END_IF}
  • 範囲: VAR_INPUTVAR_OUTPUTVAR_IN_OUT

NOT <operator>

式には値が与えられます TRUE の逆の値が <operator> 値を返します TRUE<operator> この章で説明する演算子の1つにすることができます。

302.

要件:2つのアプリケーション App1App2 存在。 PLC_PRG1 に存在します App1App2、およびPOU CheckBounds にのみ存在します App1

{IF defined (pou: PLC_PRG1) AND NOT (defined (pou: CheckBounds))}
    (* the following code is only processed in App2 *)
    bANDNotTest := TRUE;
{END_IF}


<operator> AND <operator>

式には値が与えられます TRUE 指定された2つの演算子が戻るとき TRUE<operator> この章で説明する演算子の1つにすることができます。

要件:アプリケーション App1App2 存在。 PLC_PRG1 に存在します App1App2、およびPOU CheckBounds にのみ存在します App1

{IF defined (pou: PLC_PRG1) AND (defined (pou: CheckBounds))}
    (* the following code is only processed in App1 *)
    bANDTest := TRUE;
{END_IF}

<operator> OR <operator>

式は TRUE 指定された2つの演算子のいずれかが TRUE<operator> ここで説明する演算子の1つにすることができます。

303.

要件:2つのアプリケーション App1App2 存在。 POU PLC_PRG1 に存在します App1App2、およびPOU CheckBounds にのみ存在します App1

{IF defined (pou: PLC_PRG1) OR (defined (pou: CheckBounds))}
    (* the following code is only processed in App1 and in App2 *)
    bORTest := TRUE;
{END_IF}


(<operator>)

() 演算子を角かっこで囲みます。