この記事で扱っていること
- TDMSファイルから指定のデータ範囲を抽出してテキストファイルに保存する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWを使用してデータを保存する際にどのような拡張子のファイルとして保存するか決めることは、プログラムのパフォーマンス(実行速度など)、あるいは実際にプログラムを書くときの複雑さに関係してきます。
そのどちらをとっても優位と思われるのがTDMSファイルです。
データの保存自体はバイナリファイルに書き込むのと同じような速度で、それでいてデータ測定のときに多く使用される波形データを直接書き込みの関数に配線できるのが魅力です。
今回は、ファイル保存の速さの観点から、測定プログラム自体はTDMSでデータを保存し、後でゆっくり(?)テキストファイルに保存しなおすという場面で使えそうなプログラムを紹介しています。
データ測定はパフォーマンス命でとにかく保存処理に時間をかけたくないけれど、実際にデータを扱う際にTDMSでは不便だ、というときにTDMSからテキストファイルに変換するのですが、今回はTDMSの特性を活かし、グループやチャンネルを選んで保存ファイルを調べ、そしてデータも任意の範囲を抽出してテキストファイルに保存できるようにしてみました。
どんな結果になるか
このプログラムでは、TDMSファイルが既にあることが前提としています。
フロントパネルには、読み込むTDMSファイルを指定する部分、読み込んだTDMSファイルにあったグループ名やチャンネル名を表示しているリスト制御器、データの表示範囲や抽出範囲を指定するための制御器などを用意しています。
読み込むTDMSファイルを指定するファイルパス制御器にTDMSのファイルパスをいれて実行します。
するとそのTDMSファイルの中のグループ名がリストに表れるので、この中から対象としたいグループを選択してOKボタンを押します。すると今度はそのグループの中のチャンネルの一覧が出てくるので、チャンネルを選択しまたOKボタンを押します。
するとそのチャンネルのデータがグラフに表示されるので、あとはグラフ表示の範囲を変えたり、抽出したいデータの範囲を変えて、保存したい範囲が決まったら、保存先パスにファイル(例えばcsv)を指定して保存ボタンを押せば保存することができます。
下の図のグラフでファイルに保存されていたデータ全体は青、抽出範囲は赤で示されます。抽出範囲として指定した部分をグラフ上で確認することができる、という状態です。
注意点としては、上の図のように抽出開始値を0としていて抽出終了値を399としている場合に、抽出される点数は400点になる、ということです(0から数えているので)。
プログラムの構造
まずブロックダイアグラム全体の構造はこちらです。
本来であれば全てのボタン操作をイベントストラクチャで管理するプログラムが最も効率がいいと思いますが、今回はグループやチャンネル決定の部分はイベントストラクチャではなくWhileループによるポーリングでの実装としてみました。
イベントストラクチャが最後にあるプログラムの流れ上、イベントストラクチャで値変更を検出する「保存」や「停止」のボタンはグループやチャンネルが決定する前に押されると困るので、無効プロパティによってそもそも押せないようにしています。
また、ついでにチャンネル決定ボタンもグループ決定ボタンが押されてからでないと押せないようにするためチャンネル決定ボタンに対しても無効プロパティを設定しました。
TDMSファイルを開く関数の後はTDMSの内容をリスト関数でまずそのTDMSファイルの中にあるグループ名を抽出します。抽出したグループ名の配列は「グループリスト」という名前のリスト制御器に表示させるため、リスト制御器の項目名プロパティに配線しています。
このグループ名の配列からグループリスト制御器で選択した値を指標配列と組み合わせることで、指定のグループ名を選択した状態となり、グループ決定ボタンを押してWhileループを抜けられます。
この時点でチャンネル決定ボタンの無効プロパティで有効の設定をし、再びTDMSの内容をリスト関数に今度はグループ名を指定してあげるとそのグループの中のチャンネル名の配列を取得できるので、グループ名の時と同じ要領で指定のチャンネル名を読み取るようにします。
その後にはTDMS読み取りの関数にグループ名とチャンネル名を指定し、ようやくデータを抽出することができます。
抽出したデータに対しては波形要素取得関数を使ってY値の配列を抜き出し、イベントストラクチャの入ったWhileループに渡しています。
イベントストラクチャの中身は次のようです。
まず、メインとなるイベントが、抽出の開始、終了位置が変更されたときに発生するイベントです。このイベントにはタイムアウトも指定しています。
イベントストラクチャが入ったWhileループが実行され最初にこのタイムアウトイベントを実行させることで、チャンネル名をユーザーが選択した後にすぐにグラフにデータを表示させることができます。
Whileループの二回目以降はタイムアウトイベントは必要ないため、Whileループの左上でタイムアウトまでの時間を調整しています。
次にグラフの表示範囲の変更を行うイベントです。グラフのXスケール範囲の最小、最大プロパティを使用します。
データ保存のイベントは抽出した範囲の読み取りを行っています。
あとは、プログラム全体を終了させるための停止イベントです。
抽出部分が見にくい場合
実はこのプログラム、上記の内容でブロックダイアグラムを構成してプログラムそのものは動作するのですが、グラフを見ても抽出部分が分かりにくくなっているかもしれません。
それもそのはず、元々の波形(波形全体)と抽出部分は本来全く同じ点なので、抽出部分はグラフ上でプロットの見た目を変えるなければ完全に重なってしまうからです。
一番手っ取り早いのは波形グラフのグラフ凡例を出して、プロット1(抽出波形)に対して例えばラインの太さを変えたりプロットの状態を変えることですが、もちろんプロパティノードを使用してプログラム的に行うこともできます。
TDMSファイルをテキストファイルに変換するプログラムはこのブログで他にもいくつかの記事で紹介しています。今回のサンプルでは時間の情報を保存していませんが、例えば時間情報をも保存したいということであればこの記事が役に立つかもしれないので参考にしてもらえるともらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント