波形データ (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 の方が適していますか?