Das Pragma wird für Funktionsbausteine angewendet, die von einem in AS implementierten Funktionsbaustein abgeleitet werden und den grundsätzlichen AS-Ablauf dieser Basisklasse nutzen. Die daraus aufgerufenen Aktionen zeigen dasselbe virtuelle Verhalten wie Methoden. Dies bedeutet, dass die Implementierungen der Aktionen in der Basisklasse von der abgeleiteten Klasse durch eigene, spezifische Implementierungen ersetzt werden können.
Wenn Sie das Pragma auf die Basisklasse anwenden, dann sind ihre Aktionen vor einem Überladen geschützt.
Syntax:
{attribute 'no_virtual_actions'}
Einfügeort: Oberste Zeile im Deklarationsteil des Funktionsbausteins
Beispiel
Der Funktionsbaustein POU_SFC
ist die Basisklasse für den abgeleiteten Funktionsbaustein POU_child
. Mit der speziellen Variablen SUPER
ruft die abgeleitete Klasse POU_child
den in AS geschriebenen Ablauf der Basisklasse auf.


Die beispielhafte Implementierung dieses Ablauf ist beschränkt auf den Initialschritt
gefolgt von einem einzigen Schritt mit angebundener Schrittaktion ActiveAction
. Dieser Schritt mit angebundener Schrittaktion übernimmt die Belegung der Ausgangsvariablen.
an_int:=an_int+1; // Counting the action calls test_act:='father_action'; METH(); // Call of the method METH in order to set the string variable test_meth
Im Fall der abgeleiteten Klasse POU_child
wird die Schrittaktion durch eine spezielle Implementierung von ActiveAction
ersetzt. Active Action
unterscheidet sich vom Original nur durch Zuweisung der Zeichenkette 'child_action'
anstelle von 'father_action'
an die Variable test_act
.
Ebenso wird die Methode METH
, die in der Basisklasse der Variablen test_meth
den String 'father_method'
zuweist, dahingehend überschrieben, dass test_meth
nun den Wert 'child_method'
erhält.
Das Hauptprogramm PLC_PRG
ruft eine Instanz des Funktionsbausteins POU_child
namens Child
auf. Wie erwartet spiegelt der Wert der Strings den Aufruf von Aktion und Methode
der abgeleiteten Klasse wieder:

Nun stellen Sie der Basis jedoch das Pragma {attribute 'no_virtual_actions'}
voran:
{attribute 'no_virtual_actions'} FUNCTION_BLOCK POU_SFC...
Dadurch ändert sich das Verhalten: Während für die Methode METH
weiterhin die Implementierung der abgeleiteten Klasse herangezogen wird, resultiert
der Aufruf der Schrittaktion nun in einem Aufruf der Aktion ActiveAction
der Basisklasse. Daher erhält test_act
nun den Wert 'father_action'
:
