この記事で扱っていること
- 指定した時間分のデータを記録する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでハードウェアを操作してデータを収集するだけで満足する場合はあまりなく、多くの場合データを保存する必要があるかと思います。
データの保存といって気にするのはデータファイルの形式が思い当たる方もいると思いますが、どの程度の長さのデータを保存するか、といった点について気にする場合もあると思います。
「とりあえず1分間データをとってみよう」とかそんな具合です。
本記事のプログラムでは、指定したデータファイルにどれくらいの時間分のデータを取るかを指定して保存させてみようと思います。
なお、DAQのハードウェアを想定している作りにしているため波形データを保存することを想定しており、波形データをそのまま書き込みの関数に渡せるTDMSファイル形式を主に紹介していますが、TDMSには慣れていないという方向けに後半ではcsvファイルに保存する例も紹介しています。
どんな結果になるか
プログラムとしては、通常のDAQのプログラム同様、チャンネルやサンプリングレート、サンプル数を選んで、後はデータを保存するフォルダパスと、ファイル名を入力できるようにしています。
保存ボタンを押すことで保存が始まります。どの程度の長さデータを保存するかが決まっているので進捗バーをつけてあとどれくらいでデータ保存が終わりそうかという状況を表示できるようにしています。
プログラムの構造
データ保存についてはデータを収集するループとは独立して動作させるためにキューを使用しました。キューの扱いに不慣れな方は別にループを分ける必要はありません。
データを収集する上側のWhileループでは、保存ボタンが押されたか、押されてから指定の時間が経っていない場合に中身のケースストラクチャがTRUEとなり、下のループにキューでデータを渡すようにしています。
今回のプログラムでは、指定した時間が経過したかどうかをティックカウントなどで測るのではなく、DAQに対して設定したサンプリングレートとサンプル数の値を使用して計算しています。
例えばサンプリングレートが1000 Hzでサンプル数を500としている場合、DAQmx読み取りの関数は0.5秒に一回、500個のサンプルを出力することになります。次のループも0.5秒で500個のサンプルとなり、累計1000個のサンプルが1秒で得られます。
これらサンプリングレートとサンプル数の関係およびWhileループの回った回数から、何秒分のデータを取得したかがわかるので、この時間と指定した時間との比を取って1より大きいか比べるようにしています。(別の比なんてとらなくてもそのまま大小を比べるだけでも全く問題ないですが)
キューでデータを受け取る側は、単純にTDMSにデータを書き込むだけです。
このとき、新しくファイルに保存し始めるかどうかは回数カウンタの値によって判断できます(回数カウンタ0の値が来たときだけTDMSファイルを開くように指定しています)。
csvに保存したい場合
TDMSではなくcsv形式で保存したい場合、上とほぼ同じプログラムなのですが、波形データをテキスト形式に変換するという作業が必要になります。
変換処理はconvetwavedataという名前のサブVIとして実装しました。以下のサブVIの例では、波形t0が全チャンネルで同じと仮定して、A列に時間、B列以降にそれぞれのチャンネルのデータが並ぶように保存しています。
Get Waveform Time Array.viと書かれている関数は、波形パレットの中にある波形時間配列を取得関数です。
もちろん、csv形式に保存する際にこれ以外の並びでの保存(各チャンネル毎の時間情報も毎回列を用意して保存するなど)もあり得ると思いますが、応用は難しくないと思います。
別記事でテキストファイルへの保存の仕方のパターンをいくつか紹介しているのでこちらが参考になるかもしれません。
LabVIEWはハードウェアからの信号取得が楽に行えるだけでなく、データの保存の形式もいろいろとカスタマイズできるので便利なのですが、どういった基準でファイルを分けるのかといった点はあまり普段考えなかったりするので、今回の記事のような時間で分ける方法などを知っておくと便利だと思いますので参考にして頂ければうれしいです。
ここまで読んでいただきありがとうございました。
コメント