Methode

Übersicht

Eine Methode ist ein Sprachelement, vergleichbar mit einer Funktion, das im Kontext eines Funktionsbausteins verwendet werden kann. Sie kann als Funktion betrachtet werden, die eine Instanz des jeweiligen Funktionsbausteins beinhaltet. Wie eine Funktion hat eine Methode einen Rückgabewert und einen eigenen Deklarationsteil für temporäre Variablen und Parameter.

Als Mittel der objektorientierten Programmierung können Sie desweiteren Schnittstellen zur Organisation von Methoden in einem Projekt verwenden.

HINWEIS: Beim Kopieren oder Verschieben einer Methode oder Eigenschaft von einer POU in eine Schnittstelle werden die enthaltenen Implementierungen automatisch gelöscht. Beim Kopieren oder Verschieben von einer Schnittstelle in eine POU werden Sie zur Angabe der gewünschten Implementierungssprache aufgefordert.

Einfügen einer Methode

Um eine Methode einem Funktionsbaustein oder einer Schnittstelle zuzuweisen, wählen Sie den entsprechenden Funktionsbaustein bzw. Schnittstellenknoten in der Anwendungsbaumstruktur aus, klicken Sie auf die grüne Plus-Schaltfläche und führen Sie den BefehlMethode aus. Sie können auch mit der rechten Maustaste auf den Funktionsbaustein bzw. Schnittstellenknoten klicken und im Kontextmenü den Befehl Objekt hinzufügen > Methode ausführen.

Geben Sie im Dialogfeld Methode hinzufügen einen Namen, den gewünschten Rückgabetyp, die Implementierungssprache und den Zugriffsbezeichner ein (siehe unten). Wenn für die Methode keine Implementierung vorhanden ist und die Implementierung vom abgeleiteten Funktionsbaustein bereitgestellt wird, wählen Sie die Option Abstrakt aus. Zum Auswählen des Rückgabetyps kann über die Schaltfläche ... die Eingabehilfe... geöffnet werden.

Zugriffsbezeichner: Aus Kompatibilitätsgründen sind die Zugriffsbezeichner optional. Der Zugriffsbezeichner PUBLIC ist äquivalent mit dem Angeben keines Bezeichners.

Alternativ kann eine der Optionen aus der Auswahlliste verwendet werden:

  • PRIVATE: Der Zugriff auf die Methode ist auf den Funktionsbaustein beschränkt.

  • PROTECTED : Der Zugriff auf die Methode ist auf den Funktionsbaustein und seine Ableitung beschränkt.

  • INTERNAL: Der Zugriff auf die Methode ist auf den aktuellen Namensraum (die Bibliothek) beschränkt.

Bestätigen Sie diesen Vorgang mit Öffnen. Der Methoden-Editor wird geöffnet.

Eingabehilfe bei der Erstellung übernehmender Funktionsbausteine

EcoStruxure Machine Expert erleichtert die objektorientierte Programmierung durch die Verwendung der Vererbungsfunktion in den Funktionsbausteinen: Wenn Sie den Befehl Objekt hinzufügen für einen Funktionsbaustein ausführen, der von einem anderen Funktionsbaustein erbt, werden die im Basisfunktionsbaustein verwendeten Elemente Aktion, Methode, Eigenschaft und Transition zur Auswahl gestellt:

  • Die Elemente Aktion, Methode, Eigenschaft und Transition, für die im Basisfunktionsbaustein ein Zugriffsmodifizierer = ÖFFENTLICH, GESCHÜTZT oder INTERN definiert wurde, stehen zur Auswahl. Sie können die Definition für das geerbte Objekt anpassen. Im geerbten Objekt wird derselbe Zugriffsmodifizierer wie bei den Quellelementen zugewiesen.

  • Die Elemente Aktion, Methode, Eigenschaft und Transition, für die der Zugriffsmodifizierer = PRIVAT definiert wurde, stehen nicht zur Auswahl, da der Zugriff auf den Basisfunktionsbaustein beschränkt ist.

Deklarieren einer Methode

Syntax:

METHOD <Zugriffsbezeichner> <Methodenname>: <return data type>VAR_INPUT ... END_VAR

Eine Beschreibung zur Deklaration von Schnittstellen, die Methoden handhaben, erhalten Sie im Kapitel zu Schnittstellen.

Aufrufen einer Methode

Methodenaufrufe werden auch „virtuelle Funktionsaufrufe“ genannt. Weitere Information hierzu finden Sie im Kapitel Methodenaufruf.

Beachten Sie folgenden Hinweis beim Aufrufen einer Methode:

  • Alle Daten einer Methode sind temporäre Daten und nur während der Ausführung einer Methode gültig (Stack-Variablen). Deshalb werden die Variablen und Funktionsbausteine, die in einer Methode deklariert werden, bei jedem Methodenaufruf neu initialisiert.

  • Methoden, die in einer Schnittstelle definiert sind, dürfen nur Eingangs-, Ausgangs- und Ein-/Ausgangs-Variablen, aber keinen Rumpf (Implementierungsteil) enthalten.

  • Methoden können wie Funktionen zusätzliche Ausgänge enthalten. Diese müssen während des Methodenaufrufs zugewiesen werden.

  • Der deklarierte Zugriffsbezeichner legt fest, wie die Methode aufgerufen werden kann:

    • INTERNAL: Die Methode kann innerhalb eines eigenen Namensraums aufgerufen werden.

    • PROTECTED : Die Methode kann innerhalb ihrer eigenen POU und ihrer Ableitungen aufgerufen werden.

    • PRIVATE: Die Methode kann in ihrer eigenen POU aufgerufen werden.

    • PUBLIC: Für den Aufruf der Methode gelten keine Einschränkungen.

HINWEIS: Wenn für die Methode kein Rückgabewert definiert ist, wird der Wert des ersten Ausgangs zurückgegeben. Wenn für diese Methode kein Ausgang verfügbar ist, wird eine Compiler-Fehlermeldung generiert.

Implementieren einer Methode

Beachten Sie bei der Implementierung einer Methode Folgendes:

  • Im Rumpf einer Methode ist der Zugriff auf Variablen der Funktionsbaustein-Instanz erlaubt.

  • Bei Bedarf ist der THIS-Zeiger zu verwenden, der immer auf die aktuelle Instanz weist.

  • Auf VAR_TEMP-Variablen des Funktionsbausteins kann in einer Methode nicht zugegriffen werden.

  • Ein Methode kann sich selbst rekursiv aufrufen.

Aufrufen einer Methode

Verwenden Sie die folgende Sytax für den Aufruf einer Methode:

<return value variable> := <POU name> . <method name> ( <method input name> := <variable name> (, <further method input name> := <variable name> )* );

Deklarationsbeispiel:

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
    iInput_1 : DWORD;
    iInput_2 : DWORD;
    sInput_3 : STRING(12);
END_VAR

Aufrufbeispiel:

bFinishedMethod := fbInstance.DoIt(sInput_3 :='Hello World ', iInput_2 := 16#FFFF,iInput_1 := 16);
HINWEIS: Beim Aufruf der Methode wird der Rückgabewert der Methode beispielsweise lokal deklarierten Variablen zugewiesen. Wenn Sie die Namen der Eingangsvariablen übergehen, müssen Sie die Deklarationsreihenfolge beachten.

Deklarationsbeispiel:

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
    iInput_1 : DWORD;
    iInput_2 : DWORD;
    sInput_3 : STRING(12);
END_VAR

Aufrufbeispiel:

bFinishedMethod := fbInstance.DoIt( 16, 16#FFFF,'Hello World ');

Rekursiver Methodenaufruf

Innerhalb der Implementierung kann eine Methode sich selbst aufrufen, entweder direkt über den THIS-Parameter oder über eine lokale Variable für den zugewiesenen Funktionsbaustein.

  • THIS^. <method name> ( <parameter transfer of all input and output variables>)

    Direkter Aufruf der relevanten Funktionsbaustein-Instanz mit dem THIS-Zeiger.

  • VAR fb_Temp : <function block name>; END_VAR

    Aufruf über eine lokale Variable der Methode, die den relevanten Funktionsbaustein vorübergehend instanziiert.

Ein rekursiver Aufruf hat die Ausgabe einer Compiler-Meldung zur Folge. Die Compiler-Meldung wird nicht ausgegeben, wenn die Methode mit dem Pragma {attribute 'estimated-stackusage : '<estimated_stack_size_in_bytes>'} bereitgestellt wird. Im Kapitel Attribute estimated-stack-usage finden Sie ein Implementierungsbeispiel.

Damit ist die Angabe des Methodennamens für rekursive Methodenaufrufe nicht ausreichend. In diesem Fall wird folgende Meldung angezeigt:

Program name, function or function block instance expected instead of
HINWEIS: Rekursive Aufrufe sind von Natur aus schwer zu implementieren und zu debuggen und können darüber hinaus unerwünschte Nebenwirkungen auslösen, z. B. Speicherprobleme und Watchdog-Timeouts.
HINWEIS
UNBEABSICHTIGTE APPLIKATIONSSPROBLEME
  • Implementieren Sie rekursive Algorithmen nur, wo unbedingt erforderlich.
  • Sie müssen im Detail mit den Verfahren zur rekursiven Implementierung vertraut sein und den entsprechenden Code ausführlich dokumentieren.
Die Nichtbeachtung dieser Anweisungen kann Sachschäden zur Folge haben.

Spezielle Methoden für einen Funktionsbaustein

Methode

Beschreibung

Init

Eine Methode mit Namen FB_init wird immer implizit deklariert, kann aber auch explizit deklariert werden. Sie enthält einen Initialisierungs-Code für den Funktionsbaustein, wie er im Deklarationsteil des Funktionsbausteins definiert ist. Vgl. FB_init-Methode.

Reinit

Wenn eine Methode mit dem Namen FB_reinit deklariert ist, wird diese aufgerufen, nachdem die Instanz des Funktionsbausteins kopiert wurde (wie während einer Online-Änderung (Online Change)), und reinitialisiert das neue Instanzmodul. Vgl. FB_init, FB_reinit-Methoden.

Exit

Wenn eine Methode mit dem Namen FB_exit benötigt wird, muss sie explizit deklariert werden. Es gibt keine implizite Deklaration. Die Exit-Methode wird für jede Instanz des Funktionsbausteins vor einem erneuten Download, einem Reset oder während einer Online-Änderung für alle verschobenen oder gelöschten Instanzen aufgerufen. Vgl. FB_exit-Methode.

Eigenschaften und Schnittstelleneigenschaften; jede besteht aus einer Set- und/oder Get-Accessor-Methode.

Aufruf einer Methode, auch wenn die Anwendung im STOP-Status ist

In der Gerätebeschreibungsdatei kann definiert werden, dass eine bestimmte Methode von einer bestimmten Funktionsbausteininstanz (eines Bibliotheksbausteins) immer taskzyklisch aufgerufen werden soll. Wenn diese Methode die folgenden Eingabeparameter enthält, wird sie auch abgearbeitet, wenn die aktive Anwendung gerade nicht ausgeführt wird.

Beispiel

VAR_INPUT
pTaskInfo : POINTER TO DWORD;
pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR

Der Programmierer kann den Anwendungsstatus über pApplicationInfo abfragen und die weitere Vorgehensweise bestimmen.

IF pApplicationInfo^.state = RUNNING THEN <instructions> END_IF