この記事で扱っていること
- 特定フォルダを監視してファイルの自動変換を行う方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでデータ計測を行う際に、時間の情報とデータがセットになった波形データタイプは非常に便利です。そして、この波形データを保存する際にTDMSデータはとても相性がいいです。
他のファイルデータタイプだと時間の情報とデータの情報を切り分けないとうまく保存できない(そもそも波形データはテキストファイルに書き込む関数に渡せないですし)一方で、TDMSファイルには波形データをそのまま渡せます。
と、データ計測の時点ではTDMSは有利なのですが、一方でTDMSデータを見るときにはちょっと苦労します。
他の記事でも何度か触れていますが、TDMSデータはNational Instruments社が開発したファイル形式で、特定のソフトウェアでしか開けません。Excelでもアドオンを入れていれば開けるのですが、どんな環境でも開けるかというとそうではないので他のファイル形式に変換できた方が都合がいいことがあります。
この、他のファイル形式に変換するという作業を、指定のフォルダに入れるだけで自動的に行い、指定したフォルダに変換後のファイルを出力する、というプログラムを作ってみました。
この仕組みさえあれば、まとまったフォルダの内容をいっぺんに自動的に特定のフォルダに移すことができます。
どんな結果になるか
今回のプログラムで指定する必要があるのは、
- どこにあるTDMSをどのプログラムで変換しどこに保存するか
という情報です。変換プログラムが複数ある場合も想定して、プログラムの実行中に切り替えられるようにしました。
指定のフォルダにTDMSファイルを入れると自動的に判別し、新しくそのフォルダに入ったファイルに対して変換プログラムを適用するようにしています。
監視対象フォルダパス内のファイルおよび変換後ファイル保存先のフォルダ内のファイルは常にリスト表示器に表示されています。今回のプログラムでは拡張子を表示していません。(ブロックダイアグラム上で指定のファイル形式以外を表示させないようにしています)
変換のためのプログラムはTDMSの中のデータをどのように変換したいかで様々考えられますが、例えば複数のチャンネルをそれぞれ別のcsvファイルに分けるような変換プログラムを用意してみました。これ以外も他のいくつかの例を後で紹介しています。
プログラム実行中に、指定フォルダは変更することが可能です、また変換プログラム自体も変更することができます。
変換後のファイルを素早く確認するために、それら変換後のファイルを収めたフォルダにアクセスするためのボタンも用意してみました。
プログラムの構造
プログラムはイベントストラクチャを使用したり他のよりよいデザインパターンを採用すれば効率のいいプログラムができそうですが、今回の目的は指定のフォルダを定期的に監視することなので、あえてポーリング動作をするためにWhileループ一本でおさめるようにしました。
まずプログラムの前半部分では、指定のファイルやプログラムのパスを読み込んでいます。この読み込みは、プログラム実行の一番最初あるいは変更決定のボタンが押されたら更新されますが、それ以外のタイミングでは更新されません。
次に、二つのフォルダパスの情報を元に、それぞれのパスで必要とする特定拡張子のファイルのファイル名を抽出、リスト表示器の項目名プロパティに渡したり、「既に変換をされたかどうか」を確認するためのForループに渡します。
このプログラムでは、一度変換したファイルは、監視対象フォルダパスを変えない限り変換対象にしません。変換したファイルがどんなファイル名だったかを記録するための文字列配列を用意しておいて常にその情報とtdmsのファイル名を比較し相違がないかを見ています。
この仕組みはもっとうまいやり方があるかもしれません。が、今回はシンプルに比較のみを行うためにForループを入れ子にして実装してみました。
なお、特定拡張子のファイル名のみを抽出するサブVIは以下の作りとしています。
変換をしていないファイルがあったら、そのファイル名の情報をケースストラクチャに渡して、この中で指定の変換プログラムをVIサーバーで呼び出し処理させています。
変換のためのプログラム自体は全て、同じコネクタペーンを持っている必要があります。
なお、VIサーバーで他のVIを呼び出す際には以下のように組みます。
最後は、変換後フォルダへジャンプのボタンが押された場合にそのフォルダへすぐにアクセスできるようにファイルシステムで表示関数が実行されるようにしています。この部分は別にループの一番最後にしなければいけない理由は特にありません。
変換プログラムの例
変換プログラムは色々なパターンが考えられると思います。
例えば、以下のようなブロックダイアグラムを持ったプログラムが考えられます。
このプログラムでは、一つのTDMSファイルに一つのグループがあり、複数のチャンネル情報が入っていることを想定して、それら各チャンネル毎に違うcsvファイルへ変換しています。
今回の記事で結果例として見せているものはこのプログラムを使用しています。
もし、変換後のcsvファイルも一つにして、各チャンネルのデータを一つのシートにおさめたい、という場合には次のようなプログラムが考えられます。
結果例は以下のようです。
他にも、変換対象とするTDMSファイルすべてに特定のプロパティが設定されているようなファイルに対して、その情報をcsvの最初の行に入れて、その下の行でデータを記していくような形式にするのであれば、例えば以下のようなプログラムが考えられます。
結果例は以下のようです。
せっかくとったデータを有効活用するために、使いやすいファイルタイプに変換するのは便利なのですが、そのプログラムを色々適用するのが面倒な場合には、今回の記事のプログラムのようにその変換作業すら自動的に行ってしまうこともできるので、参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント