属性: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が元の実装と異なるのは、変数test_actに'father_action'の代わりに文字列'child_action'を代入する点だけです。
同様に、基本クラスで変数test_methに文字列'father_method'を代入するメソッド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'が設定されます。
