2011-07-26 1 views
1

파형 데이터 (2 채널) 및 아날로그 입력 트리거 (사전 트리거 모드에서 설정 - 음의 지연 값)를 수집 할 때 matlab에서 DataMissed 이벤트를 수신합니다. 여기 NI 보드에서 데이터 수집을 할 때 matlab에서 데이터 누락 이벤트를 피하는 방법은 무엇입니까?

코드입니다 : 트리거 이벤트합니다 (showdaqevents (인공 지능)를 사용하여) 수신 한 후
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; 

이 코드를 실행, 나는 이벤트 누락 된 데이터를 얻을. 그러나 데이터 누락 이벤트에는 샘플 번호가 없으므로 트리거 이후에 ​​오는 것으로 완전히 확신 할 수는 없습니다.

  • 엔진은 속도를 따르지 못할 : 주어진 두 가지 설명이있다 matlab에 documentation에서 이벤트 부재

    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) 
    

    데이터로 상대 : 여기

    는 showdaqevents 출력의 예 취득.
  • 드라이버는 이전에 획득 한 데이터가 읽히기 전에 하드웨어의 FIFO 버퍼에 새 데이터를 썼습니다. 보통 BufferingConfig 속성을 사용하여 메모리 블록의 크기를 늘려이 문제를 회피 할 수 있습니다 ( ).

daqmem 명령으로 사용할 수있는 메모리를 늘리려고했으나 제대로 작동하지 않습니다. 500000 샘플/초, 3 채널은 트리거 당 총 약 90MB이며, daqmem은 360MB 이상 무료로보고합니다 (buffermode는 Auto로 설정되어 있음). while 루프에서 메모리를 지우려면 getdata (ai)를 주기적으로 호출해야하는지 궁금합니다. 다른 가능성은 시스템의 샘플링 속도가 너무 높다는 것입니다.

하드웨어 :

  • 듀얼 코어 CPU (애슬론 X2 3200), 4GB의 RAM, 500기가바이트 SATA 하드 디스크는
  • NI PCI-6122

내가 언급해야하는지고의 가능성 DataMissed 이벤트가 길어지면 트리거를 누르기 전에 시스템을 가져옵니다.

데이터 수집 코드에 문제가 있습니까? (수집 중간에 일시 중지가 발생하는 것에 대해 가장 잘 모릅니다)? 하드웨어? 걱정하지 않아도 될까요? NI 보드를 다루기 위해 Visual Studio가 더 좋습니까?

답변

1

답변이 없지만 디버깅 할 때 사용할 수있는 단계를 알려 드릴 수 있습니다. 원래 Q에서 이러한 것에 대한 답변을 언급하면 ​​nidaqmx 사용자에게 문제에 대한 추가 단서를 줄 수도 있습니다.

첫째, 100 번 트리거하는 대신 단일 트리거 만 사용할 때 샘플을 놓친 적이 있습니까?

낮은 획득 속도로 샘플을 놓치십니까?

사전 트리거 샘프 만 유지하도록 매개 변수를 변경하는 경우는 어떻습니까? 포스트 트리거 샘프 만?

로깅 문제가 있습니까?만약 당신이 파일에 로깅 대신 그냥 데이터 수집 도구 상자 워드 프로세서에서 this 예제 에서처럼 matlab에 데이터를 읽으십시오, 그게 아무것도 변경합니까?

샘플 누락 빈도는? 1 회 100 회 실행 당 1 회? 100 트리거 실행 당 100 번? 아니면 확률 론적으로?

위시 코드에 대한 더 많은 도움을 제공 할 수 있습니다. 저는 항상 Linux에서 nidaqmx c api를 사용하고 있으며, 응용 프로그램은 계속 실행되는 것으로, matlab 도구 상자 나 트리거링에 익숙하지 않습니다.

내 생각에 나는이 규칙을 위반할 수 있습니다. "질문에 답변했는지 확인하십시오 : Q & 사이트이며 토론 포럼이 아닙니다." 의견 섹션에서 견책과 수정을 할 수 있습니다 - 사이트의 적절한 사용법을 알려 주셔서 감사합니다!

+0

데이터 손실 이벤트는 샘플 속도가 낮거나 기록 시간이 짧을 때 자주 발생하지 않습니다. 로깅을 진행하면 문제가 해결되고 더 이상 DataMissed 이벤트가 발생하지 않습니다. – Ben

관련 문제