波形データのcsv保存と読み出し

Tips

スポンサーリンク

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

  • 波形データをcsvファイルに保存する方法

を紹介しています。

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

LabVIEWでデータ収集を行う場合、取り扱うデータは多くの場合配列か波形データタイプになります。

配列は配列関数に慣れていれば操作しやすく便利なのですが、例えば「一定周期で測定したデータ」としてそのまま解析することが難しかったりします。周期、といっている以上、時間の情報を伴う必要があるものの、測定データの値そのものは時間情報を持たないためです。

しかし、データを保存するときには「配列からスプレッドシート文字列に変換」関数を使用してテキストファイルに書き込む関数に簡単に入力できます。

一方、波形データはデータ点と時間情報(サンプリング時間)を持っているため、FFTなどの解析処理を行う上では便利なデータタイプです。ただし、波形データタイプはそのままでは「配列からスプレッドシート文字列に変換」関数を使用できません。

波形データの場合、TDMSファイルへの保存であれば波形データそのままの状態で書き込みの関数に入れることができますが、このTDMSを開く方法が限定的になっているのがネックだったりします(Excelのアドオンを使用することはできますが)。

そこで、時間情報もともにcsvファイルに書き出すプログラム、およびこれを後で復元するためのプログラムを作ってみました。こうすることで後の解析時にも正しい時間情報を持った波形データとして扱うことができるようになります。

スポンサーリンク

どんな結果になるか

今回作成したプログラムは下の図で示したフロントパネルとしました。といっても、データを保存するだけなので、特に制御器などを配置する必要はありません。

ただ、生成されたファイルを正しく読み出せているか確かめるためにどんな波形を書き込んだかを示すために一応グラフ表示器を設けています。また、どのように書き込まれるかを表示させる文字列表示器も付けています。

ファイル読み出しのプログラムも基本的には同じです。ファイルから読み取ったデータをグラフに表示させるようにしています。

カスタマイズとしては、扱うファイルのパスを指定するためにファイルパス制御器を付けることで任意のファイル保存場所を選べるといったプログラムにもできると思います。今回はシンプルに、このVIが置かれているディレクトリと同じ階層にcsvファイルを作成することを想定しています。

実行してみるとファイルが生成され、また読み出しのプログラムの方では書き出した波形が確かに読みだされていることがわかります。

プログラムの構造

大元では波形データとして測定値を取得する必要があります。でないと時間情報が得られないからです。今回のサンプルでは、保存するデータとして正弦波にノイズを乗せたデータをプログラム内で生成しています。

保存の方法としてはシンプルに、波形データを時間情報とY値の情報に分けるだけです。このうちY値の情報については波形要素取得を使用すれば波形データから波形のYの要素(配列)を取り出すという操作はよく行われると思います。

一方で時間の情報は、波形データとして元々あるt0とdtから、各Y値配列の要素に対応した時間の文字列データを取得する必要があります。そのためにちょうどいい関数が「波形時間配列を取得」関数です。

波形データを入力すると、タイムスタンプの配列を返してくれます。

あとはこのタイムスタンプのデータをテキストに変換する必要があります。これには「日付/時間文字列をフォーマット」関数を使用します。タイムスタンプの情報を、好みのテキストデータに変換することができます。

この関数の使い方の例が下の図のようなものです。タイムスタンプの時間形式文字列の指定の仕方はヘルプに詳細があります。

この関数を使用してcsvの一列目に時間、二列目にYのデータを保存するプログラムの例が下の図です。

すべてのデータをまとめて文字列にしてからテキストファイルに書き込むのか、あるいは一行ずつ書き込むのかどちらがパフォーマンス的にいいのかはおそらく前者になるかなと思います。テキストファイルに書き込むの関数では都度都度ファイルにアクセスするのに対し、一度にドカンとまとめて大量のデータを書き込む方がメモリの断片化も起こりにくそうかなと思います。

一方で、Forループの中で文字列連結を使用し扱う文字列がどんどんサイズが大きくなるのはパフォーマンス的にどうかなとも思うのですけれどね。

一方で、ファイルを作ったらこれを読み出すプログラムも似たような構造で作れます。時間情報は文字列として保存していたわけですが、ファイルを読み出して波形データを表示させるにはt0とdtを作る必要があります。

一例として以下のようなプログラムが考えられるかと思います。

なお、string_time_conv.viというサブVIにしている部分は、中にあるのは文字列からスキャンの関数のみなのですが、タイムスタンプとして読み取る、およびタイムスタンプの形式はこれ、ということを指定した状態にしています。メインVIにあると定数が多く煩雑なのでこうしてみました。

なお、このサブVIで使用している時間形式文字列は日付/時間文字列をフォーマットに渡している時間形式文字列と微妙に異なります。%<(日付/時間文字列をフォーマットに渡している時間形式文字列)>T、という形式でないとうまくタイムスタンプに変換することができないためです。

これらのプログラムを実際に動かすと確かにファイルが生成され、これを読み出すことで波形データに復元することができます。

あとはグラフに表示するなり、FFTなどの解析をするなり、コードを付け加えていくだけです。

時間情報を柔軟に変更する

ファイルに書き込ませる日付時刻の形式は上で例を示したように時間形式文字列によってさまざまに表すことができます。年月日の情報はいらず時刻の情報だけ欲しい場合もあれば、日付の情報と時刻の情報を保存したいこともあるかもしれません。

ファイルに書き込む方のプログラムで柔軟に変更しても読み出しのプログラムの方で波形データに復元できるようにするためには、例えばファイルの最初の行にヘッダとして時間形式文字列を持たせておいて、これを読み込みのプログラムの方で読ませることで対応させるといったことが考えられます。

このようにしておけば、書き込み側のプログラムで時間形式文字列をいちいち変更しても読み取り側のプログラムを毎回修正する必要がなくなります。

その分ファイルにデータに関係ない文字(時間形式文字列)が増えてしまうのでそこは良しあしですね。

今回の例はcsvを例にしましたが、もちろん他のファイル形式でも対応できます。TDMS形式の方がファイルサイズが小さくなり、またファイル書き出し速度も速い(データ自体はバイナリで保存するので)ということで利点があるのですが、開けるソフトが限定的になるのが不便という方には今回の記事の作り方を参考にしていただけるかもしれません。

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

コメント

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