グラフの特徴的な値の履歴を表示する

Tips

スポンサーリンク

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

  • グラフの特徴的な値(最大値や最小値)の履歴を表示する方法

を紹介しています。

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

LabVIEWで数値データを表示させる方法には、数値表示器を使用する以外にも、波形チャートや波形グラフといった項目があります。

大まかな区分としては数値表示器や波形チャートは単体のデータ、つまりスカラ値を扱うのが得意なのに対して、グラフは複数の値(配列)を扱うのが得意です。

複数の値を扱うということは、その中で特徴的な値、例えば最大値や最小値といった値を考えることができます。

この記事では、そんな「各グラフ表示されているデータ群の特徴的な値」の履歴を表やチャートに表示させるプログラムを紹介しています。

スポンサーリンク

どんな結果になるか

フロントパネルにはグラフやチャートの表示器、そして履歴を表示するための表と、表にどの程度の履歴まで残すかという表示を出しています。

この記事ではダミーのデータとして乱数を使用していますが、後でDAQを使用した場合の適用例を紹介します。

実行することで、各ループごとのグラフ表示と、そのグラフの最大値と最小値をプロットするチャート、そして表の表示が更新されていきます。

プログラムの構造

全体の様子を見通すためにすべての機能を「べた」でブロックダイアグラムに書いています。

Whileループに入る前の段階は、こまごまとした設定を行っています。

最大値や最小値を表示していくチャートの初期化や、波形グラフの2、3つ目のプロットのプロパティです。

波形グラフで最大値や最小値のみを四角くプロットさせたりそれぞれの色を決める部分がこちらにあたります。

また、表の列方向のヘッダ情報を表のプロパティとして設定しています。

Whileループに入ってから実際の履歴表示の仕組みを実装しています。

そもそも表示させるデータはこのサンプルではダミーのデータとして乱数を使用していますが、やるべきこととしてはデータ(配列)から表に表示させたい値である最大値や最小値を取り出す処理になります。

これは配列関数である配列最大&最小を使用することで簡単にできます。取り出した値は文字列に変換、最大値と最小値の値をセットにするために配列連結追加を使用しています。

この最大値と最小値の文字列の配列を表に渡せばいいのですが、単にこの配列をどんどん表表示器への入力として渡すのはオススメしません。

なぜなら、際限なく履歴を表示する方法にすると長時間動かしていくうちに配列サイズが大きくなってしまうからです。動作が遅くなったりします。

そこで今回のプログラムでは表の表示数に上限を設けています。その上限は配列初期化の関数のサイズとなっています。

初期化された配列は表にデータを表わすために用意するので文字列の配列として用意しており、この配列に要素0から順々に実際の特徴点である最大値や最小値の値を代入(置換)していきます。

例えば配列初期化でサイズを10としていた場合、要素番号0~9まではすべての値を配列に含めることができますが、要素番号10、つまり11個目の要素はサイズ10の配列に入れるためには古い値を上書きする必要があります。

その上書き動作を、割り算の余りと部分配列置換とで実現します。

上の図のような、Whileループ11回目の配列をそのまま表に表示すると順番が正しくないため、古いデータから並ぶように並べ直すように工夫する必要があります。

もう少しWhileループを続け、例えば配列初期化でサイズを10としていたとして13番目のデータが来た場合、このデータは要素番号2にはいることになります(11番目のデータが要素番号0、12番目のデータが要素番号1)。

この順で行くと一番古いデータは要素番号が3のデータとなるので、配列の要素番号の並びとしては

3、4、5、6、7、8、9、0、1、2

の順に古いデータのはずです。そのためこの順に並べ替え直して表の表示器に渡せるようにする仕組みを設けています。

これらの処理全体をプログラムに落とし込むと以下のようになります。

表の列ヘッダ部分の値の更新も1から順に並べていくのはそこまで難しくないと思いますが、履歴表示数を超えて以降の表示には「今までの値に1を足す」という処理を繰り返すことで対応できます。

これもプログラムに落とし込むとなると例えば次のような形が考えられます。

DAQを使用した測定プログラムへの適用例

乱数ではなく実際にハードウェアで測定し得られた結果を表示する場合の適用例を考えます。

データ表示の性質上アナログ入力のタスク前提となりますが、まずチャンネルが1つだけの場合には以下のようになります。なお、最大値と最小値をそれぞれ赤や青で囲むといった機能は省いています。

問題は、複数チャンネルの場合で、この場合にはチャート表示や表への表示の部分について若干の修正が必要となります。

特に厄介なのはチャート表示の部分で、チャンネル数が変わると絶対修正を加えなければいけない部分があります。この面倒は、チャートに複数種類のプロットをする場合には配列ではなくクラスタを使用しなければいけないという仕様からくるもので、配列と異なりクラスタはサイズが固定であることから、その固定するサイズ(=使用するチャンネル数)を正しく指定する必要があるためです。

配列からクラスタに変換関数をダブルクリックすることでクラスタのサイズを指定できますが、残念ながらプログラム的にこのサイズを指定する方法は無いようなので毎回ブロックダイアグラムでここだけ編集する必要があります。

なお、クラスタのサイズが使用するチャンネル数と異なっていてもプログラム自体は動作します、が、意図した結果になりません。例えば以下の図では、チャンネル数は3つなのですがクラスタサイズを2としているため、最大値と最小値の履歴を示すチャートには2つのチャンネル数分の結果しか表示されていません。(表には全チャンネル分表示されます)

チャンネル数が変わる毎に修正が必要なのは上のブロックダイアグラムのクラスタサイズに関わる部分(水色のラベルで注意書きした部分)2箇所になります。

もしこの変更を毎回するのが煩わしいということであればいっそのことチャート表示はなくして表への表示のみにするか、あるいは測定自体は複数チャンネルで行うもののチャートに表示させる履歴は1つにすると割り切るといった考えもアリだと思います。

今回の記事ではグラフの特徴的な値である最大値や最小値の履歴をチャートや表で表示する方法の例を紹介しました。別に最大や最小の値に限らず、平均値や中央値その他の値も基本的に同じような仕組みで追加することができるので必要に応じて表示する項目を増やし役立てていただければうれしいです。

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

コメント

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