Für jeden Funktionsbaustein ist automatisch ein Zeiger mit dem Namen THIS verfügbar. Er verweist auf die zugehörige Funktionsbausteininstanz.
Dadurch wird eine effektive Lösung für folgende Probleme möglich:
oFalls eine lokal deklarierte Variable in der Methode eine Funktionsbausteinvariable ausblendet.
oFalls der Zeiger auf die eigene Funktionsbausteininstanz zur Verwendung in einer Funktion referenziert werden soll.
THIS kann nur in Methoden/Eigenschaften/Aktionen/Transitionen und in der zugehörigen Funktionsbaustein-Implementierung verwendet werden.
THIS muss in Großbuchstaben geschrieben werden. Andere Schreibweisen sind nicht erlaubt.
Da THIS als Zeiger für den Funktionsbaustein fungiert, müssen Sie dessen Referenzierung aufheben, um auf ein Element des Funktionsbausteins zugreifen zu können: THIS^.METHDoIt.
THIS-Aufruf in den verschiedenen Implementierungssprachen
Implementierungssprache |
Beispiel |
---|---|
ST |
THIS^.METH_DoIt(); |
FBD/CFC/LD (KOP) |
![]()
|
HINWEIS: Die Funktionalität von THIS ist noch nicht für die Anweisungsliste (IL/AWL) implementiert.
Die lokale Variable iVarB verschattet die Funktionsbausteinvariable iVarB.
FUNCTION_BLOCK fbA
VAR_INPUT
iVarA: INT;
END_VAR
iVarA := 1;
FUNCTION_BLOCK fbB EXTENDS fbA
VAR_INPUT
iVarB: INT := 0;
END_VAR
iVarA := 11;
iVarB := 2;
METHOD DoIt : BOOL
VAR_INPUT
END_VAR
VAR
iVarB: INT;
END_VAR
iVarB := 22; // Here the local iVarB is set.
THIS^.iVarB := 222; // Here the function block variable iVarB is set, although iVarB is overloaded.
PROGRAM PLC_PRG
VAR
MyfbB: fbB;
END_VAR
MyfbB(iVarA:=0 , iVarB:= 0);
MyfbB.DoIt();
Ein Funktionsaufruf benötigt die Referenz auf die eigene Instanz.
FUNCTION funA
VAR_INPUT
pFB: fbA;
END_VAR
...;
FUNCTION_BLOCK fbA
VAR_INPUT
iVarA: INT;
END_VAR
...;
FUNCTION_BLOCK fbB EXTENDS fbA
VAR_INPUT
iVarB: INT := 0;
END_VAR
iVarA := 11;
iVarB := 2;
METHOD DoIt : BOOL
VAR_INPUT
END_VAR
VAR
iVarB: INT;
END_VAR
iVarB := 22; //Here the local iVarB is set.
funA(pFB := THIS^); //Here funA is called with THIS^.
PROGRAM PLC_PRG
VAR
MyfbB: fbB;
END_VAR
MyfbB(iVarA:=0 , iVarB:= 0);
MyfbB.DoIt();