NI製品ディスカッション

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

USB-6009のデータ収集プログラミング

Delphiでのプログラミングですが、質問の本質はC++でも変わらないと思います。

USB-6218、USB-6210、PCI-6220などで動作する以下のプログラムが

 

      // タスク作成
      DAQmxErrChk(DAQmxCreateTask('',@taskHandle),'DAQmxCreateTask');

      // チャンネル設定
      DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, 'Dev1/ai0:7', '', DAQmx_Val_InputTermCfg_RSE, -10.0, 10.0, DAQmx_Val_VoltageUnits1_Volts, ''),'DAQmxCreateAIVoltageChan');

      // 周波数、データ数、収録タイプ設定
      DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, 'OnboardClock', 100.0, DAQmx_Val_Rising, DAQmx_Val_AcquisitionType_FiniteSamps, 100),'DAQmxCfgSampClkTiming');

      // データ収集
      DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,  10, 10.0, DAQmx_Val_GroupByScanNumber, @DAQWork[1], 1280, @sampsPerChanRead, 0),'DAQmxReadAnalogF64');

      // タスク終了
      DAQmxStopTask(taskHandle);
      DAQmxClearTask(taskHandle);

 

14bit分解能のUSB-6009ではDAQmxReadAnalogF64( )で以下のエラーが出て動作しません。

 

      Omboard device memory overflow. Because of system and/or bus-bandwidth

      limitations. the driver could not read data from the device fast enough to keep up

      with the device throughput.

 

      Reduce the sample rate, or reduce the number of programs your computer is

      executing concorrently; 

 

USB-6009は性能が48kS/秒なので、データ数的に問題ないと思いますが、パラメーターを

いろいろ変えて試しても上手くいきませんでした。

 

 原因、対処方法をご存知の方、ご教授いただければ幸いです。

 

0 件の賞賛
メッセージ1/3
5,162件の閲覧回数

YK1957 様

 

今回のエラーはエラーコード「-200361」で間違いありませんでしょうか。

 

上記エラーコードの場合、考えられる可能性は2つです。一つは、お客様もお試しいただいているとおり、文字通り「メモリのオーバーフロー」によるものです。以下の情報をご参考ください。

 

USB-6008/6009におけるエラー200361、バッファオーバーフローエラーについて

http://digital.ni.com/public.nsf/allkb/8BCAB6A9F2D6E6BC862570B300000D02?OpenDocument

 

USB-6008/6009 Error -200361: Buffer Overflow Error

http://digital.ni.com/public.nsf/allkb/611475F9BE62881E86256FDC0062B1BB

 

上記が原因でない場合は、Windows 7 EHCI ドライバの不具合の可能性が考えられます。もちろん、NI は Windows USB スタックに対してなにも出来ませんので、回避策として DAQmx のチャンネルプロパティーでトランスファーリクエストを制限することにより、上記エラーを避ける方法を提示しております。こちらの機能は、まず DAQmxドライバのバージョンを 9.4 にしていただいて、DAQmx チャンネルプロパティーで USB Transfer Requesnt Count を 1 にセットして頂く必要がございます。

 

以下が LabVIEW 上でのプロパティーの設定です。

 

original.png

 

上記では、AI.UsbXferReqCount として表記されるかと思います。

 

YK1957 様がお使いの言語は Delphi とのことですので、関数はint32 __CFUNC DAQmxSetAIUsbXferReqCount(TaskHandle taskHandle, const char channel[], uInt32 data) であるかと思われます。NI-DAQmx C Reference Help では「Get/Set/Reset AI_UsbXferReqCount」と検索頂ければ詳しい情報を確認でますので、ご参照下さい。

 

CS. Hara

0 件の賞賛
メッセージ2/3
5,149件の閲覧回数

CS. Hara様

 

 質問への回答、ありがとうございます。

 

 エラーコードは「-200361」で間違いありませんが、テストパネルやLabVIEWでは

USB-6009の動作確認ができ、同じパソコンにUSB-6218を接続した場合は、同じ

自作プログラムで32Ch同時計測もできますので、パソコン側の問題ではないと思

います。

 

 またUSB-6009をUSB接続した直後、1回目だけは自作プログラムでも正常動作

することが分かりました。

 

 DAQmxSetAIUsbXferReqCountを使えば問題が解決するのかもしれませんが、

(テストパネルは動作するので違う気がしていますが)製品付属のCDがVer9.3.5

のためか、NI-DAQmx C Reference HelpでDAQmxSetAIUsbXferReqCountの

情報は見つかりませんでした。

 

 今回USB-6009を選んだのは、コストを低く抑えたかったという理由だけでした

ので、USB-6009対応のためだけに手間をかけすぎるのは本末転倒になります

ので、使用実績のあるUSB-6210を購入しなおして対処することに致しました。

 

  製品を変えても、同じプログラムが動作するという点で、御社製品に魅力を

感じていますので、今回は少し残念でしたが、今後ともよろしくお願い致します。

 

  YK1957

  

 

 

 

  

0 件の賞賛
メッセージ3/3
5,130件の閲覧回数