この記事で扱っていること
- TDMSの結果のデータとグラフをExcelに出力する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでデータ保存を行う際のファイルフォーマットとして、TDMSという形式が推奨されています。これは、バイナリとしてデータを書き込むので素早くデータ保存ができるだけでなく、メタデータとして各データの情報も残してファイル形式です。
これはこれで便利なのですが、TDMSには弱点があり、特定のアプリケーションでしか開くことができません。
National Instruments社が開発した形式なだけあって、LabVIEW以外のNational Instruments社の他のソフトウェアで開く以外の選択肢だとExcelのアドオンソフトを使用して開くくらいになります。
まぁアドオンを入れたら開けるのでいいのですが、アドオン無しでも開けるようにするために、Excelファイルへ変換するプログラムを作りました。
ただただデータをExcel形式(.xlsx)に変換するだけでなく、読み取ったデータをグラフにした結果も貼り付けるようにしています。
ただし、TDMSがもともと持っていたメタデータは保存していません。あくまでデータを見るための簡易的な措置といった扱いです。
また、Excelへのデータ保存ということで、LabVIEWのアドオンソフトである、Report Generation Toolkitというソフトウェアを使用しています。これは、LabVIEW Professionalエディションであれば特に追加で購入することなく使用できます。
どんな結果になるか
フロントパネルでは、読み取りたいTDMSファイル、そして書き込みたいExcelファイルのパスをそれぞれ選択します。
このとき、TDMSファイルは当然存在しているはずなのでパスにはそのTDMSファイルを指定しますが、Excelファイルはこの時点で存在している必要はありません。作りたい場所と作りたいExcelファイル名を変換先Excelパスに入力すれば自動的に作られます。
プログラムを実行すると、TDMSの中の各グループおよびチャンネルのデータを全て抜き出してExcelファイルに変換、グラフも一緒に保存されます。
TDMSに複数のチャンネルのデータがある場合には、Excelファイルのシートを分けて保存するようにしています。
また、進捗を表わす表示器も設けて、どの程度で変換が完成するかの目安もわかるようにしました。
プログラムの構造
ブロックダイアグラムは少し大きいですが、一つ一つは難しいことをやっているわけではありません。
まずは、Forループに入る前のコードです。ここでは、TDMSのデータファイルを開いた後に、TDMSの内容をリストの関数を二回使用することで、そのTDMSファイルに入っているグループおよびチャンネルを拾い上げ、全部で何チャンネルあるかを小さなForループで数えています。
この数は、処理する数に相当するので、フロントパネルで表示している進捗の数値表示器の最大値の設定に使用します。最大値は、進捗の数値表示器に対するプロパティノード(スケール>>範囲>>最大値)で指定できます。そして、プログラムが開始する時点で進捗の表示が0から始まるように、Valueを0としています。
また、後でExcelに貼り付けるための画像を一時的に残すために用意する画像ファイルをいくつ作るかという数も指定しています。画像ファイルはプログラムの最後にどうせ消すので、ファイル名は適当にtemp1.jpgやtemp2.jpgなどと付くようにしています。
実際にメインのForループに入る前にまたTDMSの内容をリストし、グループの数で外側のForループを回す回数を決めて、内側のForループでは各グループの中のチャンネルの数の分だけループが回るようにしています。
あとはTDMSの読み取りの関数から読み取った波形データをExcelに書き込むために体裁を整えています。この体裁の整え方はいろいろ考えられますが、今回は波形の時間情報とデータの情報をそれぞれ列を分けて保存するようにしました。
Excel操作を行っているReport Generation Toolkit側では、内側のForループが回るたびに、
- ワークシートを追加
- ワークシートを指定
- ワークシートの名前を変更(リネーム)
- データを書き込む
- 画像を貼り付ける
という動作を行っています。
全てのグループ/チャンネルに対して処理を終えたらForループを抜けて、指定したパスのExcelファイルに保存します。また、一時的に作っていた画像ファイルは必要ないのでプログラムから削除します。
特定のグループ、チャンネルのデータのみExcelで保存する場合
TDMSに多くのチャンネルがあってそれらすべてをExcelに変換するのではなくその一部でいい場合には、グループ、チャンネルを選んで保存するといったことも可能です。
ただし、プログラムとしては少し複雑になります。フロントパネルとしては以下のようなものが考えられます。
実行すると指定したTDMS内のグループおよびチャンネルの情報が表示され、Excel記入のブールをTRUEにしたものだけExcelに変換できます。
このプログラムのブロックダイアグラムは例えば次のような形が考えられます。
Excel記入のブールがFALSEになった場合には書き込みをしなければいいだけの話なので、ケースストラクチャで条件分岐させます。
メインの外側のForループを抜けた後は最初に紹介したプログラムと同じです。
一つ一つの箇所でやっていることはそこまで複雑ではない(TDMSからデータを読む、Excelに書き込む、グラフを画像ファイルとして出力する、など)のですが、これらが合わさって見た目としては少し複雑になってしまいました。
これだけ複雑なプログラムを作るくらいであれば、すなおにExcelのアドオンをインストールしたほうがいいのかもしれませんが・・・ただどんな環境でもアドオンがそろっているわけではないと思いますし、一度作ってしまえばずっと使えるので、便利だと思われた方は参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント