2011-07-26 7 views
1

波形データ(2チャンネル)とアナログ入力トリガ(プリトリガモードで設定 - 負の遅延値)を取得するとき、私はmatlabでDataMissedイベントを受信して​​います。ここで NIボードからデータを取得する際に、matlabのデータが欠落してしまうのを防ぐには?

コードです:トリガーイベントが(showdaqevents(AI)を使用して)受信された後に
sampleRate = 500000; 
pretrigger = 8; 
trigger_value = 0.6; 
ai = analoginput('nidaq','Dev1'); 
ch = addchannel(ai,0:channels); 
set(ai,'SampleRate',sampleRate); 
requiredSamples = floor(pretrigger*sampleRate); 
set(ai,'SamplesPerTrigger',requiredSamples); 

%triggering 
set(ai,'TriggerChannel',ch(channels+1)); 
set(ai,'TriggerType','Software'); 
set(ai,'TriggerCondition','Rising'); 
set(ai,'TriggerConditionValue',trigger_value); 
set(ai,'TriggerDelay',-pretrigger); 
set(ai, 'TriggerRepeat', 0); 

set(ai,'LoggingMode','Disk'); 
set(ai,'LogToDiskMode','Index'); 
set(ai,'LogFileName',[filename '_01']); 

waitTime = pretrigger * 1.1 + 0.5; 

for k = 1:100 
    start(ai); 
    CurrentFile = get(ai,'LogFileName'); 
    disp(['Acquiring for ' CurrentFile]); 
    while strcmp((get(ai, 'Running')), 'On') 
    pause(1); 
    end 
    wait(ai,waitTime); 
    showdaqevents(ai) 
    disp(['Triggered ' CurrentFile]); 
    while strcmp((get(ai, 'Logging')), 'On'); end; 
    disp(['Saved ' CurrentFile]); 
end 

stop(ai); 
delete(ai); 
clear ai; 

は、このコードを実行している、私はイベントをミスしたデータを取得します。しかし、データが欠落したイベントのサンプル番号はNAなので、トリガー後に来ることは完全にはわかりません。ここで

はshowdaqevents出力の例です:データを見ると

1 Start    (14:55:35, 0) 
2 Trigger#1   (14:56:02, 0)  Channel: [3] 
3 DataMissed   ( N/A , 13959168) 
4 DataMissed   ( N/A , 13959168) 
5 DataMissed   ( N/A , 13959168) 
6 DataMissed   ( N/A , 13959168) 
7 DataMissed   ( N/A , 13959168) 
8 DataMissed   ( N/A , 13959168) 
9 Stop    (14:56:03, 5) 

は、MATLAB documentationのイベントを逃した、与えられた2つの説明があります。

  • は、エンジンがの速度に追いついていないこと取得。
  • ドライバは、前に取得したデータが読み取られる前に、ハードウェアのFIFOバッファに新しいデータを書き込みました。 BufferingConfig プロパティを使用してメモリブロックのサイズを増やすことで、通常この問題を回避できます( )。

私はdaqmemコマンドで使用可能なメモリを増やそうとしましたが、動作することが見つかりませんでした。 500000サンプル/秒、3チャンネルはトリガーあたり約90MB、daqmemは360MB以上の空き容量を持っていることを報告します(ただしbuffermodeはAutoに設定されています)。メモリをクリアするためにwhileループでgetdata(ai)を定期的に呼び出す必要があるかどうかは疑問です。もう1つの可能性は、システムのサンプルレートが高すぎることです。

ハードウェア:

  • デュアルコアCPU(アスロンX2 3200)、4GBのRAM、500ギガバイトのSATAハードディスク
  • NI PCI-6122

は私が得ることの可能性ということに言及すべきですDataMissedイベントが長くなると(時間的に)、トリガーを押す前にシステムが取得されます。

データ取得コードに問題がありますか(取得中に一時停止が発生するのは最も不確かです)。ハードウェア?それは心配しないことですか? NIボードを扱うのにVisual Studioは優れていますか?

答えて

1

私は答えはありませんが、デバッグに使用するいくつかの手順を教えていただけます。あなたの元のQでこれらの事柄への答えに気づくことは、nidaqmxユーザーにあなたの問題に関する余分な手がかりを与えるかもしれません。

まず、100回トリガするのではなく、1回だけトリガを使用する場合にサンプルを見逃していますか?

サンプルを取得する頻度が低いですか?

プリ・トリガ・サンプドだけを保持するようにパラメータを変更するとどうなりますか?ポストトリガサンプラのみ?

問題をログに記録していますか?あなたがファイルにロギングするのをやめ、その代わりにデータ収集ツールボックスdocsのthisの例のようにデータをmatlab変数に読み込むと、それは何か変更されますか?

サンプルが欠落していますか? 100回のトリガーで1回実行しますか? 100回のトリガ動作につき100回?確率的には?

私はコードにもっと役立つことができます - 私は常にlinuxの下でnidaqmx c apiを使用しています。私のアプリケーションは継続的に動作するものなので、私はmatlabツールボックスやトリガに慣れていません。

私はこのルールを破るかもしれないと思う:「Q:&サイトです。ディスカッションフォーラムではありません。コメント欄で叱責や訂正をすることができます - サイトの適切な使い方を教えてくれてありがとう!

+0

データが欠落したイベントは、低いサンプリングレートまたは短い記録時間で発生する頻度が少なくなります。ロギングを続行すると問題が解決し、DataMissedイベントが発生しなくなりました。 – Ben

関連する問題