属性:no_virtual_actions
该编译指令用于从以 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的特殊实现所替换。ActiveAction与原始实现的唯一区别在于,它将字符串'child_action'而不是'father_action'赋值给变量test_act。
同样,在基类中将字符串'father_method'赋值给变量test_meth的方法METH被覆盖,因此test_meth现在获得值'child_method'。主程序PLC_PRG调用功能块POU_child的一个名为Child的实例。正如预期的那样,字符串的值反映了对派生类的动作和方法的调用:

但是,现在您在基类前面加上编译指令{attribute 'no_virtual_actions'}:
{attribute 'no_virtual_actions'}
FUNCTION_BLOCK POU_SFC...这会改变行为:方法METH仍使用派生类的实现,而对步动作的调用现在会导致调用基类的动作ActiveAction。因此,test_act现在获得值'father_action':
