本記事はラダー言語を対象として記述しています。
オブジェクト指向のプログラムに慣れている方には「今更」と笑われるような話かもしれません。
ですがiQ-Fについてはマニュアル毎に記載が微妙に異なるのでそれらの整理と考察を記事にします。
マニュアルの記載をおさらいする
「MELSOFT GX Works3 FBクイックスタートガイド」での記載
FB(ファンクションブロック)をラダープログラムに貼り付ける際に「FBインスタンス名入力」ダイアログが表示されるのでそこで入力する名前として記載されています。
注記として「※インスタンス名とは、FBを区別するための名前です。」とあります。
プログラム中にFBをたくさん貼り付けた際にそれぞれを区別するために名前が必要ですよという説明でしょうか。
インスタンスとは何かについては特に記載がありません。
「GX Works3オペレーティングマニュアル」での記載
ラダーエディタの構成について表示内容の説明として下記の記載されています。
- FBインスタンス:「ラダープログラムに挿入されたファンクションブロックの実体です。」
- ファンクション:「ラダープログラムに挿入されたファンクションの実体です。」
- ファンクションには実体(インスタンス)は無いのに!
プログラム作成の説明でファンクションブロックの挿入については「FBクイックスタートガイド」の記載を詳しくした形で記載されています。
また、重要な点として下記の2点についても記載があります。
- ファンクションブロックを回路に挿入するとインスタンス名がラベルとして自動的に登録される。
- ファンクションブロックの作成についての説明の中で、FBインスタンスを作成していない場合、変換してもファンクションブロックは変換済みにならないと記載
「MELSEC iQ-F FX5プログラミングマニュアル(プログラム設計編)」での記載
「インスタンスとは、ファンクションブロックの定義を元に割り付けたラベルです。」と記載されています。
この文章がすんなり理解できる方はこの記事を読む必要は無いかも知れません。
また、ファンクションブロックのインスタンスの作成として「インスタンスはグローバルラベルまたはローカルラベルで宣言します」と記載されています
ここまでの2つのマニュアルの記載とはずいぶん雰囲気が違います。
ですが、これが一番実態に近い記載です。
iQ-Fプログラミングでのインスタンスとは何か
インスタンスについて簡単な比喩的表現としては下記のようになるでしょうか
「何らかの定義を設計図として、それに基づいて作成された実際に扱えるもの」
すなわち、定義を元に作成され、メモリを割り当てられ、プログラム中で呼び出せるようになったものと言えるでしょう。
基本データ型ラベルもインスタンス
特に意識していないですが、使用頻度の多いビット型とかワード型は基本データ型になります。
基本データ型ラベルはデータ型とクラスを元にiQ-Fメモリ空間の中に容量を割り当てて扱えるようにしたものなので実はインスタンスと言えるものです。
構造体型ラベルもインスタンス
構造体型ラベルは構造体の定義とクラスを元に作成されたインスタンスです。
マニュアルでいう構造体ラベル名はインスタンス名です。
GX Works3での構造体階層表示設定で「インスタンス」と表現されています。
ファンクションブロック型ラベルもインスタンス
同様の流れでファンクションブロックは1スキャンで処理が終わらないのでメモリ空間の中にファンクションブロック型ラベルとしてメモリが割り当てられます。
ファンクションブロック型ラベルは構造体で、プログラムの中で「インスタンス名.メンバ」の記述で入出力変数と公開変数を呼び出すことが可能になります。
そしてプログラム中でロジック回路を呼び出すことも可能になります。
ファンクションはインスタンスではない
ファンクションは1スキャンで処理が終了するのでメモリが割り当てられません。
定義を直接呼び出して結果のみを得ているのでインスタンスは必要ありません。
インスタンスは全てラベルエディタで定義される
ラベルエディタは別の言い方では「インスタンスディファインダ」と言えるかもしれません。
ファンクションブロックのインスタンスを手動で作成する場合はラベルエディタでファンクションブロック型のラベルを登録します。
ラベルエディタにファンクションブロック型のラベルを登録すれば変換した際にファンクションブロックが変換済みになることからも、ラベルがインスタンスでインスタンスはラベルというのが分かります。
ぶっちゃけ、ラベルエディタにインスタンス名を登録したつもりでも入力する列のタイトルは「ラベル名」ですよね。
回路に挿入した「FBインスタンス」は何なのか?
あえて、マニュアルに倣って「FBインスタンス」という用語を使用しています。
回路に挿入したものはインスタンスでは無く、呼び出しをグラフィカルに表示したものです。
その仕様上の設計として入出力に接点なりコイルを配置できるようになっています。
なので、別に入出力に何かラベルやデバイスを配置しなくてもファンクションブロックは呼び出され機能します。
「FBインスタンス」への入出力はプログラムの別の位置でファンクションブロック型ラベルの構造体のメンバを指定して行うことができます。
この場合ファンクションブロックの呼び出しはインラインST内で行って、入出力変数と公開変数への入出力はラダー上で行うという事も可能です。
まとめ
-
インスタンスはiQ-F内に割り当てられたメモリ
-
メモリの割り当て作業はラベルエディタでラベルを登録することで行う
-
プログラム中で使用する場合は下記による
- ラベル名(インスタンス名)でファンクションブロックのロジックを呼び出す
- 呼び出し方
- 「FBインスタンス」を回路に貼り付ける
- インラインSTで呼び出す
- 呼び出し方
- ラベル名(インスタンス名)の構造体型変数として使用する
- ラベル名(インスタンス名)でファンクションブロックのロジックを呼び出す
メーカーへの要望として、「FBインスタンス」は「FBボックス」と呼んでほしかったし、そうすれば「ファンクションの実体」なんて概念が混乱する記載も防げたような気がします。
PLC技術者はインスタンスなどになじみが無いので、それに配慮した記載だとは理解できるのですが検討をお願いしたいところです。