该pragma用于从 SFC 实现的功能块派生出来的功能块,并使用该基类的基本 SFC 序列。从它调用的操作表现出与方法相同的虚拟行为。这意味着基类中的动作实现可以由派生类用自己的特定实现来替代。
如果将该 pragma 应用于基类,那么基类的操作就会受到保护,不会被重载。
语法 :
{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'
。
同样,将字符串'father_method'
赋值给基类中的变量test_meth
的方法METH
也被覆盖,因此test_meth
现在的值是'child_method'
。主程序PLC_PRG
调用名为Child
的功能块POU_child
的实例。不出所料,字符串的值反映了派生类的动作和方法的调用情况:

但现在,你要在基类前面加上 pragma{attribute 'no_virtual_actions'}
:
{attribute 'no_virtual_actions'} FUNCTION_BLOCK POU_SFC...
这就改变了行为:虽然派生类的实现仍用于方法METH
,但现在调用步骤操作会导致调用基类的操作ActiveAction
。因此,test_act
现在的值为'father_action'
:
