1

波形データ (2 チャネル) とアナログ入力トリガー (プリトリガー モードで設定 - 負の遅延値) を取得するときに、matlab で DataMissed イベントを受信して​​います。

コードは次のとおりです。

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;

このコードを実行すると、(showdaqevents(ai) を使用して) トリガー イベントが受信された後に Data Missed Events が取得されます。ただし、Data Missed Events のサンプル数は 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ドキュメントの Data Missed Events を調べると、次の2 つの説明があります。

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

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

ハードウェア:

  • デュアルコア CPU (Athlon X2 3200)、4 GB の RAM、500 GB の SATA ハードディスク
  • NI PCI-6122

DataMissed イベントを取得する可能性は、トリガーを押す前にシステムに取得させる時間が長いほど (時間的に) 上がることに注意してください。

私のデータ取得コードに問題はありますか (取得の途中で一時停止することについて最も確信が持てません)? ハードウェア?気にしなくていいものなの?NI ボードを扱うには Visual Studio の方が適していますか?

4

1 に答える 1

1

答えはありませんが、デバッグに使用する可能性のあるいくつかの手順を説明できます。元のQでこれらの答えに注意することで、nidaqmxユーザーに問題に関する追加の手がかりを与えることもできます。

まず、100回トリガーするのではなく、単一のトリガーのみを使用するときにサンプルを見逃したことがありますか?

より低い取得率でサンプルを見逃していませんか?

プレトリガーサンプルのみを保持するようにパラメーターを変更した場合はどうでしょうか。トリガー後のサンプルのみ?

ロギングに問題がありますか?ファイルへのログ記録をやめ、代わりにデータ取得ツールボックスのドキュメントからこの例のようにデータをmatlab変数に読み込む場合、それは何かを変更しますか?

どのくらいの頻度でサンプルが不足していますか?100トリガーの実行ごとに1回?100トリガーの実行ごとに100回?それとも確率的に?

コードについてさらにサポートを提供できればと思います。Linuxでは常にnidaqmxcapiを使用しており、アプリケーションは継続的に実行されているため、matlabツールボックスやトリガーに慣れていません。

参考までに、あなたとモデレーターへ-私はこのルールに違反している可能性があると思います。「質問に必ず答えてください。これはQ&Aサイトであり、ディスカッションフォーラムではありません。」コメントセクションで叱責と訂正を受け付けています。サイトの適切な使用法を教えてくれてありがとう!

于 2011-08-02T03:33:50.060 に答える