ファンクションブロックインスタンスは、保持エリアに割り付けることができます。電源を切った場合もファンクションブロックの変数の内容を保持させることができます。このとき、変数は、POUヘッダ上で、クラスVAR_RETAINまたはVAR_EXTERNAL_RETAINに宣言する必要があります。クラスVAR_EXTERNAL_RETAINの場合、インスタンスはグローバル変数リスト上で、クラスVAR_GLOBAL_RETAINに宣言する必要があります。
インスタンスにVAR_RETAINまたはVAR_EXTERNAL_RETAINが使用される場合、コンパイラは、保持エリアから非保持エリアへとアドレスを割り付けます。非保持エリアは、プログラムダウンロード後にのみ初期化されるクラスVAR、VAR_INPUT、VAR_OUTPUT、VAR_IN_OUTのエリアです。クラスVARのサブインスタンスは、クラスVAR_RETAINのサブインスタンスとして扱われます。他の変数、あるいはVAR_RETAIN、VAR_OUTPUT_RETAIN、VAR_EXTERNAL、VAR_EXTERNAL_RETAINのサブインスタンスは、クラスVARまたはVAR_EXTERNALのインスタンス用として割り付けられます。クラスVAR_CONSTANTやVAR_EXTERNAL_CONSTANTの変数の値は、プログラムコード中に定数として変換します。
クラスVARやVAR_EXTERNALがインスタンスに使用される場合は、ファンクションブロック内の変数またはサブインスタンスの宣言は、保持エリア(VAR_RETAIN)か非保持エリア(VAR)かどうかによって決定されます。
プログラムProgのPOUヘッダ
プログラムProgは、ファンクションブロックFB1に2度アクセスします:
ファンクションブロックFB1のPOUヘッダ
ファンクションブロックFB1のPOUヘッダは、以下のように記述しています。ファンクションブロックFB1は、ファンクションブロックFB2を2度呼び出します。
ファンクションブロックFB2のPOUヘッダ
ファンクションブロックFB2のPOUヘッダは、以下のように記述しています。
プログラムProgのメモリ割り付け