11-28-2016 11:50 PM
NI USB-6343とNI 9215を用いて、サンプリングレート500Hz以上、チャンネル数20chにて8時間の連続計測を行う予定です。
サンプルなどを参考にVIを構築したのですが、計測開始から1時間、2時間ほど計測を続けると、
エラーコード 200279 "The application is not able to keep up with the hardware acquisition"が出て計測を中断してしまいます。
添付のコードにて、SampleRateは500Hz, Samples to Readは500にて実行しております。
以下の要件を実現したいのですが、labVIEWを初めて日が浅く、どのように変更したらいいのがわかりません。
・サンプリングレート500Hz以上での計測
・計測中、できる限りなめらかに信号を表示する (最低6chまで表示するチャンネル数は削れます。)
・上記エラーで計測を中断しても自動的に再開する
ご教示いただけましたら幸いです。
よろしくお願いいたします。
11-29-2016 01:58 AM
こんにちは。
エラーコードは「200279」とのことですが、エラーメッセージから判断すると「-200279」の間違いではありませんか?
このエラーは、PCバッファがオーバーフローしていることが原因です。
以下のリンクにこのエラー原因と一般的な対処法がわかりやすくまとめられています。
○DAQmx エラー-200279の対処方法 - National Instruments http://digital.ni.com/public.nsf/allkb/82B0DFD4DA91B3B4862576E10022A516?OpenDocument
簡単に言うならば、「DAQのオンボードバッファからPCのバッファへデータをアップロードする速度」(=SampleRateの値)に比べて、「PCバッファからLabVIEWへ読み取る速度」(=添付VIの場合、Whileループの回る速度)が遅いために、このようなエラーが起こります。
対処法としては、
①以下のリンクの方法を元にPCバッファサイズを増やす
○有限/連続収集の際にDAQmxバッファサイズはどのくらい割り当てられますか? - National Instruments
http://digital.ni.com/public.nsf/allkb/A52342629C4F641686256E62003A0157?OpenDocument
②波形の読み取りとデータの保存を同じループ内にいれない
の二つが挙げられます。
①PCバッファサイズをあげることでは根本的な解決にはなりませんが、エラー発生までの時間は延びると思います。(とりあえずの対処法)
②に関しては、添付のVIを見ると、「DAQmx Read」関数と「Write LabVIEW Measurement File」関数を同じWhileループ内に入れています。
一般的にデータのファイル保存は比較的時間のかかる操作です。特に、wasako様が用いているような上位ファイルI/O関数では、データの保存により時間がかかります。
このため、ループの回る速度が遅くなり(=「PCバッファからLabVIEWへ読み取る速度」が「DAQのオンボードバッファからPCのバッファへデータをアップロードする速度」よりも遅くなり)、ある時間経過すると、PCバッファがオーバーフローしてこのようなエラーが出ていると考えられます。
これを回避するには「キュー」を用いて、データを読み取るループとデータを保存するループを分けるべきです。
○キューとは何ですか - National Instruments
http://digital.ni.com/public.nsf/allkb/862567530005F0A1862568C0005577AD
キューとはデータを保持できるバケツのようなもので、読み取りループ内でキューにデータを入れ、別の保存ループにてキューからデータを取り出すことで、データの欠損なく、データの保存が可能です。
さらに読み取りループと、保存ループを分けられるので、上記のような読み取りの際の遅延は生じません。
ヘルプ»サンプルを検索»検索タブに「キュー(英語版でしたらQueue)」とタイプして検索すれば、キューを用いたプログラムのサンプルがありますので、そちらを参照してください。
キューの使い方などがわからない場合は、別途案内しますので、お知らせください。
以上、どうぞよろしくお願い致します。
11-29-2016 08:04 AM
dotriacontaさま
非常に詳しく教えていただきまして、ありがとうございます。
おっしゃる通り、エラーコードは「-200279」でした。申し訳ございません。
キューを用いて実装したところ、サンプリングレートをあげても
エラーを起こさず計測できるようになりました。
ありがとうございます。
差し支えなければ教えていただきたいのですが、
NI USB-6343とNI9215から取得したデータを同一のファイルに保存することはできますでしょうか。
現状、1つのデバイスにつき「読み取り」と「保存」のループを2つ作っており、
計4つのループで動かしております。
保存のループは統一できるのではないかと考え、試行錯誤したのですが、
それぞれのデバイスで計測したデータは時間軸が若干異なると思われ、
うまく統一することができませんでした。
お忙しいところ恐縮ですが、アドバイスをいただけましたら幸いです。
11-29-2016 08:23 PM
キューを用いることで、問題の方が解決されたようでなによりです。
NI USB-6343とNI9215から取得したデータを同一のファイルに保存することはできますでしょうか。
もちろん可能です。
全取得データを1D配列としてまとめればよいのですが、現在、wasako様の方では複数チャンネル複数サンプルの読み込みをしているので、すでに出力データは1D配列となっています。
なので、下図のようにForループとシフトレジスタを用いて、一方の1D配列結果にもう一方の1D配列結果の各要素を追加すれば良いと思います。
また、wasako様の返信を読むと、二つの計測結果の時間軸を一致させたいとおっしゃっているようにも聞こえるのですが、どうなのでしょうか。
もし一致させる必要がある場合は、二つのデバイスの測定を同期させる必要がありますので、別途案内が必要となります。
同期の必要がない場合は、「Write to Measurement File」関数の設定画面で、X Value (Time) columnsの項目において「one column per channnel」にチェックをいれれば、各チャンネルごとに時間列を設けられるので、そちらで良いのではないかと思います。
同期させる必要があるかどうか教えていただけますでしょうか。
どうぞよろしくお願い致します。