測定結果のスナップショットを別画面で表示

Tips

スポンサーリンク

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

  • 測定結果のスナップショットを別画面で表示させる方法

を紹介しています。

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

LabVIEWではアルゴリズムの部分とユーザーインタフェースの部分を一緒に作れるため、ユーザーがどのような操作をするかをイメージしつつプログラムが構築できます。

色々な機能を付けていくうちに、それらでいっぱいになりフロントパネルで何か結果を移すための画面が小さくなってしまう、なんてことも結構あったりします。

タブ制御器などで対応することももちろんできますが、単純に結果を大きく見たいということであれば別画面として表示されるようなサブVIを作るのも効果的です。

今回は、ユーザーがメインのVIのボタンを押したらその瞬間の結果を別画面で大きく表示させるようにしました。ただし、測定中の結果のある一瞬だけを切り取るようにしています。スナップショットのようなものですね。測定を行っているVIは引き続き動いたままです。

時々刻々結果が変動しているのを、その変動の様子を別画面で見るのではなく、ある瞬間のグラフを拡大表示したり、いくつかの便利な機能を追加したものとして考えてみました。

スポンサーリンク

どんな結果になるか

プログラム自体はシンプルです。今回はDAQデバイスを使用することを想定していますが、別にDAQではなくても応用がききます。

メインVIのフロントパネルにあるボタンを押すと、その瞬間の波形が別画面で大きく映し出されるようにしています。

映し出される別画面でただ単に表示させるだけでは面白くないので、このほかにも

  • 指定したポイントを丸で囲み、そのYの値を表示する
  • 大きく表示した結果とFFTの結果を表示する
  • 結果の特定の部分を拡大して見せる

という見せ方の画面を表示させるようにしました。

プログラムの構造

メインのVIの方は生産者・消費者デザインパターンで構成しています。ボタンが押されたときに生産者から消費者へ対象の波形データが渡され、消費者ループでは各画面や機能を持ったサブVIが実行される、という仕組みです。

このサブVIが実行されている間にもメインVIの方で測定を続けたいために、このデザインパターンを採用しました。

画面は一つしか出せなくするように、ローカル変数でチェック機能を設け、消費者ループ内のサブVIが終了しないとエンキューがされないようにしています。こうすることで、消費者ループが終わってから、つまり一度出したサブVIが終了しないとメインVIの方でいくらボタンを押しても次のサブVIが表れないようにしています。

ローカル変数の乱用は禁物ですが、今回のプログラムではいわゆるローカル変数の競合状態も起こらないため実装のしやすさを重視しました。

メインVIの仕組みは以上で、後は消費者ループの中で呼び出しているサブVIを紹介していきます。これらのサブVIのいずれかをメインVIの消費者ループで使用します(プログラムの途中で切り替えられるようにする場合には次の章を参照してみてください)。

言わずもがな、これらのサブVIのフロントパネルは大きくしておきます。大きければ大きいほど、グラフを大きく確認することができます。

また、サブVIのVIプロパティとして、フロントパネルを表示させ、使用後は閉じるようにしておくのも大切です。Ctrl + IでVIプロパティを開いて設定でき、これは以下で紹介している全サブVI共通です。

ただ単に拡大表示する

まずは単に拡大表示するプログラムです。これは何も難しいことはしておらず、単に停止ボタンが押されたら止まるようにしているだけです。

プログラムの中身としても、メインVIからデータを受け取ってこれを表示、あとは停止ボタンが押されたら閉じるのですが、そのボタンが押されたかどうかの判断はイベントストラクチャを使用しています。

なお、データをメインVIから受け取るのは「抜き出しデータ」の部分ですが、これは別にフロントパネル上で表示させておく必要はないので、右クリックで制御器を隠すとするか、単にウィンドウのサイズを調整して波形配列の制御器が見えないように調整します(これ以降の他のサブVIでも同じです)。

調べたい点の値をハイライトし値を表示する

次のサブVIは、値を調べるためにフロントパネルのボタンを押してXの位置をずらしそのXの位置のY値を表示させるというものです。複数チャンネルがあった場合にはチャンネルを切り替えることもできるようにしました。

ブロックダイアグラムはイベントを3つ設けています。このうち、停止ボタンを押した時の処理はただ単にグラフを拡大表示させるものと変わりません。他二つのイベントが工夫が必要です。

二つのイベントのうち一つはタイムアウトイベントなのですが、これはWhileループ実行時に必ず一回実行させるので、Whileループのカウント端子を利用してタイムアウトの時間の指定を工夫しています。

イベントのWhileループに入る前に、メインVIから受け取った波形データの配列にさらにもう一つ波形データ要素を追加します。この波形データはY値が全てNaNであり波形グラフに表示されません。しかしグラフ上のプロットの表示についてのプロパティを設定しておきます。

こうすると、イベントの中でこの波形データのNaNの集合のうち一つが実際の波形の値と置き換えるようになっているので、あたかもその一点だけがハイライトされているかのような表示に見せることができます。

調べたい点の値をハイライトし値を表示する+FFTの結果を表示

3つ目のサブVIとしては2つめのサブVIに、さらに信号の解析結果、例えばFFTの結果を表示させるようにしています。

ただしこのサブVIの作り方は2つ目のサブVIにFFTの機能を盛り込んだだけなのでとてもシンプルです。

グラフの表示範囲を指定

最後のサブVIは、表示するXの範囲を数値を指定して絞るというものです。波形グラフには元々グラフパレットで同じような機能がありますが、今回の方法は最小値と最大値のXの値を具体的に数値で指定できることが特色です。

ブロックダイアグラムは以下のようです。イベントは3つあり、タイムアウトイベントの時間の指定を工夫することで、まず最初に必ずタイムアウトイベントが実行されるようにしています。

このタイムアウトイベントでは、フロントパネル上の数値制御器の増分を波形のdtに設定したり、初期値を変更しています。

そして実際に始め、終わりの数値制御器の値が変わると波形グラフに表示させるXの範囲を変更するイベントを用意しています。要は部分配列による指定範囲を変更しているのに過ぎないのですが、波形グラフのXスケールをプロパティで変更しないと波形グラフの最小値が常に0となっていて見た目が正しくならないことに注意します。

複数の画面をプログラムで切り替えられるようにする

上記では複数の見せ方のうちどれか一つをあらかじめハードコードして使用する方法としましたが、例えば列挙体とケースストラクチャを使用すれば、プログラムを止めることなく、様々な見せ方の画面を切り替えることができます。

あるいは、測定中の特定の条件が成立したら生産者から消費者にデータを渡すというのも面白いかもしれません。

グラフ表示は色々と工夫できるのですが、表示できるウィンドウのサイズは有限なので何とかして工夫する必要があります。この記事で挙げた別ウィンドウの機能はあくまで一例で、他の結果なども表示させたいということであれば機能を追加すればいいのですが、あまり機能を追加しすぎると別ウィンドウで拡大表示させた意味もなくなってしまうかなと思います。

あくまで選択肢の一つとしてですが、サブVIを別ウィンドウとして使用する方法は他にも応用できると思うので参考になればうれしいです。

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

コメント

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