この記事で扱っていること
- テキストファイルへ様々な形式でデータを保存する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWプログラムでデータの保存はファイルIOの関数パレットにある関数を用いて行います。
ここでは、いくつかの形式のデータを様々な見た目で保存する際の例を紹介していきます。
今回はTDMSファイルは扱いません。専らテキストファイルを扱っていきます。
どんな結果になるか
保存する際に、それぞれのデータを区別する場合には「デリミタ」を指定することになります。
この言葉自体に聞き覚えがなくても、下の結果を見ていただければわかる通り、データとデータの区切りを表わします。カンマなのか、空白なのか、タブなのか、といった具合ですね。
LabVIEWで保存したデータを、常にLabVIEWで解析するとは限らず、他の解析ソフトウェアに渡す場合に、こういったデータ形式でないと読み込めない、といった条件がある場合があると思います。
この記事では、デリミタの違いはそれぞれ変えられるとして、保存データの並び方が異なるいくつかの例を紹介しています。例えば以下のような保存形式とします(時間情報は適当な時間にしています)。
なお、便宜上ファイルの中身を紹介するためにメモ帳で開いていますが、カンマ区切りならcsvで開けますし、ワードパッド等でももちろん開くことができます。拡張子も.txtである必要はありません。
プログラムの構造
前提として、そもそもデータを保存する際にファイルIOの関数をどう扱うかについて一応紹介します。LabVIEWでデータ保存を行う場合には
- ファイルを開く
- ファイルに書き込む
- ファイルを閉じる
の3つの動作に対応した関数を使用します。このうち、開くと閉じるは基本的には一回ずつでよいのに対し、書き込む動作は場合によって複数回行います。そのため、繰り返しを行うWhileループやForループと組み合わせて使うことになります。
あとはこのファイルに書き込む関数にどのようにデータを入力するかで書き込まれ方が変わります。
また、以下紹介していくプログラム例では、書き込ませるデータを固定しているため一部を除いてテキストファイルに書き込むの関数をループに入れていません。あくまで書き方とその書き方をした場合の結果を紹介しています。
連続的に書き込む、実際の実装例は最後に紹介しています。
配列のデータ
まずは書き込むべきデータが配列で得られているとします。
1次元配列の場合、シンプルにこう書けます。
もし、これらのデータを横並びに保存したい、ということであれば、このような方法が考えられます。
2次元配列の場合でも、「配列からスプレッドシート文字列に変換」をそのまま使用できるので便利です。
波形データ
波形データは時間の情報(t0とdt)、そしてデータ(Y、1次元配列)がセットになっています。
例えば、時間の情報は必要なく、データの部分だけ欲しい!ということであれば、波形データからYを取り出すだけです。以下では、周波数10 Hzで振幅1の正弦波のYの値(の配列)のみを保存した場合の例です。
もし例えば2チャンネル以上の波形データ、つまり波形の配列があってそれらのYだけ保存したい場合には以下の方法があります。
ただ実際はせっかく波形データなので時間の情報も保存しておきたいという場合がほとんどだと思います。そこで時間情報も含めてファイルに保存する方法を紹介していきます。
まず単一の波形(配列ではない)の場合です。時間の情報をどのように記録しておきたいかで色々な組み方が考えられますが、いくつか例を紹介します。
時間の情報をファイルに保存する際には、Y値と同様配列にするのが便利です。波形パレットの、波形時間配列を取得関数を使用するとその時間情報の配列を扱えるようになるので、例えば文字列にフォーマット関数と組み合わせ、時間およびY値の配列のそれぞれの要素を一行一行ファイルに書き込む方法があります。
結果は同じになりますが、一行一行書き込むのではなく、全てまとめて文字列で用意して一度にそれらをテキストファイルに書き込むの関数に渡す方法も考えられます。
あるいは、時間情報を時刻ではなく、経過時間で表して保存する場合には以下のような方法が考えられます。
なお、時間情報の表現の仕方は、形式文字列を編集することで変えることができます。文字列にフォーマットの関数の場合、%Tという指定の仕方もできますが、%<>Tという形式文字列の<>の中に時間形式コードを入れることでカスタマイズができます。
時間形式文字列については、文字列にフォーマット関数のヘルプから他の形式を確認できます。
次に複数波形(波形配列)の場合。こちらもいろいろな表現の仕方が考えられます。ただ、複数波形を扱う場合にはデータをまとめるのが少しややこしかったりします。以下に例を紹介します。
まず、複数の波形が全て同じ時間情報を持っている場合に、1列目にその時間情報、2列目以降に各チャンネルのデータを示す場合です。
次に、それぞれのチャンネルで時間情報が異なっている場合に、奇数列に各チャンネルの時間情報、偶数列に各チャンネルのデータを表示させるような保存を行うには以下のような形でできます。
他にもやりようはあると思いますが、パターンとしてはここで示したものが代表的かなと思います。
ヘッダを書き込む
ファイルへのデータ保存時に、各データが何を表わすか、といったヘッダ情報を用意することで後でデータを見返したときに結果が分かりやすくなります。
データを書き込むのと基本的な要領は同じですが、書き込む回数は1回でいいと思うので繰り返しの処理の中には入れないのが基本形になります。
DAQの場合の応用例
上記の内容を基に、National Instruments社のデータ測定ハードウェアであるDAQを例にいくつかの実装例を紹介します。
まずは配列データを扱う場合です。2D転置の関数を使わないと、行方向にデータが続くことになるので注意します。
次に一つのチャンネルを波形データとして扱う場合です。
そして、複数チャンネルを波形データとして扱う場合です。こちらは4チャンネルを使用してヘッダもつけています。
ヘッダの付け方はもっときれいな方法があるのですが今回の記事の主眼ではないので愚直に文字列を用意しました。
なお、上で紹介している方法は全て表示の都合上、データの読み取りの関数と、ファイルへの書き込みの関数をどちらも同じWhileループに入れています。ファイルへの書き込みの処理が遅いとその分データの読み取りの関数の実行が遅れてしまいエラーの原因となります。
そこで実装としてはデータ読み取りの処理とファイルへの書き込みの処理をキューで分けて行う方法のほうが効率は良くなるので、適宜パフォーマンスを確認して生産者・消費者のデザインパターンを試してみてください。
LabVIEWでデータ保存を行う場合、時間の情報ごと保存、つまり波形データを使用するときに一番楽なのはTDMS形式だと思います。波形データをそのまま書き込みの関数に配線できるからですね。
でもTDMSでは扱いづらいという場合もあるため、いろいろな形式でデータ保存を行う方法について慣れておくと対処しやすいと思います。この記事に載せている方法はあり得そうな方法として載せているだけですが、参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント