LabVIEWでプログラムを組むときに必要になるデザインテンプレートの案を紹介しています。本ブログで紹介している具体的なプログラム例のベースとなる組み方を説明しています。
この記事ではプログラムの進捗を表示できるデザインを紹介しています。
このデザインに必要な知識
プログラムの進捗を表示できるデザインとしては、プログラムの進捗を表示する用の機能を一つのループに持たせ、プログラムの様々な場所からそのループに対してメッセージを渡してその都度進捗表示用の表示器を更新することになります。
そのため、複数のループ間でデータをやりとりするための仕組みを理解しておくことが必要になります。
必要な知識としては
- キューを使用したプログラム
になります。
キューについては複数のループを扱うための機能ですが、今回は進捗表示専用のループを使用していきます。
キューについて使い方がわからないという方は以下の記事が参考になるかもしれません。
このデザインの基本的な構造
基本的なコンセプトとしては、プログラムの状態を表示する文字列表示器を専用に扱うループを用意しておき、そこに各状態を表すメッセージを渡していきます。
簡単な例で表すために、ユーザー操作を表示させるだけのシンプルな構成のプログラムを挙げます。
この例では、ユーザーが操作するボタンが2つ(停止ボタン除く)と、ステータスを表示する文字列表示器を用意しています。

プログラムを実行し、各ボタンをユーザーが任意のタイミング、任意の順番で押すと、即座にステータス表示に反映されます。

この程度のプログラムを作るだけなのであれば単純ではありますが、規模が大きくなったり機能が追加されても同じように書けるような汎用性を持たせるためには、ブロックダイアグラムとしては(やっていることの割には)少し大きなプログラムになります。
このような汎用性を持たせる際に重要なのは、各処理をループに分けるという考え方で、今回は「ユーザーのボタン操作を検出する」「他のループへ指示を出す」「ステータスを表示する」の3つの個別ループを用意しています。

ユーザーのボタン操作を検出するのは、イベントストラクチャが入ったWhileループが担当します。
ただしイベントストラクチャの各イベントケースの中で具体的な処理はなく、他のループにキューでメッセージを渡しているだけです。

他のループへ指示を出すのは、これまた別のWhileループが担います。
このループ自体は上記のイベントストラクチャの入ったループから受け取ったキューのデータ(メッセージ)を基に他のループへ指示を出します。
これは小規模な例なので、指示を出す相手側の「他のループ」とは、3番目の「ステータスを表示する」ループだけですが、実際には他の処理を担っているループにも指示を出します。
場合によってはイベントストラクチャの入ったループが、他のループへ指示を出す役割を兼ねる場合もあります(記事後半の例はそのような方式としています)。
なお、以下の図のブロックダイアグラムで二か所使用されているenqueue status message.viは後述するサブVIです。

enqueue status message.viが、ステータスを表示するループに送るメッセージを担っており、その中身は今回の例では時間情報とメッセージ内容としています。
これら二つの情報をステータスを表示する機能を持つループに渡すことで、プログラムのある段階の処理としていつに何が行われたかを表示することができるようにしています。

ステータスを表示するループは以下のようにしており、受け取った時間情報とメッセージ内容をステータス表示の文字列表示器に渡しています。

応用例
基本的なコンセプトに引き続いて、もう少し処理の多い具体例について紹介します。
プログラムを実行すると測定の準備が進み、エラーなくある待機状態にまで到達したら、ユーザーがボタンを押したタイミングで(ダミーの)測定が進むようにしています。
ステータス表示には、測定の準備がいつ終わったか、ユーザーがいつボタンを押したか、測定が何回行われたかを表示しています。

ブロックダイアグラムとしてはループが一つ増えていますが、下の図の上から2番目と3番目のループは機能としては一緒(測定が二つあることを模しており中で扱われている文字列は異なりますが)なので、見た目ほど複雑ではありません。

イベント検出を担うループでは各イベントごとにそれぞれの測定を始めるようキューでメッセージを送っています。
その前にフラットシーケンスストラクチャにあるのは、テスト開始ボタンの無効化のための処理で、要はそれぞれの測定テストが準備がOKの確認が取れるまで開始のイベントを発生させないようにしています。

4つあったWhileループの内一番下にあったものは前半で紹介したステータスを表示するためのループなので説明は省くとして、上から2番目、3番目にあるループが具体的な処理(測定)を行います。

今回は測定処理の内容を以下としました。
Initializeとその次のSettingでフラットシーケンスストラクチャ中で変なことをしていますが、これはランダムな時間を準備時間として待たせているだけで実践のプログラムを作る時にこの部分は必要ありません。
各ケースでやっているように、自分自身に対してエンキューしその次のループでそのエンキューした文字列情報を基にケースを分けるという組み方は自己駆動型ステートマシンとしてよく行います。
そしてそれぞれのケースにてenqueue status message.viが使用され4番目のループにステータス情報が渡ることとなります。

本記事では、プログラムの進捗を表示できるデザインを紹介しました。
フロントパネル上の表示を更新することに特化したループを用意しておきそこにメッセージを集約することで様々な形で文字情報を表すことができます。
ここまで読んでいただきありがとうございました。


コメント