01-20-2015 12:04 AM
ご存知の方がいらっしゃいましたら、ご協力お願いします。
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ファイルに書き込むのはどういうことなのか
教えていただくことはできないでしょうか。
よろしくお願いします。
解決済! 解決策の投稿を見る。
01-21-2015 03:02 AM
ご協力お願いします。
自分で質問を追記させていただきます。
「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というサイズで保存する方法は無いものでしょうか?
ご存知の方がいらっしゃいましたら、回答お待ちしております。
01-21-2015 10:54 PM
最初のご質問に関しては、すでにお試しの通りファイルI/OにあるTDMSの関数を使用することになるかと思います。
現在、データ変換してTDMS書き込み関数をお使いかと思いますが、その変換部分をスクリーンショットで構いませんので拝見させていただけないでしょうか?
宜しくお願い申し上げます。
日本NI 上野
01-22-2015 01:00 AM
日本NI 上野様
ご連絡いただき誠にありがとうございます。
TDMS書き込み関数の変換部分に関してのスクリーンショットを添付します。
添付ファイルの画像にコメントとして記入したとおり、DAQ計測スレッドと保存スレッドが
分けて作成されています。
そのため、画像の一番外側にあるwhileループは本来のプログラムでは異なります。
結局のところ、変換・保存方法としては
①1ポイントずつブール配列に変換(Forループ使用)
②累積(シフトレジスタ使用)
③十分な長さ累積したか判定
④書き込み
以上になります。
よろしくお願いします。
01-25-2015 05:35 PM
スクリーンショットありがとうございました。
LabVIEWでは、ブール値は1バイトとして扱われますので、この方法では仕様どおりの動作となります。
1 line=1bitとする場合は、U8データタイプにするしかなく、保存形態が変わってしまうかと思いますので、
その点はご考慮ください。
宜しくお願いします。
日本NI 上野
01-25-2015 05:58 PM
ご連絡ありがとうございます。
結局のところ自作するのではなく
DAQmxロギングを構成(TDMS)を使うほうが良いとわかりました
確認していただきありがとうございます。