条件付きプラグマ
重要
ST POU の実装では条件付きプラグマを使用します。 CODESYS 条件付きプラグマを宣言部分で使用する場合、条件付きプラグマは評価されません。
例外は、次の条件付きプラグマです。 {project_define (<global define>)}
POU の実装部分と宣言部分で使用できる演算子 (「 project_defined (<global define>))。
条件付きプラグマの目的は、プリコンパイルまたはコンパイルプロセスでコードが生成される方法に影響を与えることです。 ST実装言語は、これらのプラグマをサポートします。
条件付きプラグマを使用すると、コンパイルで実装コードが考慮されるかどうかに影響を与えます。たとえば、これを特定の変数が宣言されているかどうか、特定のPOUが存在するかどうかなどに依存させることができます。
プラグマ | 説明 |
---|---|
| 値を照会して比較することができます |
| The |
| これらは、条件付きコンパイルのプラグマです。 指定された式 |
| 1つまたは複数を使用できます 演算子 定数式内 |
ヒント
式を指定して、 define
としての定義 コンパイラ定義 に 建てる POUの[プロパティ]ダイアログのタブ。指定した場合 define
プロパティダイアログの定義では、用語を省略する必要があります {define}
、実装コードの定義とは対照的です。さらに、複数のカンマ区切りを指定できます 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>
16
C16xの場合、64
X86-64ビットの場合32
X86-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>)
()
演算子を角かっこで囲みます。