Atributo: no_virtual_actions
El pragma se utiliza para bloques de función derivados de un bloque de función implementado en SFC y que utilizan la secuencia fundamental de SFC de esta clase base. Las acciones invocadas desde él presentan el mismo comportamiento virtual que los métodos. Esto significa que las implementaciones de las acciones en la clase base pueden ser reemplazadas por la clase derivada con sus propias implementaciones específicas.
Si aplica el pragma a la clase base, sus acciones estarán protegidas contra la sobrecarga.
Sintaxis:
{attribute 'no_virtual_actions'}
Ubicación de inserción: Línea superior en la parte de declaración del bloque de funciones
El bloque de función POU_SFC
es la clase base para el bloque de función derivada POU_child
La clase derivada POU_child
llama a la secuencia de la clase base escrita en SFC con la variable especial SUPER
.


La implementación ejemplar de esta secuencia se limita al paso inicial, seguido de un solo paso con una acción de paso vinculada. ActiveAction
Este paso con una acción de paso vinculada se encarga de la configuración de las variables de salida.
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
En el caso de la clase derivada POU_child
La acción del paso se reemplaza por una implementación especial de ActiveAction
. Active Action
Se diferencia del original solo por la asignación de la cadena 'child_action'
en lugar de 'father_action'
en la variable test_act
.
De igual manera, el método METH
, que asigna la cadena 'father_method'
a la variable test_meth
en la clase base, se sobrescribe para que test_meth
ahora obtiene el valor 'child_method'
. El programa principal PLC_PRG
llama a una instancia del bloque de función POU_child
, llamado Child
Como era de esperar, el valor de las cadenas refleja la llamada a la acción y al método de la clase derivada:

Ahora, sin embargo, usted coloca el pragma {attribute 'no_virtual_actions'}
delante de la clase base:
{attribute 'no_virtual_actions'} FUNCTION_BLOCK POU_SFC...
Esto cambia el comportamiento: aunque la implementación de la clase derivada todavía se utiliza para el método METH
, la llamada de la acción de paso ahora resulta en una llamada de la acción ActiveAction
de la clase base. Por lo tanto test_act
ahora se le da el valor 'father_action'
:
