この記事で扱っていること
- 列ごとに名前を付けて保存する方法
- 列ごとに保存されたデータをヘッダ情報を指定して読みだす方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWを使用してデータの保存をするとき、「ヘッダ情報を付ける」というところまでしっかり組まないと、ただ単にデータの羅列だけ保存されてしまい、各データがどのチャンネルなのかが分からなくなってしまったりします。
TDMSファイル形式であればTDMS書き込みの関数にチャンネル名入力があるのでこれを使用すればいいですが、例えばcsvファイルへの書き込み時にはデータ本体を書き込む前にヘッダを書き込むという処理を置く必要があります。
そこで、指定したチャンネル数に応じてチャンネル名のリストを初期化し、共通の名前を持たせたり番号を付与するなどの機能を備えてヘッダをつけやすくしたプログラムを考えてみました。
また、こうして保存されたデータを、ヘッダの名前で指定してグラフ表示させるプログラムの例も後半で紹介しています。
なお、本記事のサンプルではNational Instruments社のDAQ製品を使用した場合を想定しています。
どんな結果になるか
データ保存のプログラムはDAQの基本的なパラメタの設定、およびヘッダ情報となるチャンネル名のリスト、ここにいくつかの機能を持たせたラッチ動作のボタンと、保存先ファイルパス名の制御器、測定の開始、終了のボタンを設けています。

ラッチ動作のボタンは、共通文字を一度に付与するためのボタン、連番を付与するためのボタン、そして全てやり直す(空文字にする)ボタンを用意しました。

この設定で保存されたファイルの例が以下のようになります。

プログラムの構造
プログラム全体の構造は以下のようになっています。

プログラムの最初の部分は、いわゆる通常のDAQプログラムとやることは変わりません。チャンネルを生成してタイミングを指定するなどといったタスクの構成を行っています。
このプログラムではトリガの設定をしてはいませんが、行う場合には真ん中のWhileループに入る前にトリガ用の関数を入れておきます。
DAQmxタスクのプロパティで取得できるチャンネル数の情報を使用して、チャンネル名リストの値プロパティに、チャンネル数分の空の文字列が入った配列を渡すことで、プログラム実行ごとに使用するチャンネル数が変わってもチャンネル名リストの初期化を適切に行ってくれます。

そしてこの後がこのプログラムの肝になっているヘッダ情報を扱っている部分になります。
文字列配列を、ヘッダ情報を書き込むための制御器としているのですが、各ボタン操作によってこの配列制御器にプログラム的に処理を加えられるようにしています。
その各処理はサブVIとしており、その中でプロパティノードを使用しています。
チャンネル名リストの制御器はあくまでメインVIにあるので、サブVIからメインVIの制御器の値プロパティを変更するため、サブVIにチャンネル名リスト配列のリファレンスを渡しています。

各サブVIは以下のようにしています。
channel_common_name.viは、指定した共通文字をチャンネル名リストの中身全体に付与します。

channel_numbering.viでは、チャンネル名リストの上から順に連番を振る機能を設けています。

そしてchannel_reset.viはチャンネル名リストの表示をリセット(空白文字)にする機能を備えています。

チャンネル名リストの設定を終えたら、その情報をテキストファイルに書き込みます。チャンネル名リストは配列なので、Forループの自動指標付けを用いてカンマ区切りでヘッダ情報を書き込んでいきます。
(カンマ区切りにしているのはcsvファイルを想定しているからです。文字列にフォーマットの形式文字列は「%s,」と、最後のカンマを忘れないようにします)
そしてその後では、単に読み取り値をテキストファイルに書き込んでいます。こちらもcsvファイルを前提としているので配列からスプレッドシート文字列に変換の関数のデリミタはカンマにしています。

この部分はもちろんキューを使用して「データ測定」と「データ保存」のループにそれぞれ分けることもできます。
保存したファイルの読み取り
上で示したサンプルのプログラムで保存したファイルに対しては、一行目にヘッダ情報があることがわかっているため、これを利用してヘッダ情報にあるチャンネル名をリスト化し、そのリスト内のチャンネル名を選択するとそのチャンネルのデータをグラフ表示させるといったことも簡単にできます。
例えば以下のようなプログラムが考えられます。このプログラムでは、読み込んだファイルの1行目にあるヘッダの名前をリストボックスに表示させ、ユーザーが選択した項目の結果をグラフに表示します。

このようなプログラムを作るための一例がこちらです。

データ保存は、データ取得のプログラムを書くのと同じくらい重要です。データを取得したところで保存しなければ後でデータを確認したり解析したりもできないですからね。
保存の仕方を工夫して、後から見たときにもわかりやすい結果となるように心がけることが大切で、この記事のサンプルが役に立てばうれしいです。
ここまで読んでいただきありがとうございました。
コメント