该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' :
