Methodenaufruf

Um einen Methodenaufruf zu implementieren, werden den Schnittstellenvariablen die tatsächlichen Parameter (Argumente) übergeben. Dabei kann alternativ auf die Parameternamen verzichtet werden.

Je nach deklariertem Zugriffsmodifizierer kann eine Methode nur innerhalb des eigenen Namensraums (INTERNAL), nur innerhalb des eigenen Programmierbausteins und seinen Ableitungen (PROTECTED) oder nur innerhalb des eigenen Programmierbausteins (PRIVATE) aufgerufen werden. Bei PUBLIC kann die Methode überall aufgerufen werden.

Innerhalb der Implementierung kann eine Methode sich selbst rekursiv aufrufen: entweder direkt mit Hilfe des THIS-Pointers oder mit Hilfe einer lokalen Variablen für den zugeordneten Funktionsbaustein.

Methodenaufruf als virtueller Funktionsaufruf

Durch Vererbung kann es zu virtuellen Funktionsaufrufen kommen. Virtuelle Funktionsaufrufe ermöglichen, dass derselbe Aufruf in einem Programm-Quellcode während der Laufzeit verschiedene Methoden aufruft.

In folgenden Fällen wird der Methodenaufruf dynamisch gebunden:

Beispiel

 

Schnittstelle I_Base mit der Methode Method1:

INTERFACE I_Base
METHOD Method1

Funktionsbaustein FB_Base mit der Methode Method1:

FUNCTION_BLOCK FB_Base IMPLEMENTS I_Base
METHOD Method1

Funktionsbaustein FB_Sub1 mit der Methode Method1:

FUNCTION_BLOCK FB_Sub1 EXTENDS FB_Base
METHOD Method1

Funktionsbaustein FB_Sub2 ohne eigene Methode:

FUNCTION_BLOCK FB_Sub2 EXTENDS FB_Base

Programm MAIN:

PROGRAM MAIN
VAR
    nVar       : INT;
    fbBase     : FB_Base;
    fbSub1     : FB_Sub1;
    fbSub2     : FB_Sub2;
    iBase      : I_Base;
    refBase    : REFERENCE to FB_Base;
END_VAR
(* Choosing the desired instances via value of nVar:
    0 => fbBase
    1 => fbSub1
    2 => fbSub2 *)
 
IF nVar = 0 THEN
    iBase     := fbBase;
    refBase REF= fbBase;
 
ELSIF nVar = 1 THEN
    iBase     := fbSub1;
    refBase REF= fbSub1;
 
ELSIF nVar = 2 THEN
    iBase     := fbSub2;
    refBase REF= fbSub2;
END_IF
 
// Regarding each of the following two calls via interface and via reference:
    // If nVar is 0, FB_Base.Method1 will be called for instance fbBase
    // If nVar is 1, FB_Sub1.Method1 will be called for instance fbSub1
    // If nVar is 2, FB_Base.Method1 will be called for instance fbSub2
 
iBase.Method1();
refBase.Method1();

Zusätzliche Ausgänge

Gemäß der Norm IEC 61131-3 können Methoden sowie normale Funktionen zusätzliche Ausgänge deklariert haben. Beim Methodenaufruf weisen Sie den zusätzlichen Ausgängen Variablen zu.

Genaue Informationen hierzu finden Sie unter Objekt Funktion.

Methode rekursiv aufrufen

Hinweis

Verwenden Sie Rekursionen vorwiegend zur Bearbeitung von rekursiven Datentypen wie beispielsweise verketteten Listen. Allgemein ist es ratsam, bei der Verwendung von Rekursion vorsichtig zu sein. Bei einer unerwartet tiefen Rekursion kann es zu einem Stacküberlauf und damit zu einem Maschinenstillstand kommen.

Innerhalb ihrer Implementierung kann eine Methode sich selbst aufrufen:

Üblicherweise wird bei einem solchen rekursiven Aufruf eine Compilerwarnung ausgegeben. Wenn die Methode mit dem Pragma {attribute 'estimated-stack-usage' := '<estimated stack size in bytes>'} versehen ist, wird die Compilerwarnung unterdrückt. Im Kapitel Attribut 'estimated-stack-usage' finden Sie ein Implementierungsbeispiel.

Siehe auch: