Skip to main content

メソッド呼び出し

メソッド呼び出しを実装するために、実際のパラメーター(引数)がインターフェース変数に渡されます。または、パラメーター名を省略できます。

宣言されたアクセス修飾子に応じて、メソッドはそれ自体の名前空間内でのみ使用できます(INTERNAL)、独自のプログラミングブロックとその派生物内でのみ(PROTECTED)または独自のプログラミングブロック内のみ(PRIVATE)呼び出されます。で PUBLIC メソッドはどこからでも呼び出すことができます。

実装内では、メソッドはそれ自体を再帰的に呼び出すことができます。メソッドは、 これ ポインタ、または割り当てられた機能ブロックのローカル変数を使用します。

仮想関数呼び出しとしてのメソッド呼び出し

継承は仮想関数呼び出しにつながる可能性があります。

仮想関数呼び出しを使用すると、プログラムのソースコードで同じ呼び出しを実行すると、実行時に異なるメソッドを呼び出すことができます。

メソッド呼び出しは、次の場合に動的にバインドされます。

  • 汎用モジュールへのポインタを使用してメソッドを呼び出します。

    例: pfub^.method

    この状況では、ポインタは機能ブロックタイプのインスタンスとすべての派生機能ブロックのインスタンスを指すことができます。

  • インターフェイス変数のメソッドを呼び出します。

    例: interface1.method

    インターフェイスは、このインターフェイスを実装するファンクションブロックのすべてのインスタンスを参照できます。

  • メソッドは、同じ汎用モジュールの別のメソッドを呼び出します。この場合、メソッドは同じ名前の派生関数ブロックのメソッドを呼び出すこともできます。

  • メソッドは、汎用モジュールへの参照を使用して呼び出されます。この状況では、参照は機能ブロックタイプのインスタンスとすべての派生機能ブロックのインスタンスを指すことができます。

  • あなたが指す VAR_IN_OUT-基本機能ブロックタイプから派生FBタイプのインスタンスへの変数。

    この状況では、変数は関数ブロックのタイプのインスタンスとすべての派生関数ブロックのインスタンスを指すことができます。

31. メソッドが過負荷

機能ブロック fub1fub2 機能ブロックを展開します fubbase インターフェースを実装します interface1。方法があります method1method2

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つの方法 method1method2 含む、上書きする 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>)+ );
32.

宣言

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ステータスにあるときにも開始されます。

33.
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>'} が提供されている場合、コンパイラの警告は抑制されます。章で 属性 '推定スタック使用量 実装例を参照してください。