メソッド呼び出し
メソッド呼び出しを実装するために、実際のパラメーター(引数)がインターフェース変数に渡されます。または、パラメーター名を省略できます。
宣言されたアクセス修飾子に応じて、メソッドはそれ自体の名前空間内でのみ使用できます(INTERNAL
)、独自のプログラミングブロックとその派生物内でのみ(PROTECTED
)または独自のプログラミングブロック内のみ(PRIVATE
)呼び出されます。で PUBLIC
メソッドはどこからでも呼び出すことができます。
実装内では、メソッドはそれ自体を再帰的に呼び出すことができます。メソッドは、 これ
ポインタ、または割り当てられた機能ブロックのローカル変数を使用します。
仮想関数呼び出しとしてのメソッド呼び出し
継承は仮想関数呼び出しにつながる可能性があります。
仮想関数呼び出しを使用すると、プログラムのソースコードで同じ呼び出しを実行すると、実行時に異なるメソッドを呼び出すことができます。
メソッド呼び出しは、次の場合に動的にバインドされます。
汎用モジュールへのポインタを使用してメソッドを呼び出します。
例:
pfub^.method
この状況では、ポインタは機能ブロックタイプのインスタンスとすべての派生機能ブロックのインスタンスを指すことができます。
インターフェイス変数のメソッドを呼び出します。
例:
interface1.method
インターフェイスは、このインターフェイスを実装するファンクションブロックのすべてのインスタンスを参照できます。
メソッドは、同じ汎用モジュールの別のメソッドを呼び出します。この場合、メソッドは同じ名前の派生関数ブロックのメソッドを呼び出すこともできます。
メソッドは、汎用モジュールへの参照を使用して呼び出されます。この状況では、参照は機能ブロックタイプのインスタンスとすべての派生機能ブロックのインスタンスを指すことができます。
あなたが指す
VAR_IN_OUT
-基本機能ブロックタイプから派生FBタイプのインスタンスへの変数。この状況では、変数は関数ブロックのタイプのインスタンスとすべての派生関数ブロックのインスタンスを指すことができます。
例
機能ブロック fub1
と fub2
機能ブロックを展開します fubbase
インターフェースを実装します interface1
。方法があります method1
と method2
。
PROGRAM PLC_PRG VAR_INPUT b : BOOL; END_VAR VAR pInst : POINTER TO fubbase; instBase : fubbase; inst1 : fub1; inst2 : fub2; instRef : REFERENCE to fubbase; END_VAR IF b THEN instRef REF= inst1; (* reference to fub1 *) pInst := ADR(instBase); ELSE instRef REF= inst2; (* reference to fub2 *) pInst := ADR(inst1); END_IF pInst^.method1(); (* If b is TRUE, fubbase.method1 will be called, otherwise fub1.method1 is called *) instRef.method1(); (* If b ist TRUE, fub1.method1 will be called, otherwise fub2.method1 is called*)
仮定して fubbase
上記の例の2つの方法 method1
と method2
含む、上書きする fub1 method2
、 だがしかし method1
。の呼び出し method1
次のように行われます。
pInst^.method1();
いつ b TRUE
は、呼び出し CODESYSfubbase.method1
それ以外の場合 fub1.method1
。
追加の出口
IEC 61131-3規格によれば、通常の関数と同様に、メソッドは追加の出力を宣言できます。メソッドを呼び出すときは、追加の出力に変数を割り当てます。
詳細については、「機能」のトピックを参照してください。
呼び出されたときの構文
<function block name>.<method name>(<first input name> := <value> (, <further input assignments>)+ , <first output name> => <first output variable name> (,<further output assignments>)+ );
宣言
METHOD PUBLIC DoIt : BOOL VAR_INPUT iInput_1 : DWORD; iInput_2 : DWORD; END_VAR VAR_OUTPUT iOutput_1 : INT; sOutput_2 : STRING; ENDVAR
電話
fbInstance.DoIt(iInput_1 := 1, iInput_2 := 2, iOutput_1 => iLocal_1, sOUtput_2 => sLocal_2);
メソッドが呼び出されると、メソッド出力の値がローカルで宣言された出力変数に書き込まれます。
アプリケーションがSTOPステータスの場合でもメソッドを呼び出す
(ライブラリブロックの)特定の関数ブロックインスタンスがタスクサイクルで常に特定のメソッドを呼び出すことは、デバイスの説明で定義できます。メソッドが次の例の入力パラメーターを受け取る場合、それは機能します CODESYS このメソッドは、アクティブなアプリケーションが現在STOPステータスにあるときにも開始されます。
VAR_INPUT pTaskInfo : POINTER TO DWORD; pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO; END_VAR (*Now the status of the application can be queried via pApplicationInfo and the instructions can be implemented: *) IF pApplicationInfo^.udState = 1 THEN <instructions> END_IF;
メソッドを再帰的に呼び出す
ヒント
主に再帰を使用して、リンクリストなどの再帰データ型を操作します。一般に、再帰を使用するときは注意することをお勧めします。予想外に深い再帰が発生すると、スタックオーバーフローが発生し、マシンが停止する可能性があります。
その実装内で、メソッドはそれ自体を呼び出すことができます。
を介して直接、
これ
ポインタ基本機能ブロックのローカル機能ブロックインスタンスを間接的に使用する
コンパイラの警告は通常、このような再帰呼び出しで発行されます。プラグマを使用したメソッドの場合 {attribute 'estimated-stack-usage' := '<estimated stack size in bytes>'}
が提供されている場合、コンパイラの警告は抑制されます。章で 属性 '推定スタック使用量 実装例を参照してください。