プラグマの使用
プラグマインCODESYS
プラグマとは、アプリケーションのソースコード内で中括弧で囲まれたテキストです。プラグマは、コンパイラが評価できる特別な文をコード内に挿入するために使用されます。これにより、プラグマはプリコンパイルまたはコンパイル(コード生成)において、1つまたは複数の変数のプロパティに影響を与えることができます。コンパイラが認識しないプラグマは、コメントとして無視されます。
プラグマのステートメント文字列は、複数の行にまたがることもできます。
構文の詳細については、個々の説明を参照してください。CODESYSプラグマ。
目的に応じて異なるプラグマがあります (例: 変数の初期化、変数の監視、シンボル構成への変数の追加、コンパイル プロセス中のメッセージの強制表示、特定の条件下での変数の動作)。
重要
大文字と小文字を区別する必要があります。
プラグマカテゴリ
そのCODESYSプラグマは次のカテゴリに分類されます。
- コンパイル プロセス中にカスタム メッセージを表示できます。 
- コンパイルとプリコンパイルに影響を与えることができます。そのためには、初期化、監視、シンボル設定への変数の追加など、様々な目的に応じたプラグマを使用できます。 
- コード生成は条件文によって制御できます。例えば、特定の条件下では変数の動作が異なる場合があります。 
- ユーザー定義プラグマ 
ヒント
の中でプロパティダイアログ(コンパイルカテゴリ) では、プラグマで照会できるコンパイラの「定義」を宣言できます。
挿入可能な位置
重要
プラグマCODESYS Cプリプロセッサディレクティブの1対1の実装ではありません。プラグマは通常の文と同様に配置する必要があります。式の中でプラグマを使用することはできません。
コンパイラがさまざまな位置で評価するためのプラグマを挿入できます。
- POUの宣言ヘッダー - 必要なプラグマを、POU の最初の行または変数宣言の前に、別の行としてテキスト エディターに直接入力できます。 - 表形式ビューでは、プラグマを入力するとサポートが表示されます。宣言ヘッダーの編集コマンドを実行します。ダイアログで、属性ボタンをクリックし、入力フィールドに必要なプラグマを入力します。 
- グローバル変数リスト内 
条件付きプラグマの場合の制限
条件付きコンパイル用のプラグマは、POU の実装でのみ使用してください。宣言では、これらのプラグマは無視され、評価されません。
次の例外に注意してください:IFプラグマはproject_defined演算子を宣言に挿入できます。詳細については、以下を参照してください。IFプラグマとproject_defined (<global define>)
- 構造化テキスト(ST) - ST実装言語では、プラグマは「文の位置」に属します。有効な位置は、実装の先頭の別の行です。もう1つの有効な位置は、セミコロンで終わる文の後にラベルが付けられています。 - ;または次のようなキーワードで- END_VAR、- END_IF、 または- END_WHILE。
- ファンクションブロックダイアグラム(FBD)またはラダーダイアグラム(LD) - FBD/LD/ILエディタの実装言語では、プラグマはラベルにも適した位置に配置します。プラグマはラベルと同じように入力できます。これを行うには、コマンドFBD/LD/IL→ラベルを挿入次に、ラベルのテキストフィールドで、デフォルトのテキストを置き換えます。 - Label:必要なプラグマを使用します。ラベルに加えてプラグマを使用するには、最初にプラグマを指定し、次にラベルを指定します。
条件付きプラグマの誤った位置と正しい位置について
PROGRAM PRG_ConditionalPragma
VAR
    strTest : STRING := 'b';
    iResult : INT := 0;
END_VAR
正しくない
{IF defined(DEFINE_A)}
IF strTest = 'a' THEN
{ELSE}
IF strTest = 'b' THEN
{END_IF}
    iResult := {IF defined(DEFINE_B)} 12; {ELSE} 13; {END_IF}
END_IF
正しい
{IF defined(DEFINE_A)}
IF strTest = 'a' THEN
    {IF defined(DEFINE_B)}
    iResult := 16#A;
    {ELSE}
    iResult := 16#AA;
    {END_IF}
END_IF
{ELSE}
IF strTest = 'b' THEN
    {IF defined(DEFINE_B)}
    iResult := 16#B;
    {ELSE}
    iResult := 16#BB;
    {END_IF}
END_IF
{END_IF}範囲
プラグマのタイプと内容に応じて、次のような影響が出る可能性があります。
- その後の宣言 
- まさに次の発言 
- 対応するプラグマによってキャンセルされるまでのすべての後続のステートメント 
- 同じプラグマが他のパラメータ付きで実行されるか、コードの末尾に到達するまで、後続のすべてのステートメント。ここでの「コード」とは、宣言部、実装部、グローバル変数リスト、および型宣言を指します。したがって、プラグマが宣言部の最初の行に単独で存在し、他のプラグマによって置き換えられたりキャンセルされたりしていない場合、プラグマはオブジェクト全体に影響を及ぼします。