该编译指令用于从SFC中实现的功能块派生的功能块,并使用该基类的基本SFC序列。从中调用的动作表现出与方法相同的虚拟行为。这意味着基类中动作的实现可以由派生类使用其自己的特定实现来替换。
如果将编译指示应用于基类,则可以防止其操作超载。
语法:
{attribute 'no_virtual_actions'}
插入位置:功能块声明部分的第一行
.例如
功能块POU_SFC是派生功能块POU_child的基类。
派生类POU_child使用特殊变量SUPER调用SFC中编写的基类的序列。
此序列的示例性实现仅限于初始步骤,然后是具有链接步骤动作ActiveAction的单个步骤。此步骤具有链接的步骤操作,负责输出变量的配置。
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
在派生类POU_child的情况下,步骤动作被ActiveAction的特殊实现所代替。Active Action与原始动作的区别仅在于在变量test_act上分配了字符串“child_action”代替“father_action”。
同样,方法METH被覆盖,该方法在变量test_meth的基类中分配了字符串“father_method”,因此现在给test_meth赋值为“ child_method”。主程序PLC_PRG调用名为“Child”的功能块POU_child的实例。如预期的那样,字符串的值反映了派生类的操作和方法的调用:
但是,现在,您将编译指令{attribute'no_virtual_actions'}放在基类的前面:
{attribute 'no_virtual_actions'}
FUNCTION_BLOCK POU_SFC...
结果,行为发生了变化:尽管派生类的实现仍用于方法METH,但现在调用step动作将导致调用基类的ActiveAction动作。因此,现在为test_act赋予值'father_action':