Implementieren von Schnittstellen
Zur Unterstützung der objektorientierten Programmierung kann ein Funktionsbaustein mehrere Schnittstellen implementieren, die die Verwendung von Methoden ermöglichen.
FUNCTION_BLOCK <Funktionsbausteinname> IMPLEMENTS <Schnittstelle_1 Name>|,<Schnittstelle_2 Name>, ..., <Schnittstelle_n Name>
Ein Funktionsbaustein, der eine Schnittstelle implementiert, muss alle Methoden und Eigenschaften (Schnittstelleneigenschaften) dieser Schnittstelle enthalten. Das bedeutet, dass der Name, die Eingänge und der Ausgang einer bestimmten Methode bzw. Eigenschaft identisch sein müssen.
Zu diesem Zweck werden – sobald ein neuer Funktionsbaustein erstellt wird, der eine Schnittstelle implementiert – automatisch alle Methoden und Eigenschaften, die in dieser Schnittstelle definiert sind, unterhalb des neuen Funktionsbausteins in der Anwendungsbaumstruktur eingefügt.
HINWEIS: Wenn anschließend Methoden zur Schnittstellendefinition hinzugefügt werden, werden diese nicht automatisch in den betroffenen Funktionsbausteinen hinzugefügt, wodurch Compiler-Fehler erzeugt werden. Dies muss explizit mit dem Befehl Schnittstellen implementieren... vorgenommen werden.
Wenn Sie die Vererbung für Funktionsbausteine verwenden, beachten Sie Folgendes: Methoden oder Attribute, die durch die Vererbung einer Schnittstelle erstellt wurden, müssen entweder implementiert oder gelöscht werden, wenn die Implementierung des Basisfunktionsbausteins verwendet werden soll. Pragma-Attribute werden automatisch eingefügt. Sie werden bei der Kompilierung erkannt und lösen die Ausgabe entsprechender Meldungen aus, um Sie daran zu erinnern, dass die geerbten Methoden bzw. Eigenschaften noch geprüft werden müssen. Löschen Sie die Pragma-Attribute, sobald Sie den neuen Funktionsbaustein vollständig implementiert haben.
Weitere Informationen finden Sie in der Beschreibung des Befehls Schnittstellen implementieren....
INTERFACE I1 enthält die Methode GetName:
METHOD GetName : STRING
Die Funktionsbausteine A und B implementieren jeweils die Schnittstelle I1:
FUNCTION_BLOCK A IMPLEMENTS I1
FUNCTION_BLOCK B IMPLEMENTS I1
Demzufolge muss in beiden Funktionsbausteinen die Methode GetName verfügbar sein. Die Methode wird automatisch unter jedem Funktionsbaustein eingefügt, sobald die Funktionsbausteine in die Anwendungsbaumstruktur eingefügt werden.
Sehen Sie sich die Deklaration einer Variablen vom Typ I1 an:
FUNCTION DeliverName : STRING
VAR_INPUT
l_i : I1;
END_VAR
Dieser Eingang kann alle Funktionsbausteine entgegennehmen, die die Schnittstelle I1 implementieren.
Beispiel für Funktionsaufrufe:
DeliverName(l_i := A_instance); // call with instance of type A
DeliverName(l_i := B_instance); // call with instance of type B
HINWEIS: Einer Variablen vom Typ „Schnittstelle“ muss eine Instanz eines Funktionsbausteins zugewiesen werden, bevor eine Methode auf diese aufgerufen werden kann. Eine Variable vom Typ „Schnittstelle“ ist immer ein Verweis auf die zugewiesene Funktionsbausteininstanz.
Demzufolge führt ein Aufruf einer Schnittstellenmethode zu einem Aufruf der Funktionsbausteinimplementierung. Sobald die Referenz zugewiesen ist, wird die entsprechende Adresse im Online-Modus überwacht. Andernfalls, wenn noch keine Referenz zugewiesen wurde, wird der Wert 0 während der Überwachung im Online-Modus angezeigt.
Beispiel im Implementierungsteil der oben beschriebenen Funktion DeliverName:
DeliverName := l_i.GetName(); // in this case it depends on the "real" type of l_i whether A.GetName or B.GetName is called
HINWEIS: Es besteht auch die Möglichkeit zur Erweiterung eines Funktionsbausteins in der Deklaration mithilfe des Schlüsselworts EXTENDS.