tdmsファイルの便利な使い方(ファイル検索)

Tips

スポンサーリンク

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

  • tdmsの便利な使い方(ファイル比較)

を紹介しています。

LabVIEWはハードウェア制御に強いプログラミング言語と言われますが、そのためのファイルI/O操作、つまりファイルの読み取りおよび書き込み(保存)についてもいくつか選択肢を持っています。

データを取得したときにこれを保存する手段としてtdmsファイルを選ぶと便利なことの一つに、データの検索がしやすくなる、というものがあります。

今回は、そんなtdmsファイルを用いて目的のプロパティ値によって、複数のファイルから目的のものを検索するためのプログラムの例を紹介します。

ファイル、グループ、チャンネルのプロパティやその値を指定して、その条件に合致したファイルを検索し、開いたり中身のデータを見る機能も実装しています。

こちらはYouTubeの動画で実際の動作を紹介しています。

tdmsの便利な使い方として紹介してきたプログラムの中ではそこそこ大きいプログラムですが、構造自体は単なるイベント駆動のステートマシンなので、処理している内容は見た目ほど複雑ではありません。

スポンサーリンク

どんな結果になるか

フロントパネルにはtdmsファイルが複数入ったフォルダを選ぶパス制御器、指定するプロパティの対象範囲(ファイル、グループ、チャンネル)を選ぶリング制御器、プロパティ名を選ぶリング制御器、プロパティ値を選ぶリング制御器とこれらを決定するときに押すブール制御器、他にフルパスを表示するためのボタンやリストで選んだファイルをエクスプローラで開いたりtdmsビューアでデータを見るためのボタンがあります。

指定するのは単一のtdmsファイルではなく、複数のtdmsファイルが入ったフォルダであり、そのフォルダ内のtdmsから、特定のプロパティ名、プロパティ値を持ったファイルを検索します。

プロパティはファイル、グループ、チャンネル単位でありますが、それらのどのプロパティとして探すかも指定します。

プログラムの構造

ではプログラムの中身を紹介していきます。

デザインとしては、イベント駆動のステートマシンとしています。

以下がブロックダイアグラムの全容ですが、ステートは8個あります。

このプログラムでは、プロパティ名やプロパティ値で検索することになるのですが、それを実現するためには、指定したフォルダ内の複数のtdmsファイルにあるすべてのプロパティ名やプロパティ値を一度プログラムの中で保持し、そのデータから検索をかけます。

そのため、ファイル、グループ、チャンネル単位でのプロパティ名とプロパティ値をクラスタとして持っておきます。

このクラスタ含め、ステートマシンの各ステートで使用するデータは大きなクラスタとして用意しており、それが以下の図で示した大きなクラスタです。

上記クラスタの下の方に「property range」という列挙体が見えますが、この列挙体は後々のステートで使用します。

Whileループの外にもう一つクラスタがありそこにはブールとリング制御器のリファレンスの配列が含まれています。

まずはinitializeステートです。

ブールやリング制御器の無効プロパティや他の表示状態を初期化しておきます。

次はwait for eventステートです。

ユーザーが起こすイベントを待機します。

下の図で見えているフォルダパスの値変更イベントによって、指定したフォルダ内のすべてのtdmsファイルのプロパティ名やプロパティ値を読み込みクラスタに格納します。

すべてのプロパティ名やプロパティ値を読み取るのはextract information.viで行っています。

このサブVI内でプロパティ名やプロパティ値を扱うため、以下の図のような大きなクラスタを持ちます。

ブロックダイアグラムは以下のようにしており、tdmsについての関数とForループを駆使しています。

この時点ではプロパティ名やプロパティ値の中で重複があった場合にそれを一つずつ大きなクラスタに含める意味はないので、重複している要素は省いています。

メインのVIに戻って、他のイベントについて紹介します。

基本的には他のステートに移るか、ステートマシンのデータクラスタの一部の値を変更する程度の処理しか行っていません。

さらに他のイベントも以下に紹介しています。

イベントの中で使われているcontrol disable property.viは以下のようにしています。

ブールやリング制御器のリファレンスを使用して無効プロパティを操っていますが、このプロパティにどのような指定を行うかはprocess no.と書かれた列挙体で決まります。

この列挙体はステートマシンのデータクラスタに含めていた「property range」と書かれていた列挙体のことです。

メインのVIに戻り、次はupdate tableステートです。

リストの表示状態を、項目名プロパティによって変更しています。

フルパス表示の指定があるかどうかでケースが分かれています。

次はsearch startステートです。

プロパティの検索対象として、まずファイルかグループかチャンネルのどれを選ぶかを決めることになりますが、そのための準備処理をしています。

次はsearch processステートです。

process no.の値によって、対応するリング制御器に表示する項目を決めています。

search process内でprocess noの値によってどのケースが実行されるかが変わりますが、上で紹介したもの以外の残りの2つは以下の通りです。

これらケースの中で重要なのが、リング制御器にどういった値を表示させるかを判定させる処理で、property nameとproperty valueのケースそれぞれで異なる処理を行います。

property nameのケース内で使用しているprocess from selected property name.viの中身は以下の通りです。

プロパティ名の検索対象として選ばれたのが、ファイルプロパティかグループプロパティかチャンネルプロパティかで処理する内容が変わります。

上の、ファイルプロパティに対する処理の場合のケースの中身で使用しているconvert property name to string.viは、この後もいろいろな場所で使用します。

このviは以前別の記事で紹介しているのでそちらを確認してみてください。

process from selected proparty name.viで、グループやチャンネルがプロパティの検索対象として選ばれた場合のケースは以下の通りです。

次に、process no.がproperty valueだったときの、リング制御器に表示する項目名を処理するサブVIであるprocess from selected property value.viの中身です。

考え方はprocess from selected property name.viと似ています。

まずはプロパティの検索対象がファイルだった場合のケースです。

次に、検索対象がグループだった場合の中身です。

そして、検索対象がチャンネルだった場合の中身です。

ではメインのVIの中身に戻ります。

残りのステートの処理は大したことはやっていませんが、まずはopen in explrerステートにて、指定されたファイルが含まれたフォルダを開きます。

open in viewerステートでは、選択されたファイルをtdmsファイルビューアで開きます。

最後に、停止ボタンが押された時のfinishステートでWhileループの条件端子にTrueを渡してプログラムを終了させます。

検索をプログラム内で行うために、一度検索対象となりうる値をプログラム内で保持しており、この部分の処理が見た目複雑になっていますが、その部分を除けば、よくあるファイル管理のためのステートマシンプログラムにしています。

本記事では、tdmsファイルを便利に使えるようにするためのプログラムの例として、複数のtdmsファイルから、検索したい対象のプロパティ名やプロパティ値を指定してファイルを探すためのプログラムを紹介しました。

データを多く取得すればするほど、それらの管理、活用は難しくなります。

せっかくとったデータを適切に扱うためにも、目的のデータを素早く探すための仕組み、プログラムは重要だと思うので、今回の記事が参考になればと思います。

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

コメント

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