Skip to main content

属性:no_virtual_actions

该编译指令用于从以 SFC 实现的功能块派生、并使用该基类基本 SFC 流程的功能块。从中调用的动作表现出与方法相同的虚拟行为。这意味着派生类可以用其自己的特定实现来替换基类中动作的实现。

如果将该编译指令应用于基类,则其动作将受到保护,不会被重载。

语法:

{attribute 'no_virtual_actions'}

插入位置:功能块声明部分的第一行

例 12.

功能块POU_SFC是派生功能块POU_child的基类。派生类POU_child使用特殊变量SUPER调用以 SFC 编写的基类流程。

_cds_img_pragma_virtual1.png
_cds_img_attribute_nva_ex1.png

该流程的示例实现仅限于初始步,其后是一个带有链接的步动作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的实例。正如预期的那样,字符串的值反映了对派生类的动作和方法的调用:

_cds_img_pragma_virtual3.png

但是,现在您在基类前面加上编译指令{attribute 'no_virtual_actions'}:

{attribute 'no_virtual_actions'}

FUNCTION_BLOCK POU_SFC...

这会改变行为:方法METH仍使用派生类的实现,而对步动作的调用现在会导致调用基类的动作ActiveAction。因此,test_act现在获得值'father_action':

_cds_img_pragma_virtual4.png