メソッド : FB_Init
、 FB_Reinit
、FB_Exit
関数ブロック変数の初期化、および関数ブロックを終了するときの動作に影響を与えるために、メソッドを明示的に宣言できます。
ヒント
暗黙的なメソッドの戻り値のタイプは次のとおりです。 BOOL
。値はシステムによって評価されませんが、タイプは変更しないでください。
FB_Init
常に暗黙的に使用可能であり、主に初期化に使用されます。特定の影響については、メソッドを明示的に宣言し、標準の初期化コードとともに追加のコードを提供することもできます。
FB_Reinit
明示的に実装する必要があります。このメソッドが存在する場合は、影響を受ける関数ブロックのインスタンスが次のようになった後に呼び出されます。 コピー。これは、新しいインスタンスモジュールを再初期化するために、機能ブロック宣言を変更した後のオンライン変更(署名の変更)中に発生します。機能ブロックの基本的な実装を再初期化するには、を呼び出す必要があります FB_Reinit
明示的に。
FB_Exit
明示的に実装する必要があります。実装がある場合は、コントローラーが関数ブロックインスタンスのコードを削除する前にメソッドが呼び出されます(暗黙的な呼び出し)。
以下に、さまざまな動作条件でのこれらの方法のいくつかの使用例を示します。
「最初のダウンロード」オペレーティングケース
工場出荷時の設定でアプリケーションをPLCにダウンロードする場合、すべての変数のメモリを必要な初期状態にオフセットする必要があります。このようにして、汎用ブロックインスタンスのデータ領域に必要な値が割り当てられます。の明示的な実装によって FB_Init
機能ブロックの場合、アプリケーションコードでこの状況に具体的に対応できます。メソッドパラメータを評価する bInCopyCode
((FALSE
) と bInitRetains
((TRUE
)、この動作状態を明確に検出できます。
「オンライン変更」オペレーティングケース
オンライン変更の範囲内で、メソッドを使用して汎用ブロックインスタンスの初期化に影響を与えることができます。 FB_Exit
、 FB_Init
、 と FB_Reinit
。オンライン変更中に、オフラインモードで行われたアプリケーションへの変更は、実行中のPLCに適用されます。したがって、「古い」機能ブロックインスタンスは、問題なく可能な限り「新しい兄弟」に置き換えられます。ログイン前にアプリケーションの機能ブロックの宣言部分に変更が加えられていない場合、実装のみで、データ領域は置き換えられません。コードブロックのみが置き換えられます。次に、メソッド FB_Exit
、 FB_Init
、 と FB_Reinit
呼び出されません。
ヒント
上記のコピー操作につながる機能ブロックの宣言に変更を加えた場合、オンライン変更中に「意図しない影響の可能性」に関するメッセージが表示されます。の中に 詳細 メッセージビューの中に、コピーされるすべてのインスタンスのリストが表示されます。
のコードで FB_Init
メソッド、パラメータ bInCopyCode
((TRUE
)を評価して、オンライン変更が実行されているかどうかを検出できます。
オンライン変更中に、次の呼び出しが連続して発生します。
FB_Exit
old_inst.FB_Exit(bInCopyCode := TRUE);
あなたは呼び出すことができます
FB_Exit
特定のクリーンアップタスクをトリガーするために「古い」インスタンスを終了するとき コピー操作前。このようにして、次のコピー操作のためにデータを準備し、新しいインスタンスの状態に影響を与えることができます。メモリ内の場所の保留中の変更について、アプリケーションの他の部分に通知できます。タイプの変数に特に注意してくださいPOINTER
とREFERENCE
。これらは、オンライン変更後に必要なメモリ位置を参照しなくなる可能性があります。インターフェイス変数(INTERFACE
)はコンパイラによって個別に処理され、オンライン変更中にそれに応じて調整されます。ソケット、ファイル、その他のハンドルなどの外部リソースは、新しいインスタンスによって適用できますが、場合によっては変更されません。多くの場合、オンライン変更中に特別に扱う必要はありません。 (「「再ダウンロード」操作ケース」を参照)FB_Init
new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);
FB_Init
コピー操作の前に呼び出され、オンライン変更の特定の操作を実行するために使用できます。たとえば、メモリ内の「新しい」場所でそれに応じて変数を初期化したり、メモリ内の特定の変数の新しい場所についてアプリケーションの他の部分に通知したりできます。コピー操作:
copy
copy(&old_inst, &new_inst);
既存の値は変更されません。この目的のために、それらは古いインスタンスから新しいインスタンスにコピーされます。
FB_Reinit
new_inst.FB_Reinit();
このメソッドはコピー操作の後に呼び出され、インスタンスの変数に定義された値を設定する必要があります。たとえば、メモリ内の「新しい」場所でそれに応じて変数を初期化したり、メモリ内の特定の変数の新しい場所についてアプリケーションの他の部分に通知したりできます。オンライン変更とは独立した実装を設計します。このメソッドは、関数ブロックインスタンスを元の状態にリセットするために、いつでもアプリケーションから呼び出すことができます。
ヒント
とともに {attribute 'no_copy'}
属性を使用すると、機能ブロックの単一変数のオンライン変更中にこれがコピーされるのを防ぐことができます。常に初期値を保持します。
詳細については、以下を参照してください。 オンライン変更のためのメモリリザーブの設定
「新規ダウンロード」オペレーティングケース
アプリケーションをダウンロードすると、PLC上の既存のアプリケーションが置き換えられる場合があります。したがって、現在の機能ブロックへのメモリの提供を調整する必要があります。あなたは使用することができます FB_Exit
これに必要な手順を実装するための方法。たとえば、定義された状態で外部リソース(ソケットおよびファイルハンドルを使用)をオフセットできます。
この動作状態は、パラメータの有無で検出できます。 bInCopyCode = FALSE
のために FB_Exit
方法。
「アプリケーションの開始」オペレーティングケース
最初の割り当ては、アプリケーションタスクの最初のサイクルの前に処理されます。
T1 : TON := (PT:=t#500ms);
これらの種類の割り当ては、呼び出し後にのみ実行されます FB_Init
。これらの割り当ての効果を制御するために、機能ブロックまたは機能ブロックのメソッドを提供することができます。 {attribute ‘call_after_init‘}
属性。関数ブロック本体の宣言部分の上、および対応するメソッドの宣言部分の上に属性を追加する必要があります。を使用する別のPOUを拡張するPOU {attribute 'call_after_init'}
属性にも属性が必要です。わかりやすくするために、対応するメソッドを同じ名前、同じ署名、同じ属性で上書きすることをお勧めします。これには電話が必要です SUPER^.MyInit
。メソッドの名前は制限なく選択できます。 (例外: FB_Init
、 FB_Reinit
、 と FB_Exit
)。このメソッドは、最初の割り当てを処理した後、アプリケーションタスクを開始する前に呼び出されます。したがって、メソッドはユーザー入力に反応できます。
使用する場合 FB_Init
また {attribute 'call_after_init'}
、でエラーを検出することを忘れないでください FB_Init
メソッドまたはで装飾されたメソッドで {attribute 'call_after_init'}
ブレークポイントの設定が期待される効果をもたらさない可能性があるため、属性は面倒です。
重要
実行中に明示的に定義された初期化コードに到達した場合、機能ブロックインスタンスは暗黙的な初期化コードを介してすでに完全に初期化されています。したがって、 SUPER^.FB_Init
電話。
重要
FB_Init
を置き換えます INI
で使用される演算子 CoDeSys V2.3。メソッドは、C#、C ++、Javaなどのコンストラクターの設計と比較することはできません。これは、他の機能ブロックを拡張する機能ブロックに影響を及ぼします。 (以下を参照:「派生機能ブロック」)
メソッドのインターフェース FB_Init
METHOD FB_Init : BOOL VAR_INPUT bInitRetains : BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold) bInCopyCode : BOOL; // TRUE: the instance will be copied to the copy code afterward (online change) END_VAR
追加の機能ブロック入力をで宣言することができます FB_init
方法。次に、これらの入力を汎用ブロックインスタンスの宣言で設定する必要があります。
方法 FB_Init
のために serialdevice
ファンクションブロック
METHOD PUBLIC FB_Init : BOOL VAR_INPUT nbInitRetains : BOOL; // initializing of retain variable bInCopyCode : BOOL; // instance is copied to copy code iCOMnum : INT; // additional input: number of the COM interface, that is to be observed END_VAR
のインスタンス化 serialdevice
ファンクションブロック:
com1: serialdevice(iCOMnum:=1); com0: serialdevice(iCOMnum:=0);
メソッドのインターフェース FB_Reinit
METHOD FB_Reinit : BOOL
メソッドのインターフェース FB_Exit
必須パラメータがあります bInCopyCode
。
METHOD FB_Exit : BOOL VAR_INPUT bInCopyCode : BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change). END_VAR
派生関数ブロックの動作
機能ブロックが別の機能ブロックから派生している場合、 FB_Init
派生関数ブロックのメソッドは、と同じパラメータを定義する必要があります FB_Init
基本機能ブロックのメソッド。ただし、インスタンスの特別な初期化を設定するために、さらにパラメーターを追加できます。
機能ブロック MainFB
、 SubFB
、 と SubSubFB
互いに派生しています。したがって、 SubFB EXTENDS MainFB
と SubSubFB EXTENDS SubFB
申し込み。
FB_Exit
と FB_Init
:fbSubSubFb.FB_Exit(...);
fbSubFb.FB_Exit(...);
fbMainFb.FB_Exit(...);
fbMainFb.FB_Init(...);
fbSubFb.FB_Init(...);
fbSubSubFb.FB_Init(...);