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.
Um eine Methode einem Funktionsbaustein oder einer Schnittstelle zuzuweisen, wählen Sie den entsprechenden Funktionsbaustein bzw. Schnittstellenknoten in der
aus, klicken Sie auf die grüne Plus-Schaltfläche und führen Sie den Befehl aus. Sie können auch mit der rechten Maustaste auf den Funktionsbaustein bzw. Schnittstellenknoten klicken und im Kontextmenü den Befehl ausführen.Geben Sie im Dialogfeld
einen , den gewünschten , die und den 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 aus. Zum Auswählen des Rückgabetyps kann über die Schaltfläche die geöffnet werden.: Aus Kompatibilitätsgründen sind die Zugriffsbezeichner optional. Der Zugriffsbezeichner ist äquivalent mit dem Angeben keines Bezeichners.
Alternativ kann eine der Optionen aus der Auswahlliste verwendet werden:
: Der Zugriff auf die Methode ist auf den Funktionsbaustein beschränkt.
: Der Zugriff auf die Methode ist auf den Funktionsbaustein und seine Ableitung beschränkt.
: Der Zugriff auf die Methode ist auf den aktuellen Namensraum (die Bibliothek) beschränkt.
Bestätigen Sie diesen Vorgang mit
. Der Methoden-Editor wird geöffnet.EcoStruxure Machine Expert erleichtert die objektorientierte Programmierung durch die Verwendung der Vererbungsfunktion in den Funktionsbausteinen: Wenn Sie den Befehl für einen Funktionsbaustein ausführen, der von einem anderen Funktionsbaustein erbt, werden die im Basisfunktionsbaustein verwendeten Elemente , , und zur Auswahl gestellt:
Die Elemente
, , und , für die im Basisfunktionsbaustein ein = , oder definiert wurde, stehen zur Auswahl. Sie können die Definition für das geerbte Objekt anpassen. Im geerbten Objekt wird derselbe wie bei den Quellelementen zugewiesen.Die Elemente
, , und , für die der = definiert wurde, stehen nicht zur Auswahl, da der Zugriff auf den Basisfunktionsbaustein beschränkt ist.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.
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:
: Die Methode kann innerhalb eines eigenen Namensraums aufgerufen werden.
: Die Methode kann innerhalb ihrer eigenen POU und ihrer Ableitungen aufgerufen werden.
: Die Methode kann in ihrer eigenen POU aufgerufen werden.
: Für den Aufruf der Methode gelten keine Einschränkungen.
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.
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);
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 ');
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 | |
---|---|
Methode |
Beschreibung |
---|---|
|
Eine Methode mit Namen |
|
Wenn eine Methode mit dem Namen |
|
Wenn eine Methode mit dem Namen |
Eigenschaften und Schnittstelleneigenschaften; jede besteht aus einer Set
- und/oder Get
-Accessor-Methode.
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