Deklaration einer Methode
METHOD (* optional_begin *) PUBLIC|PROTECTED|PRIVATE|INTERNAL FINAL|ABSTRACT OVERRIDE (* optional_end *) name_1 (* optional_begin *) : type (* optional_end *)
(* optional: declaration of variables/instances *)
(* optional: body of method *)
END_METHOD
Bedeutung |
||||||||||||||||
Deklaration einer bzw. mehrerer →Methoden
(ein Feature der →objektorientierte Programmierung)
, wobei name_1 ein →IEC-Bezeichner sein muss Beachten Sie:
Mögliche Schlüsselwörter für eine Methode
Mit Hilfe eines optionalen Schlüsselworts (= Modifizierer) definieren Sie, wo die Methode sichtbar ist:
Zusätzlich können Sie diese Schlüsselwörter angeben:
Der Datentyp
: data-type
ist optional, allerdings zwingend erforderlich, falls ein Ergebniswert innerhalb der Methode zugewiesen wird (siehe Methode UP im folgenden Beispiel: Zuweisung UP:= CV;
) oder die Methode als Operand zu verwenden ist. Abweichung von IEC-Norm Bei logi.CAD 3 muss der Name einer Methode im gleichen →Gültigkeitsbereich eindeutig sein. Dies steht im Gegensatz zur →IEC-Norm, in der die →Signatur zum eindeutigen Identifizieren einer Methode verwendet wird . |
Eine Methode verhält sich wie eine →Funktion.
In einer Methode dürfen Sie die folgenden Sprachelemente für ST verwenden:
Page:CASE-Anweisung in ST
Page:EXIT-Anweisung in ST
Page:FOR-Anweisung in ST
Page:IF-Anweisung in ST
Page:Kommentare in ST
Page:Leer-Anweisung in ST
Page:Zuweisungen in ST
Die Verwendung dieser Sprachelemente ermöglicht wiederum eine Verwendung von weiteren Elementen (z.B. Deklaration von STRING-Variablen im Abschnitt VAR ... END_VAR ). Dieses Elemente sind in der obigen Liste nicht angeführt.
FUNCTION_BLOCK CounterWithMethod
VAR
CV: UINT; // Current value of counter
Max: UINT:= 1000;
END_VAR
METHOD PUBLIC UP: UINT // Method for count up by inc
VAR_INPUT INC: UINT; END_VAR // Increment
VAR_OUTPUT QU: BOOL; END_VAR // Upper limit detection
IF CV <= Max - INC // Count up of current value
THEN CV:= CV + INC;
QU:= FALSE; // Upper limit reached
ELSE QU:= TRUE;
END_IF;
UP:= CV; // Result of method
END_METHOD
METHOD PUBLIC UP5: UINT // Count up by 5
VAR_OUTPUT QU: BOOL; END_VAR // Upper limit reached
UP5:= THIS.UP(INC:= 5, QU => QU); // Internal method call: The method "UP" of the same function block is called.
END_METHOD
END_FUNCTION_BLOCK
PROGRAM ExampleCircle
VAR
C1 : CIRCLE; // declaration of a CIRCLE instance
A : REAL; // circle area
D : REAL; // circle diameter
C : REAL; // circle circumference
END_VAR
// initialize the circle instance with a radius of 7.28
C1(R := 7.28);
A := C1.AREA(); // get the area
D := C1.DIAMETER(); // get the diameter
C := C1.CIRCUMFERENCE(); // get the circumference
END_PROGRAM
FUNCTION_BLOCK CIRCLE
VAR_INPUT
R : REAL;
END_VAR
VAR CONSTANT
PI : REAL := 3.1415927;
END_VAR
// calculate the circle area
METHOD PUBLIC AREA : REAL
AREA := PI * R * R;
END_METHOD
// calculate the diameter
METHOD PUBLIC DIAMETER : REAL
DIAMETER := 2 * R;
END_METHOD
// calculate the circumference
METHOD PUBLIC CIRCUMFERENCE : REAL
CIRCUMFERENCE := DIAMETER() * PI;
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK LIGHTROOM (* der Basis-Funktionsbaustein "LIGHTROOM" *)
VAR
LIGHT: BOOL;
END_VAR
METHOD PUBLIC DAYTIME
LIGHT := FALSE;
END_METHOD
METHOD PUBLIC NIGHTTIME
LIGHT := TRUE;
END_METHOD
NIGHTTIME();
END_FUNCTION_BLOCK
FUNCTION_BLOCK LIGHT2ROOM EXTENDS LIGHTROOM (* der abgeleitete Funktionsbaustein "LIGHT2ROOM" *)
VAR
LIGHT2 : BOOL; // 2. Licht
END_VAR
METHOD PUBLIC OVERRIDE DAYTIME // Die Methode 'DAYTIME' wird überschrieben.
LIGHT := FALSE; // Zugriff auf Variable 'LIGHT' des Basis-Funktionsbausteins "LIGHTROOM"
LIGHT2 := FALSE; // eine zusätzliche Anweisung
END_METHOD
METHOD PUBLIC OVERRIDE NIGHTTIME // Die Methode 'NIGHTTIME' wird überschrieben.
LIGHT := TRUE; // Zugriff auf Variable 'LIGHT' des Basis-Funktionsbausteins "LIGHTROOM"
LIGHT2 := TRUE; // eine zusätzliche Anweisung
END_METHOD
super(); // Aufruf des Bodys des Basis-Funktionsbausteins "LIGHTROOM". Darin wird die Methode "NIGHTTIME" aufgerufen. Hier wird die Implementierung von "NIGHTTIME" vom (untersten) Basis-Funktionsbaustein "LIGHT3ROOM" verwendet.
super.NIGHTTIME(); // direkter Aufruf der Methode "NIGHTTIME" vom Basis-Funktionsbaustein "LIGHTROOM", wobei "LIGHT" auf "TRUE" gesetzt wird.
END_FUNCTION_BLOCK
FUNCTION_BLOCK LIGHT3ROOM EXTENDS LIGHT2ROOM (* der Funktionsbaustein "LIGHT3ROOM" - nun abgeleitet von "LIGHT2ROOM" *)
VAR
LIGHT3 : BOOL; // 3. Licht
END_VAR
METHOD PUBLIC OVERRIDE DAYTIME
LIGHT := FALSE; // Zugriff auf Variable 'LIGHT' des Basis-Funktionsbausteins "LIGHTROOM"
LIGHT2 := FALSE; // Zugriff auf Variable 'LIGHT2' des Basis-Funktionsbausteins "LIGHT2ROOM"
LIGHT3 := TRUE; // eine zusätzliche Anweisung
END_METHOD
METHOD PUBLIC OVERRIDE NIGHTTIME
LIGHT := TRUE; // Zugriff auf Variable 'LIGHT' des Basis-Funktionsbausteins "LIGHTROOM"
LIGHT2 := FALSE; // Zugriff auf Variable 'LIGHT2' des Basis-Funktionsbausteins "LIGHT2ROOM"
LIGHT3 := TRUE; // eine zusätzliche Anweisung
END_METHOD
super();
END_FUNCTION_BLOCK
INTERFACE ISwitch
METHOD SwitchState
VAR_INPUT
STATE : BOOL;
END_VAR
END_METHOD
METHOD SwitchOff
END_METHOD
END_INTERFACE
FUNCTION_BLOCK ABSTRACT MySwitch IMPLEMENTS ISwitch (* der abstrakte Funktionsbaustein = der Basis-Funktionsbaustein *)
VAR
switchState : BOOL;
END_VAR
METHOD PUBLIC SwitchState
VAR_INPUT
STATE : BOOL;
END_VAR
switchState := STATE;
END_METHOD
METHOD PUBLIC ABSTRACT SwitchOff (* die abstrakte Methode *)
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK MySwitch2 EXTENDS MySwitch (* der nicht-abstrakte Funktionsbaustein = der abgeleitete Funktionsbaustein *)
METHOD PUBLIC OVERRIDE SwitchOff (* die Methode, die die abstrakte Methode des abstrakte Funktionsbausteins überschreibt *)
END_METHOD
END_FUNCTION_BLOCK
INTERFACE ISwitch
METHOD SwitchState
VAR_INPUT
STATE : BOOL;
END_VAR
END_METHOD
METHOD SwitchOff
END_METHOD
END_INTERFACE
FUNCTION_BLOCK FINAL MySwitch IMPLEMENTS ISwitch (* ein Funktionsbaustein, der aufgrund von "FINAL" NICHT als Basis-Funktionsbaustein verwendbar sein soll *)
VAR
switchState : BOOL;
END_VAR
METHOD PUBLIC SwitchState
VAR_INPUT
STATE : BOOL;
END_VAR
switchState := STATE;
END_METHOD
METHOD PUBLIC SwitchOff
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK MySwitch2 IMPLEMENTS ISwitch (* ein Basis-Funktionsbaustein *)
VAR
switchState : BOOL;
END_VAR
METHOD PUBLIC SwitchState
VAR_INPUT
STATE : BOOL;
END_VAR
switchState := STATE;
END_METHOD
METHOD PUBLIC FINAL SwitchOff (* eine Methode, die aufgrund von "FINAL" nicht überschreibbar sein sein soll *)
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK MySwitch3 EXTENDS MySwitch (* Ein Fehler wird für diesen abgeleiteten Funktionsbaustein gemeldet. Grund: "MySwitch" verwendet "FINAL" und darf nicht als Basis-Funktionsbaustein verwendet werden. *)
END_FUNCTION_BLOCK
FUNCTION_BLOCK MySwitch4 EXTENDS MySwitch2
METHOD PUBLIC OVERRIDE SwitchOff (* Ein Fehler wird für diese Methode gemeldet. Grund: Die Methode "SwitchOff" im Basis-Funktionsbaustein "MySwitch2" verwendete "FINAL" und darf nicht überschrieben werden. *)
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK ExampleVisibleMethods
METHOD PUBLIC m1 : INT // Die Methode kann von überall aufgerufen werden.
END_METHOD
METHOD PRIVATE m2 // Die Methode kann nur von innerhalb dieses Funktionsbaustein "ExampleVisibleMethods" aufgerufen werden.
END_METHOD
METHOD INTERNAL m3 // Die Methode kann innerhalb des gleichen Namespaces aufgerufen werden.
END_METHOD
METHOD PROTECTED m4 : BOOL // Die Methode kann von innerhalb dieses Funktionsbaustein aufgerufen werden. Zusätzlich kann sie von Funktionsbausteinen aufgerufen werden, die von "ExampleVisibleMethods" abgeleitet werden.
END_METHOD
END_FUNCTION_BLOCK
Weitere Beispiele für Methoden finden Sie unter "Beispiele für Verwendung von Interfaces und Variablen basierend auf diesen Interfaces (inkl. Zuweisungen)" und "Deklaration eines Funktionsbausteins in ST".