この記事では、知っていると便利な機能であるフィードバックノードの使い方について紹介しています。
フィードバックノードは、よく似た使い方をする別の機能がLabVIEW初心者の方が習う項目として存在しており、一見出番が少ないように見えますが、使いこなすことでプログラムをすっきり見せることができるため、覚えておいて損はない機能です。
本記事では、フィードバックノードとはどういったものか、どのような設定ができるか、そしてどのような使い方があるかについて具体例を交えて解説しています。
フィードバックノードとは
ある段階での何かの処理の結果を、次の段階の処理の入力に使用することをフィードバックといいますが、これを実現するための仕組みがフィードバックノードです。
何のことやらさっぱり?という方も、「シフトレジスタ」という言葉を聞くとピンとくるかもしれません。
何を隠そう、フィードバックノードはシフトレジスタと似た役割を持つ機能になっています。
試しに、以下のようなシフトレジスタが使用されたプログラムを考えてみます。
このシフトレジスタを右クリックしてフィードバックノードに置換とすることでフィードバックノードを使用したプログラムに置換することができます。
置換した際に、ループの左側にひし形のマークがついた端子が出ますが、これはシフトレジスタの初期化と同じ役割を果たしています。
勘の鋭い方はわかるかもしれませんが、これ、データの流れが「右から左」になっています。
通常LabVIEWはデータの流れが「左から右」になるように構成されますが、データを戻すという特性上、データの流れが逆になります(ただし、後述するようにこの向きは変更が可能)。
ともあれ、フィードバックノードはシフトレジスタと同じです。
・・・これだともうこの記事が終わってしまいますし、実際は使用感が少し異なる点もあるので、もう少し説明を続けます。
フィードバックノードは、関数パレットに単体の機能として存在しています。
なので、使用するときにいちいち「シフトレジスタから置換」する必要はありません。
ただし、関数パレットからフィードバックノードを配線した場合には、初期化端子がループの外に表示されません。
フィードバックノードの下部分にアスタリスクのような表示がついていると思いますが、これが初期化のための端子です。
何も配線していない場合には、そのデータタイプのデフォルト値が「コンパイルまたはロード時に」使用されます。
もし何か特定のデータを配線した場合には、「最初の呼び出し」時にその配線した値で初期化されます。
フィードバックノードの良さは、プログラムがすっきりすることにあります。
下の図で確認できるかなと思いますが、例えばケースストラクチャが絡んだプログラムの場合、シフトレジスタだと、何も処理をしていないケース(下記図でいうFalseケース)においても無駄に配線を行う必要があります。
一方でフィードバックノードの場合にはTrueケースのみに処理を置くだけ(Falseケースには何も処理を置かない)という書き方ができます。
なんだこれだけのことか、と思うかもしれませんが、ある程度大きなプログラムを扱う場合、この「見た目のすっきりさ」は重要になります。
なお、フィードバックノードを使用するときには実はWhileループは必要ありません。
例えば、あるサブVIがメインVIによって繰り返し呼ばれるような場合、そのサブVIにフィードバックノードが入っていたら、メインVIで呼び出されるたびに、「前回呼ばれた」時の値をフィードバックノードで得ることができます。
これについては記事後半で例を紹介しています。
フィードバックノードの向き
フィードバックノードには、向きがあります。
既に書いた通り、フィードバックノードは、「出力結果を入力する」ための機能となるので、通常のLabVIEWのデータフローでよくみられる「左側に入力、右側に出力」とは逆方向にデータが流れることになります。
このフィードバックノード、向きを指定することができます。
向きが逆になることで、入出力も左右反転します。
下の図で、左のブロックダイアグラムと右のブロックダイアグラムは同じ処理内容となります。
動作としては変わらないのでここは好みで選べばいいとは思いますが、他のワイヤ配線との兼ね合いもみて、なるべく見た目がすっきり配線できる方を選ぶのがいいと思います。
また、後述するように、用途によっては特定の方向の方がよりわかりやすいといった場合もあります。
スタックシフトレジスタを真似る
フィードバックノードはシフトレジスタと置換できることは最初に紹介しましたが、完全に同じ機能を持つわけではありません。
試しに、以下の図のような、スタックシフトレジスタを使用している場合には、フィードバックノードに置換することができません。
こうなるとフィードバックノードの方が不便のようですが、一応代替案というか、遅延の設定を行うことで2つ以上前の値を取得することはできるようになります。
フィードバックノードのプロパティで遅延を構成でき、これが「2つ前のループの値」や「3つ前のループの値」を取得する方法になります。
(デフォルトのフィードバックノードは「1つ前のループの値」を取得するという意味で遅延設定が「1」と考えます)
スタックシフトレジスタを使用したプログラムを、遅延設定を行ったフィードバックノードで置き換えた場合、以下の図のようになります。
有効化端子の役割
フィードバックノードを右クリックすると有効化端子という設定があるのに気付くと思います。
有効化端子はその名の通りこのフィードバックノードの有効無効を切り替えることができる端子で、Trueのときに入力された値はこれまでの説明通り次の入力として得ることができますが、Falseのときに入力された値はいわば無視される状態となります。
用途は様々ありますが、例えばある条件を満たしたときだけ値を更新させる場合に使用できます。
フィードバックノードの実装例
それでは最後に、フィードバックノードの実装例を紹介していきます。
とはいっても、基本的にシフトレジスタで組めるプログラムはどれもフィードバックノードで置換できるので、活躍する場面としては「シフトレジスタを使用する時」と共通しています。
フィードバックノードは、ループなしでも使用できるという話がありましたが、サブVIの中にフィードバックノードを入れてメインVIでこれを何度も呼び出すという場面での使用が多いです。
例えばデジタル値の入力で立ち上がり、あるいは立下りを検出するのにも使用することができます。
この場合、「前の値」であることがちゃんと意識できれば、向きは下図のように「左から右」にしておくとプログラムがすっきりします。
また、ループの中で特定のカウントを行う際にも使うことでプログラムがコンパクトになります。
他にも、カスタムプローブで前の実行時の値を取得したい場合にも手軽に使えます。
カスタムプローブについては以下の記事を参考にしてみてください。
本記事では、フィードバックノードについてその役割や設定の種類、実装例を紹介してきました。
グラフィカルにプログラムを記述することができるLabVIEWにとってよりスマートに処理を実装することは機能や見た目の面で重要です。
知らないことでプログラムが組めないという場面は少ないかもしれませんが、いつでも使えるように頭の片隅にでもいれておいて損はないと思います。
ここまで読んでいただきありがとうございました。
コメント