取得中のデータのグラフ表示をドラッグアンドドロップで指定する

Tips

スポンサーリンク

この記事で扱っていること

  • 取得中のデータのグラフ表示をドラッグアンドドロップで指定する方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

LabVIEWでハードウェアから結果を取得するときなど、データを配列あるいは波形で取得してグラフに表示するという場面はよくあると思います。

ただ、いくつものデータをとっているがずっと全てのデータを見たいわけではなく、いくつかの種類のグラフプロットの中から取捨選択して表示させたいという場合もあると思います。

グラフにはもともとそのような機能(プロット表示のチェックボックス機能)があるのですがこれをドラッグアンドドロップの操作で行わせる場合の組み方の例を紹介しています。

なお、ドラッグアンドドロップのサンプルで似たようなプログラムは既にLabVIEWのサンプルファインダにありますが、サンプルは「静止」状態の結果しか表示していないのに対して、今回の記事で紹介する方法はデータ取得中に使える(データが動的に変化する場合でも使える)方法になっています。

スポンサーリンク

どんな結果になるか

フロントパネルには、グラフ表示器以外に、このグラフに表示させる選択肢として信号A~Dの名前を表示させたリストボックスを用意しています。

実際のプログラムではもちろん、選択する信号の名前は自由につけていいですし、選択肢の数も4つである必要はありません。

プログラムを実行して、各信号をリストボックス上で選びグラフ表示器にドラッグアンドドロップすると表示させることができます。

下の図はもちろん「静止画」になっていますが、実際はグラフに表示されているデータは常に更新されている状態になっています。

表示内容をやり直したいときには選択リセットを使用します。

プログラムの構造

定期的に更新しているデータの表示/非表示をドラッグアンドドロップによって切り替える機能は

  • データが一定周期で新しくなり、これをグラフに表示する(一定周期での自動更新を求められる)
  • いつ起こるかわからないドラッグアンドドロップの操作によってデータの表示状態が変わる(不定周期での更新を求められる)

という二つの更新アプローチ両方でグラフの表示状態を操作できる必要があります。

そのため、データの取得と、ユーザー操作(イベント)、そしてデータ表示をそれぞれの機能として設けて、それぞれでデータをやり取りさせるための仕組みを設けます。QMH的な考え方ですね。

このような考え方に慣れていない場合には、以下の記事が参考になるかもしれません。

これを踏まえて、ブロックダイアグラムは以下のようにしています。

大きなWhileループは2つじゃん、と思いきや、真ん中にサブVIがあることに注意してください。

ではそれぞれの機能ループについて紹介します。

まずは一番上のWhileループであるイベントハンドリングループです。ここではイベントストラクチャを基に他のループに指示を送っています。

ループを止めるための停止ボタンの値変更イベントは必須です。

ドラッグ操作を検出するためのイベントとしては「信号選択」のリストボックスに対してドラッグ開始?イベントを定義しています。

ここでは、信号選択から選んだ選択肢の番号をdrag dataとしています。

ドラッグされたデータが波形グラフ内に侵入してきたときに、このドラッグされたデータを受け入れるようにしています。

下の図で配列から探している「signal」という文字列は、一つ上で紹介したドラッグ開始?イベントでdata nameとして指定した文字列と一致させています。

実際に波形グラフにドロップされたら、そのデータを「ドラッグドロップデータを取得」の関数で復元します。

今回はリストボックスの選択肢の番号を「ドラッグドロップデータ」としているので、その数値の情報を取得し、これをevent handlingループから別のループに送るためにエンキューしています。

また、フロントパネル上の選択状態を初期化するために、選択リセットのボタンの値変更イベントも定義しておきます。

次にdata acqループです。サブVIにしています。

今回はダミーの信号を使用していますが、もし何かハードウェアからの信号を扱う場合には、このサブVIの部分を実際にハードウェアからデータを取得するループに置き換えて対応させます。

最後にdisplayループです。データのグラフへの表示を担っているループですね。

イベントハンドリングループやdata acqループからの指令を受けてキューで受けてグラフ表示していますが、このループは他のループからデータを受け取ることでステートが動くステートマシンの形をしています。

initializeステートでは、配列初期化の関数を使って、「どのデータを表示させるか」を指定するブール配列を初期化しています。

もし選択させる信号(今回の例でいえば信号Aから信号D)の数が4ではない場合には、下の図の「4」の部分を変更します。

dataステートでは、data acqループから受け取ったデータに対して、「どのデータを波形グラフに表示させるか」を選んでいます。

このときに、initializeステートで作成したブールの配列が使用されます。

TRUEの場合には実際のデータを表示するのに対し、FALSEの場合にはNaNの配列を表示させます。配列初期化のサイズ1000というのはdata_acq.viにて一つの波形データに入っているYの配列のサイズと一致させます。

ブールの配列で表した「どのデータを表示させるか」を決めるのが次のselectステートです。

このステートは、event handlingループの波形グラフのドロップイベントが実行されることで更新されます。

ドロップイベントで指定された番号のプロットを表示させるためにブール配列を更新しています。

あとは何かステートを増やして機能を追加するとき用に用意したデフォルトステートです。

ケースストラクチャは必ずデフォルトステートを用意する必要がありますが、中身は特に何も指定する必要はありません。

ドラッグアンドドロップでできなくてもいい!場合

上で紹介したプログラムを見て、意外と大掛かりなプログラムだなと思った方も多いと思います。

(もちろん、正解は一つだけではないので、これ以外にもっと簡単に実装する方法があるかもしれません)

一方で「ドラッグアンドドロップでできなくてもいいから、どのデータを表示するかしないかを簡単に指定したい」という場合には、冒頭でも紹介したようにグラフの機能としてプロット表示のチェックボックス機能を使用するのが最も簡単です。

ここはもう使い勝手、ユーザーがどのように操作をして表示させるグラフを選択したいかでどういう実装にするかを決めてみてください。

本記事では、ドラッグアンドドロップの操作で動的にグラフに表示させるプロットを選択する方法を紹介しました。

ドラッグアンドドロップによって何かをさせるという機能の実装は本ブログでも今までいくつか紹介していますしサンプルファインダにも例がありますが、大体毎回似たようなプログラムを書くことになるので慣れればそこまで難しいこともなく、それでいてユーザーにとっては直感的な操作が可能となるので、知っていて損はないと思います。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました