Anwendungsfälle von geerbten Elementen
Generell können geerbte Elemente, auf die die Unterklasse entsprechenden Zugriff besitzt (siehe Abschnitt „Zugriffsmöglichkeiten auf geerbte Elemente“), auf drei verschiedene Arten genutzt werden:
- Geerbte Elemente können unverändert genutzt werden.
- Geerbte Elemente können überschrieben werden.
- Geerbte Elemente können erweitert werden.
Diese drei Anwendungsfälle werden im Folgenden am Beispiel des Elements "Methode" erläutert.
Unveränderte Nutzung
- Voraussetzung: Die Unterklasse benötigt genau die gleichen Implementierungen, die in der Methode der Basisklasse bereits programmiert wurden.
- Umsetzung: In diesem Fall wird die Methode für die Unterklasse nicht angelegt.
- Folge: Die Unterklasse nutzt die Methodenimplementierung der Basisklasse.
- Beispiel:
- Die Basisklasse muss für die Ausführung eines Prozesses eine Achse ansteuern.
- Für die Unterklasse gilt die gleiche Anforderung: die Unterklasse muss ebenfalls die Achse ansteuern.
- In diesem Fall wird die Methode ExecuteProcess für die Unterklasse nicht angelegt. Wenn für eine Instanz der Unterklasse die Methode aufgerufen wird (fbSub.ExecuteProcess(…)), wird automatisch die Basisimplementierung der Methode aufgerufen (FB_Base.ExecuteProcess). Dadurch profitiert die Unterklasse von den Implementierungen, die bereits in der Basisklasse umgesetzt wurden.
Funktionsbaustein FB_Base:
FUNCTION_BLOCK FB_Base
VAR
fbAxis : FB_Axis;
END_VAR
Methode FB_Base.ExecuteProcess:
METHOD ExecuteProcess : BOOL
VAR_INPUT
bExecuteProcess : BOOL;
END_VAR
// Calling axis module by passing input parameter "bExecuteProcess" of this method to the input parameter "bExecute" of method "Execute"
fbAxis.Execute(bExecute := bExecuteProcess);
// Setting the return value of this method as inverted error signal of the axis module
ExecuteProcess := NOT fbAxis.Error;
Funktionsbausteinstein FB_Sub:
FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
VAR
END_VAR
Methode FB_Sub.ExecuteProcess:
[existiert nicht]
Überschreibung
- Voraussetzung: Die Unterklasse benötigt in der Methode im Vergleich zur Basisklasse komplett andere Anweisungen.
- Umsetzung: In diesem Fall wird die Methode für die Unterklasse angelegt und im Implementierungsteil mit entsprechend anderen Anweisungen gefüllt. Im Vergleich zur Methode der Basisklasse unterscheidet sich nur der Implementierungsteil – der Deklarationsteil muss identisch sein.
- Folge: Die Unterklasse nutzt ihre eigene Implementierung der Methode. Die Unterklasse hat die Methode der Basisklasse überschrieben.
- Beispiel:
- Die Basisklasse muss für die Ausführung eines Prozesses eine Achse ansteuern.
- Die Unterklasse muss bei der Prozessausführung hingegen keine Achse, sondern einen Zylinder ansteuern.
- In diesem Fall wird die Methode ExecuteProcess für die Unterklasse angelegt. Der Implementierungsteil der Methode wird mit den benötigten Anweisungen programmiert, die verglichen mit der Basisimplementierung eine komplett andere Wirkung erzielen.
Funktionsbaustein FB_Base:
FUNCTION_BLOCK FB_Base
VAR
fbAxis : FB_Axis;
END_VAR
Methode FB_Base.ExecuteProcess:
METHOD ExecuteProcess : BOOL
VAR_INPUT
bExecuteProcess : BOOL;
END_VAR
// Calling axis module by passing input parameter "bExecuteProcess" of this method to the input parameter "bExecute" of method "Execute"
fbAxis.Execute(bExecute := bExecuteProcess);
// Setting the return value of this method as inverted error signal of the axis module
ExecuteProcess := NOT fbAxis.Error;
Funktionsbausteinstein FB_Sub:
FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
VAR
fbCylinder : FB_Cylinder;
END_VAR
Methode FB_Sub.ExecuteProcess:
METHOD ExecuteProcess : BOOL
VAR_INPUT
bExecuteProcess : BOOL;
END_VAR
// Calling cylinder module by passing input parameter "bExecuteProcess" of this method to the input parameter "bExecute" of method "Execute"
fbCylinder.Execute(bExecute := bExecuteProcess);
// Setting the return value of this method as inverted error signal of the cylinder module
ExecuteProcess := NOT fbCylinder.Error;
Erweiterung
- Voraussetzung: Die Unterklasse benötigt sowohl die Implementierung, wie sie in der Basisklasse bereits umgesetzt wurde, als auch zusätzliche Anweisungen, die spezifisch für die Unterklasse sind.
- Umsetzung: In diesem Fall wird die Methode für die Unterklasse angelegt und im Implementierungsteil mit den zusätzlich benötigten Anweisungen gefüllt. An der gewünschten Stelle innerhalb der Unterklassenmethode wird die Methode der Basisklasse mittels SUPER^.SampleMethod(…) aufgerufen. Mithilfe dieses Aufrufs wird die ursprüngliche Methode der Basisklasse ausgeführt. Durch die zusätzlichen Anweisungen innerhalb der Unterklassenmethode werden zudem weitere Anweisungen ausgeführt, die speziell für die Unterklasse benötigt werden.
- Folge: Die Unterklasse nutzt sowohl ihre eigene, zusätzliche Implementierung als auch die Implementierung der Basisklasse (mittels Aufruf über den SUPER-Zeiger). Die Unterklasse hat die Methode der Basisklasse erweitert.
- Beispiel:
- Die Basisklasse muss für die Ausführung eines Prozesses eine Achse ansteuern.
- Die Unterklasse muss bei der Prozessausführung ebenfalls eine Achse ansteuern. Zusätzlich muss die Unterklasse allerdings noch einen Zylinder ansteuern.
- In diesem Fall wird die Methode ExecuteProcess für die Unterklasse angelegt. Der Implementierungsteil der Methode wird mit den benötigten, zusätzlichen Anweisungen programmiert. An geeigneter Stelle im Ablauf der Unterklassenmethode wird die Methode der Basisklasse (FB_Base.ExecuteProcess) mithilfe des SUPER-Zeigers aufgerufen (SUPER^.ExecuteProcess(…)). Dadurch profitiert die Unterklasse von den Implementierungen, die bereits in der Basisklasse umgesetzt wurden – sie kann die Implementierungen aber zusätzlich mit Anweisungen erweitern/spezialisieren, die von der Unterklasse benötigt werden.
Funktionsbaustein FB_Base:
FUNCTION_BLOCK FB_Base
VAR
fbAxis : FB_Axis;
END_VAR
Methode FB_Base.ExecuteProcess:
METHOD ExecuteProcess : BOOL
VAR_INPUT
bExecuteProcess : BOOL;
END_VAR
// Calling axis module by passing input parameter "bExecuteProcess" of this method to the input parameter "bExecute" of method "Execute"
fbAxis.Execute(bExecute := bExecuteProcess);
// Setting the return value of this method as inverted error signal of the axis module
ExecuteProcess := NOT fbAxis.Error;
Funktionsbausteinstein FB_Sub:
FUNCTION_BLOCK FB_Sub EXTENDS FB_Base
VAR
fbCylinder : FB_Cylinder;
END_VAR
Methode FB_Sub.ExecuteProcess:
METHOD ExecuteProcess : BOOL
VAR_INPUT
bExecuteProcess : BOOL;
END_VAR
// Extension: Calling cylinder module by passing input parameter "bExecuteProcess" of this method to the input parameter "bExecute" of method "Execute"
fbCylinder.Execute(bExecute := bExecuteProcess);
// Setting the return value of this method as inverted error signal of the cylinder module PLUS calling the base method and analyzing its return value
ExecuteProcess := NOT fbCylinder.Error AND SUPER^.ExecuteProcess(bExecuteProcess := bExecuteProcess);