条件付きプラグマ
条件付きプラグマの場合の制限
条件付きコンパイル用のプラグマは、POU の実装でのみ使用してください。宣言では、これらのプラグマは無視され、評価されません。
次の例外に注意してください:IFプラグマはproject_defined演算子を宣言に挿入できます。詳細については、以下を参照してください。IFプラグマとproject_defined (<global define>)
プラグマは、プリコンパイル処理中およびコンパイル処理中にコンパイラによって評価されます。この処理は条件付きコンパイルと呼ばれます。ST実装言語はこれらのプラグマをサポートしています。
その{IF<expression> }プラグマと{ELSIF<expression> }、{ELSE}そして結論{END_IF}指定された条件に応じて保持または無視される実装内のコードを示します。<expression>異なるオペランドと演算子で構成できる整数定数式です。
コンパイル時に、<{IF <expression>}評価されます。その戻り値がFALSEすると、次の分岐が発生します{ELSIF <expression>}セグメントと、セグメントが次の式を返すまでそこで評価される式TRUE式は、0以外の値を返すまで順次評価されます。この式に関連付けられたコードセグメントのみがコンパイルされ、他の式は無視されます。すべての式が0を返す場合、分岐が発生します。{ELSE}。もし{ELSE}プラグマが欠落している場合、コード セグメントがコンパイルされない可能性があります。
| 構文 | コードフラグメントの例 | 説明 | 
|---|---|---|
| 
 | {IF defined (DEF0815)}
{info 'DEF0815 has been defined'}
Cnt0815 := iCnt0815 + 1; | 有効な場合にコンパイルされるコードセグメントの先頭にラベルを付ける | 
| 
 | {ELSIF defined (DEF0816)}
{info 'DEF0815 has been defined'}
iCnt0816 := iCnt0816 + 1; | なし、1つ、または複数) 有効な場合に代替コードセグメントにラベルを付ける分岐 | 
| 
 | {ELSE}
{info 'DEF0815 not defined'}
iCnt0 := iCnt0 - 1; | オプション 前の条件が満たされなかった場合にコンパイルされるコードセグメントにラベルを付けるブランチ | 
| 
 | {END_IF} | 条件付きコードセグメントの終了を示すラベル | 
| 
 | defined (DEF0815) | 状態 コンパイル時に定数であり、コンパイラ定義、変数、リテラルなどの演算子とオペランドで構成できる整数式 | 
コンパイラ定義
コンパイラ定義は、コード内の特定の状態を表すラベルとして使用されます。コンパイラ定義は、defined演算子を使用して設定、削除、またはチェックできます。
| 構文 | 例 | 説明 | 
|---|---|---|
| 
 | {define DEF0815} | コンパイラを定義する 注記コンパイラは定義する | 
| 
 | {define DEF0123 '123'} | コンパイラを定義する | 
| 
 | {undefine DEF0815} | コンパイラ定義を削除します その結果、識別子は未定義になります。未定義のコンパイラ定義を持つプラグマは無視されます。 | 
ヒント
あるいは、POU のプロパティでローカルに式とコンパイラ定義を定義したり、上位アプリケーションのプロパティでアプリケーション全体で定義したりすることもできます。
これを行うには、デバイスツリーでPOUまたは上位アプリケーションを選択します。コンテキストメニューで、プロパティそして、建てるタブ。コンパイラ定義入力フィールドには、リテラルまたは式を定義できます(例:DEF0815)。入力フィールドには、次のようなプラグマ文は想定されていません。{define }、単なる名前です。
複数のコンパイラ定義をコンマで区切って指定できます。
オペレーター
defined (variable: <variable name> )
演算子により、式に値が与えられます TRUE 変数が <variable name> 現在のスコープ内で宣言されています。さもないと FALSE が返されます。
要件:2つのアプリケーション App1 と App2 存在。変数 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 が返されます。
要件:アプリケーション App1 と App2 存在。 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つのアプリケーション App1 と App2 存在。データ型 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つのアプリケーション App1 と App2 存在。 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つのアプリケーション App1 と App2 存在。リソースオブジェクト 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> }{IF defined (task: Task_D)}要件:2つのアプリケーション App1 と App2 存在。タスク 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 が返されます。
要件:2つのアプリケーション App1 と App2 存在。関数 fun1 で宣言されています App1 と App2。ただし、 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 が返されます。
要件:2つのアプリケーション App1 と App2 存在。変数 g_globalInt で使用されます App1 と App2、しかしで App1 属性 'DoCount' にも割り当てられています。
の宣言 g_GlobalInt の App1
VAR_GLOBAL
    {attribute 'DoCount'}
    g_globalInt : INT;
    g_multiType : STRING;
END_VAR宣言 g_GlobalInt の App2:
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> ) }
 {IF hasconstanttype(PLC_PRG.aConst, TRUE)}- コンパイルオプション 定数を置き換える 
- 定数型(たとえば、 - STRINGタイプが置き換えられることはありません。)
- 属性の使用法 - {attribute 'const_non_replaced'}
- 属性の使用法 - {attribute 'const_replaced'}
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> )
{IF hasconstantvalue(PLC_PRG.aConst, 99, >)}{ELSIF hasconstantvalue(PLC_PRG.aConst, GVL.intconst99, =)}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
要件:2つのアプリケーション App1 と App2 存在。変数 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>
- 16C16xの場合、
- 64X86-64ビットの場合
- 32X86-32ビット用
hasvalue (<define-ident>, ' <character string> ')
演算子により、式に値が与えられます TRUE 変数が識別子で定義されている場合 <define-ident> と値を持っています <char-string>。さもないと FALSE が返されます。
要件:2つのアプリケーション App1 と App2 存在。変数 test アプリケーションで使用されます App1 と App2。の 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_INPUT、- VAR_OUTPUT、- VAR_IN_OUT
NOT <operator>
式には値が与えられます TRUE の逆の値が <operator> 値を返します TRUE。 <operator> この章で説明する演算子の1つにすることができます。
要件:2つのアプリケーション App1 と App2 存在。 PLC_PRG1 に存在します App1 と App2、および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つにすることができます。
要件:アプリケーション App1 と App2 存在。 PLC_PRG1 に存在します App1 と App2、および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つにすることができます。
要件:2つのアプリケーション App1 と App2 存在。 POU PLC_PRG1 に存在します App1 と App2、および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>)
() 演算子を角かっこで囲みます。