From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

サンプルコードとドキュメント

DAQmx アナログ集録で集録したデータをCSV形式で保存/Writing data acquired with DAQmx AI into CSV files

コードとドキュメント

添付

すべてをダウンロード

概要

NI-DAQmxのアナログ集録で集録したアナログ波形をグラフに表示させつつ、Microsoft Excelなどのソフトウェアで編集・表示可能なCSV形式でデータを保存するVIです。

LabVIEW 2012 SP1以降の開発環境で、NI-DAQmxをインストールした際にインストールされるサンプルVI「電圧 - 連続集録 (Voltage - Continuous Input)」を土台に、集録したデータをCSV形式で保存する機能を付加しています。

(上記のサンプルは、LabVIEWのメニューバーからヘルプサンプルを検索と選択してサンプルファインダを起動し、ハードウェア入力と出力DAQmxアナログ入力と選択した中にあります)

CSV形式は非常に多くのユーザから需要のあるファイル形式ながら、日本語での説明がなされた例がないため、作成・公開することとしました。

今回は、以下の2つの例を作成しています。

  • 例1: DAQmx読み取りVIを呼び出す集録ループ内でスプレッドシートファイルに書き込むVIを用いてデータを書き込む方法 (単純だが高サンプルレート・長時間の集録には不向き)
  • 例2: 生産者/消費者デザインパターンを利用し、かつ下位のファイル入出力関数を用いてデータを書き込む方法 (複雑だが1よりも高サンプルレート・長時間の集録に耐えうる実装)

例1: DAQmx読み取りVIを呼び出す集録ループ内でスプレッドシートファイルに書き込むVIを用いてデータを書き込む方法

説明

上記のサンプルVI「電圧 - 連続集録 (Voltage - Continuous Input)」から、DAQmxロギングを構成VIを用いたログ設定箇所を削除し、DAQmx読み取りVIが呼び出されるWhileループ内で、スプレッドシートファイルに書き込むVIを用いてデータをファイルに書き込んでいます。

以下のVIスニペットのような実装となっています。

1.png

ループ内で呼び出されているWaveform Array to 2D Array with Timestamp.viは以下のVIスニペットのような実装となっており、DAQmx読み取りの出力である1D波形配列から、スプレッドシートファイルに書き込むVIに渡すための2D DBL配列を作成しています。

2.png

このとき、同VIのブールの入力の値に応じて、CSVファイルの最左列に相対時刻の列を作成するか否かを指定できるようにしています。

実行方法

  1. 添付のZIPアーカイブ内のVoltage - Continuous Input - Simple CSV Logging.viを開き、物理チャンネルやサンプルレートなどのパラメータを指定して実行します。
    このとき、Waveform Array to 2D Array with Timestamp.viが上記のVIと同じ階層にあるようにします。
  2. ファイルダイアログが開いたら、保存先のファイルを指定します。
  3. VIを停止し、作成されたCSVファイルを確認します。

問題点

この実装は、相対時刻の列を作成する部分を除けば、比較的単純な実装になっています。

しかしながら、以下の問題点が存在します。

  • 問題点A: DAQmx読み取りVIを呼び出して集録を行うループでファイルへの書き込みを行っており、もしファイル書き込みに顕著な遅延が生じると、その影響でDAQmxの集録タスクにてバッファ上書きエラーが発生しうる点
  • 問題点B: スプレッドシートファイルに書き込むVIを用いる場合、ループの中で書き込みを行うたびにファイルのオープン・クローズ処理を行うため、それに付随するオーバヘッドが発生し、無駄な計算処理の増加につながる点

上記の問題点が存在するため、例1の実装は、高いサンプルレートでの集録や、長時間の集録には適していません。

そして、上記の問題点を改善したのが、例2の実装となります。

例2: 生産者/消費者デザインパターンを利用し、かつ下位のファイル入出力関数を用いてデータを書き込む方法

説明

例1の2つの問題点を、それぞれ以下の手法で改善したのが例2の実装です。

  • 問題点A: キューを用いた生産者/消費者デザインパターンを利用して、DAQデバイスを用いたデータ集録を行うループ (生産者ループ) とファイルへの書き込みを行うループ (消費者ループ) を分離し、それぞれを並列実行可能とすると共に、ファイル書き込み処理における遅延がデータ集録ループの定常的な実行へ及ぼす影響を低減する
  • 問題点B: 下位のファイル入出力関数を用い、ファイルへの書き込みを行うループを呼び出す前に1度だけファイルを開き、ループの実行中はファイルを開いたままとする

ダイアグラムのサイズが大きくなっていますが、以下のVIスニペットのような実装となってます。

3.png

実行方法

  1. 添付のZIPアーカイブ内のVoltage - Continuous Input - Producer and Consumer Design Based CSV Logging.viを開き、物理チャンネルやサンプルレートなどのパラメータを指定して実行します。
    このとき、Waveform Array to 2D Array with Timestamp.viが上記のVIと同じ階層にあるようにします。
  2. ファイルダイアログが開いたら、保存先のファイルを指定します。
  3. VIを停止し、作成されたCSVファイルを確認します。

必要なもの

  • LabVIEW
  • アナログ集録機能を有したDAQデバイス
  • NI-DAQmx

※Voltage - Continuous Input - CSV Logging LabVIEW 2014.zipはLabVIEW 2014に対応しています。

また、Voltage - Continuous Input - CSV Logging LabVIEW 2014.zipはLabVIEW 2012, 2013に対応しています。

その他

  • CSV形式を用いる場合、ASCIIでデータを書き込むこととなるため、TDMSなどのバイナリ形式と比較して書き込み速度が遅い、ファイルサイズが大きくなるなどの短所が問題となる場合があります。
    そのような場合は、TDMSなどのバイナリ形式への切り替えを検討してください。
  • WindowsなどのデスクトップOSは、
    • バックグラウンドアプリケーションやサービスなどの影響で瞬時のパフォーマンスが不安定になる場合がある
    • ユーザインタフェースなどの割り込みの影響を受ける
    • DAQデバイス以外のハードウェアのドライバが不安定になる

など、数日、数週間オーダの計測を行うには不向きとなる要因があります。
数日、数週間オーダの計測を行う場合、NIのリアルタイムシステムソリューションを用いると、ロバストな集録システムを構築できます。

NIコミュニティのサンプルコード交換のサンプルコードは、MIT Licenseによりライセンス供与されています。

寄稿者