NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

DAQmxロギングを構成(TDMS)の使い方

解決済み
解決策を見る

ご存知の方がいらっしゃいましたら、ご協力お願いします。

 

DAQmxにてデジタル入力のログを取得しようとしています。

サンプルを確認して、ログファイルを作成することができましたが、

ファイルサイズが非常に大きく困っています。

 

現状

 tdmsログファイルサイズ  :18.167KB

  tdms_indexファイルサイズ:17.755KB

 

ファイルサイズが大きい原因として下記のURLに記載されている内容を確認しました。

http://digital.ni.com/public.nsf/allkb/44770A4760051A2C8625763B0016DC31

 

ファイルサイズが大きい原因は

一度に1ポイントずつのデータをTDMSファイルに書き込むと、ヘッダー情報が毎データポイントごとに作成されます。

という記述のとおりだったとして(上の記述の意味は良くわかっていません)

DAQmxでのログファイルの作成方法は、「DAQmxロギングを構成(TDMS)」を使用しています。

そのため、1ポイントずつ書き込むというより、特に何も設定を行っていない状況です。

 

ファイルサイズを小さくするような設定はあるのでしょうか。

URLに記載されている 「TDMSを最適化(TDMS Defragment)」VIを使用することも

検討しましたが、「DAQmxロギングを構成(TDMS)」のヘルプには「TDMSを最適化(TDMS Defragment)」VIは

使用できないと記載されています。

 

「DAQmxロギングを構成(TDMS)」を使用せずに、読み取った分だけTDMSファイルに書き込む

という処理を自作するしかないのでしょうか。

 

ついでで申し訳ないのですが、「DAQmxロギングを構成(TDMS)」を使用して

ログファイルを作成し、TDMSファイルをアドオンを用いてExcelで展開したところ

保存されている順番が左から順に

port3/line7 port3/line6 ・・・・・・・・・ port0/line1 port0/line0

というように、思っているのと逆でした。

チャンネル名の指定もできなかったのですが、保存の順番などは指定できないものでしょうか。

 

また。TDMSファイル形式へのログファイル作成に関してですが、

シリアル通信でも同様のことを行おうとしています。

シリアル通信の場合、「DAQmxロギングを構成(TDMS)」のような関数は無いため、

自作しているのですが、そこそこファイルサイズが大きくなっています。

1ポイントずつのデータをTDMSファイルに書き込むのはどういうことなのか

教えていただくことはできないでしょうか。

 

よろしくお願いします。

0 件の賞賛
メッセージ1/6
4,940件の閲覧回数

ご協力お願いします。

 

自分で質問を追記させていただきます。

 

「DAQmxロギングを構成(TDMS)」を使用せずに、

読み取った分だけTDMSファイルに書き込むという処理を自作

 

上記を実際に作成してみました。

 

indexファイルは小さく、チャンネル名の指定など色々とできるようにはなったのですが、

tdmsファイルそのもののサイズが8倍になってしまいました。

 

これはDAQでport0~3の32チャンネルを全部「DAQmxロギングを構成(TDMS)」で

保存した場合、1ポイントの計測で32bit=4byteというサイズになります。

 

自作した場合、それぞれのport/lineが個別になるようにするために

予め1lineずつ、ブール値に変更してから保存すると1lineあたり8bitになるためだと思われます。

※1lineずつブール値に変更とは、計測したU32データをブール配列に変更しています。

  ⇒U32のままだと、全てのデータが連結したままなため、「DAQmxロギングを構成(TDMS)」とは

   異なる保存形態になってしまうのを避けました。

 

DAQによる計測結果をTDMSに自作プログラムで追記する際に

1line=1bitというサイズで保存する方法は無いものでしょうか?

 

ご存知の方がいらっしゃいましたら、回答お待ちしております。

 

 

0 件の賞賛
メッセージ2/6
4,914件の閲覧回数

最初のご質問に関しては、すでにお試しの通りファイルI/OにあるTDMSの関数を使用することになるかと思います。

 

現在、データ変換してTDMS書き込み関数をお使いかと思いますが、その変換部分をスクリーンショットで構いませんので拝見させていただけないでしょうか?

 

宜しくお願い申し上げます。

 

日本NI 上野

0 件の賞賛
メッセージ3/6
4,899件の閲覧回数

日本NI 上野様

 

ご連絡いただき誠にありがとうございます。

 

TDMS書き込み関数の変換部分に関してのスクリーンショットを添付します。

添付ファイルの画像にコメントとして記入したとおり、DAQ計測スレッドと保存スレッドが

分けて作成されています。

そのため、画像の一番外側にあるwhileループは本来のプログラムでは異なります。

 

結局のところ、変換・保存方法としては

 ①1ポイントずつブール配列に変換(Forループ使用)

 ②累積(シフトレジスタ使用)

 ③十分な長さ累積したか判定

 ④書き込み

 

以上になります。

 

よろしくお願いします。

0 件の賞賛
メッセージ4/6
4,895件の閲覧回数
解決策
トピック作成者sMaSaToが受理

スクリーンショットありがとうございました。

LabVIEWでは、ブール値は1バイトとして扱われますので、この方法では仕様どおりの動作となります。

1 line=1bitとする場合は、U8データタイプにするしかなく、保存形態が変わってしまうかと思いますので、

その点はご考慮ください。

 

宜しくお願いします。

 

日本NI 上野

0 件の賞賛
メッセージ5/6
4,845件の閲覧回数

ご連絡ありがとうございます。

 

結局のところ自作するのではなく

DAQmxロギングを構成(TDMS)を使うほうが良いとわかりました

 

確認していただきありがとうございます。

0 件の賞賛
メッセージ6/6
4,842件の閲覧回数