解決策
このエラーは、PCバッファオーバーフローによって発生します。PCバッファとは、DAQハードウェアとLabVIEWのアプリケーションメモリの間にあるコンピュータ上のバッファです。ハードウェアからは継続的に書き込みが行われますが、LabVIEWからは定期的にしか読み取られません。そのため、読み取り速度の不一致が生じます。通常、DAQmx PCバッファ内のデータは、読み取り速度がサンプルレートよりも遅いか、DAQmx PCバッファがNI-DAQmxタスクに必要なデータを保持するには小さすぎるために上書きされます。
ケース1: 読み取り速度がサンプル速度より遅い
このエラーは、連続サンプリングDAQmxアプリケーションの読み取りレートがDAQmxタスクのサンプルレートよりも遅いために発生することが多く、DAQmx PCバッファにサンプルが蓄積され、最終的に上書きエラーが発生するまで続きます。サンプルレートは、以下のDAQmxタイミングVIプロパティで指定されます。。
このエラーをトラブルシューティングする際には、アプリケーションの読み取り速度とサンプルレートが同じであることを確認する必要があります。
DAQmxアプリケーションの読み取り速度は、DAQmx読み取りVIで要求しているサンプル数のほかに、DAQmx読み取りVIがすぐに呼び出された回数の両方に依存しているため、DAQmx読み取りVIで必要なサンプル数を明示的に制御するか、下図のようにDAQmx読み取りVIを含むwhileループがWait(ms)関数などを使用して1秒間に実行される回数を明示的に制御することで読み取り速度を調整することができます。
メモ: DAQmx読み取りVIは、要求されたサンプル数が使用可能になるまで自動的に待機するため、通常特定のアプリケーションでこれらの要因の1つを制御するだけで構いません。
Whileループが予想よりも遅く実行されている場合は、ロギング、後処理、解析、ユーザーインターフェイス(UI)機能などの他のプロセスを収集ループ外に移動するために、生産者/消費者アーキテクチャを実装する必要があります 。
基本的な生産者/消費者アーキテクチャの実装方法の詳細については、Application Design Patterns: Producer/Consumerを参照してください。
Whileループのパフォーマンスを向上させることができない場合は、代わりにアプリケーションのサンプルレートを下げる必要があります。
注:DAQmx読み取りVIを含むコードで実行のハイライトを使用しないでください。実行が遅くなり、バッファオーバーフローが発生します。
ケース2: PCバッファが小さすぎてタスクデータを保持できない
DAQmx PCバッファが小さすぎるためタスクに必要なデータ量が保持されず、DAQmx PCバッファに上書きされてデータが全く収集されません。
このエラーは、ホスト側のデータバッファのサイズを手動で大きくすることによって解決することがあります。ただし、データがDAQmxバッファから十分に速く読み取られないためにエラーが発生している場合(理由1を参照)、バッファサイズを大きくするとエラーの発生が遅れるだけで完全に除去されません 。
バッファサイズを増やす方法については、DAQmx Buffer Size Allocation for Finite or Continuous Acquisitionを参照してください。
ケース3: 1つの取得ループを使用して、異なる速度で実行されている2つのタスクを読み取る
このエラーは、収集ループを共有する2つのタスクのサンプルレートが異なる場合に発生する可能性があります。このエラーが発生する理由は、DAQmx読み取りがブロッキング呼び出しであるためです。一方のDAQmx読み取りでは、同じサンプル数を読み取るのに時間がかかり、その読み取りに時間がかかる間に、もう一方のタスクのバッファがいっぱいになります。
・ループ内の各DAQmx読み取りの読み取りレートが同じであることを確認してください。例えば、1つのタスクが3000サンプル / 3000サンプル/秒 = 1秒で読み取り、ループ内の2番目のタスクが100サンプル / 100サンプル/秒 = 1秒で読み取ります。各DAQmx読み取りには1秒かかるため、バッファが毎回いっぱいになることはありません。
注:DAQmxタイミングプロパティノード >> SampClk.Rate を使用して、各タスクのサンプルレートを読み取ってください。これは、カードで使用される実際のサンプルレートがユーザーが指定したものと正確に一致していることを確認するために重要です。そうでない場合、読み取られずにバッファに蓄積されるサンプルが存在するため、オーバーフローエラーが発生する可能性があります。例えば、Mシリーズカードでは、30000 S/sのように正確には達成できないサンプルレートを選択した場合、カードは30030.03 S/sで動作します。つまり、集録ループ内のDAQmx読み取り関数で30000サンプルを読み取った場合、反復ごとにバッファに30.03サンプルが蓄積されることになります。
