この記事で扱っていること
- 測定パラメタを保存して再利用する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWのプログラムは、ファイルを開いた際に各制御器にはデフォルト値が入っています。
このデフォルト値、プログラム的に設定をすることも可能なのですが、例えば「以前使用したパラメタをまた使用したい」と考えたときにファイルに残しておけば、それを呼び出すだけで同じパラメタを再現することができて便利です。
そこで、測定パラメタをファイルに保存したり、これを呼び出して測定を行うための仕組みを考えてみました。
測定に使うハードウェアはNational Instruments社のDAQを想定していますが、プログラムの仕組み自体はハードウェアに依存しません。
どんな結果になるか
フロントパネルにはDAQのチャンネルとサンプルレートやサンプル数の設定の入力の他に、設定を記録するかどうかを選択するボタン、設定ファイルのファイル名の入力を設けています。
また、リストボックス制御器で設定ファイル一覧を表示させるようにしています。
一番最初にプログラムを実行、つまり今まで設定ファイルを保存したことがない場合には設定ファイル一覧には何も表示されません。
DAQmx物理チャンネルやサンプルレート、サンプル数を保存したい値にしてファイル名を入力してから設定記録?ボタンを押すと設定がcfgファイルとして保存されます。
設定ファイルは何個でもつくることができます。一度測定をするなりしてプログラムを止め、もう一度プログラムを実行すると作成したファイルが一覧に表示されるようになります。
これらのファイルは 特定のフォルダ(このサンプルでは、このプログラムがあるのと同じ階層にあるmeasurement_parametersフォルダ)に保存されています。
そして一覧からファイルを選んで設定ファイル使用?のボタンを押すと、そのファイルを保存していた時に設定していたパラメタが反映され、そのパラメタで測定が行えます。
プログラムの構造
全体像は以下のようにしました。測定に入る前のWhileループでは、イベントストラクチャを使用しています。
プログラムではまずmeasurement_parametersのフォルダがあるかどうかを確認し、なければ作るようにしています。そしてこのフォルダが存在している状態でファイルを用意します。
イベントストラクチャのWhileループに入ると、まず最初のループで必ずタイムアウトイベントを発生させ、現時点でのフロントパネル上のパラメタをバンドルします。このバンドルされたクラスタがイベントによって書き換えられたりして、このWhileループを出た後にDAQmxの各関数に渡されることになり、他のイベントによってこのクラスタの値を更新することになります。
設定を記録するイベントでは、ファイルIOの関数と文字列にフォーマット関数を使用して設定を特定の文字列として書き込んでいます。
イベントは一個ずつ実行されるので競合が起きることがないことから、ローカル変数を使用しています。
文字列にフォーマット関数へ渡している形式文字列定数は
CH:%s rate:%f samples:%d
としていて、この形式でcfgファイルに保存されることになります。(別に形式はこれでなくても構いませんし、ファイル拡張子がcfgである必要もないです。あくまで一例です)
逆に設定ファイルを読み出すイベントでは、文字列からスキャンを使用して、文字列にフォーマット関数で指定した形式文字列を再度使用しています。
そして、ファイルを読み込んだ際にはフロントパネルにも反映させるために、DAQmx物理チャンネルやサンプルレート、サンプル数の制御器に対して作成したローカル変数を使用し値を書き込んでいます。
あとのイベントは、このイベントストラクチャが入ったWhileループを抜けるためのイベントです。
このプログラムはDAQのサンプルプログラムと異なり、実行ボタンを押してすぐに開始するわけではなく、測定開始ボタンを押さないと開始しません。ただ、場合によっては測定をしないでプログラム自体を終了させたいこともあるかなと思うので、LabVIEWの強制停止ボタンを使用せずにプログラムを終了させるためにプログラムキャンセルボタンを用意しました。
このボタンが押されると、後の処理は全部ケースストラクチャのFALSEケースに入り、特にDAQを動かすことなく終了します。
イベントストラクチャの弊害について
実は上のプログラムの組み方だけでは、ある操作をした場合にプログラムが「応答不能」になります。
それは、測定開始ボタンを押してから、ふとしたはずみで再び測定開始ボタン、あるいは設定記録など、プログラム停止ボタン以外のボタンを押した時です。
測定開始ボタンを押すことでイベントストラクチャの入ったWhileループは抜けますが、イベントの検出自体はプログラムが停止するまで続行されます。ところが、イベントを検出してもそのイベントを実行するWhileループはもう抜けてしまっているのでイベントの中身を実行することができず、フロントパネルがロックされます。
この問題を解消するための方法として、測定開始ボタンを押したら、余計なボタンが押されないようにするという手が考えられます。
この対策をとる場合、プログラム初めにはすべてのボタンが押せるようにもする必要がある、ということになります。
保存するパラメタは増やせる
このプログラムでは、シンプルな形で表すために、DAQのアナログ入力プログラムでほぼどんな時でも指定するであろう、物理チャンネルとサンプルレート、サンプル数のパラメタについてファイルに保存しました。
ただ、例えば最大値最小値の設定や、測定の種類によっては他の測定パラメタが必要になることもあります。
そんな場合であっても今回のプログラムを応用することで対応することができます。
文字列にフォーマット、文字列からスキャン関数での指定の数を増やすだけなので、様々なパラメタを保存できるような改造が考えられます。
データの測定は、パラメタを変えたり、何度も同じパラメタで繰り返したり、様々なパターンが考えられると思います。どんなパラメタで測定を行ったかはデータを区別する上で重要となることもあると思うので、今回のようなプログラムで簡単に測定パラメタをファイルに保存し管理するときの参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント