주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

NI 장치를 사용하여 연속 및 백그라운드 데이터 수집하기

이 예제에서는 비차단 명령을 사용하여 아날로그 입력 데이터를 수집하는 방법을 보여줍니다. 이를 통해 수집 중에도 MATLAB® 명령 창에서 작업을 계속할 수 있습니다. 이것을 백그라운드 수집이라고 합니다. 포그라운드 수집을 사용하면 MATLAB가 다음 명령을 실행하기 전에 전체 수집 작업이 완료될 때까지 기다리게 됩니다.

DataAcquisition 객체 생성 및 구성

daq를 사용하여 DataAcquisition 객체를 생성하고 addinput를 사용하여 해당 객체에 입력 채널을 추가합니다. 이 예제에서는 National Instruments® CompactDAQ Chassis NI cDAQ-9178에서 NI 9205 모듈을 사용합니다. 이것은 섀시의 모듈 1입니다.

dq = daq("ni");
addinput(dq, "cDAQ1Mod1", "ai0", "Voltage");
dq.Rate = 2000;

실시간 데이터의 수집과 동시에 플로팅

백그라운드 수집 중에 DataAcquisition은 ScansAvailableFcn 속성을 사용하여 지정된 방식으로 수집된 데이터를 처리할 수 있습니다.

dq.ScansAvailableFcn = @(src,evt) plotDataAvailable(src, evt);

ScansAvailableFcnCount 설정

ScansAvailableFcnCount를 초당 ScansAvailableFcn를 한 번 호출하는 레이트로 설정합니다. ScansAvailableFcn는 누적된 스캔 개수가 지정된 ScansAvailableFcnCount를 초과하면 호출됩니다.

dq.ScansAvailableFcnCount = 2000;

백그라운드 수집 시작

start를 사용하여 백그라운드 수집을 시작합니다.

start(dq, "Duration", seconds(5))

다른 계산은 수행할 필요가 없으며 수집은 5초 동안 실행되도록 설정됩니다. 루프에서 pause를 사용하면 수집 기간 동안 수집된 스캔 개수를 모니터링할 수 있습니다.

while dq.Running
    pause(0.5)
    fprintf("While loop: Scans acquired = %d\n", dq.NumScansAcquired)
end

fprintf("Acquisition stopped with %d scans acquired\n", dq.NumScansAcquired);
While loop: Scans acquired = 1000

수신 데이터에서 고유한 이벤트 포착

특정 조건이 충족될 때까지 지속적으로 수집합니다. 이 예제에서는 신호가 1V와 같거나 커질 때까지 수집합니다.

dq.ScansAvailableFcn = @(src,evt) stopWhenEqualsOrExceedsOneV(src, evt);

지속적으로 수집하도록 DataAcquisition을 구성합니다. 리스너는 1V 이벤트를 감지하고 stop를 호출합니다.

start(dq, "continuous");

루프에서 pause를 사용하면 수집 기간 동안 수집된 스캔 개수를 모니터링할 수 있습니다. ScansAvailableFcn에 의해 표시되는 상태 문자열은 while 루프에 의해 표시되는 마지막 상태 문자열보다 먼저 나타날 수 있습니다.

while dq.Running
    pause(0.5)
    fprintf("While loop: Scans acquired = %d\n", dq.NumScansAcquired)
end

fprintf("Acquisition has terminated with %d scans acquired\n", dq.NumScansAcquired);

dq.ScansAvailableFcn = [];
While loop: Scans acquired = 1000
Detected voltage exceeds 1V: stopping acquisition
While loop: Scans acquired = 2000
Acquisition has terminated with 2000 scans acquired

function plotDataAvailable(src, ~)
    [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix");
    plot(timestamps, data);
end

function stopWhenEqualsOrExceedsOneV(src, ~)
    [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix");
    if any(data >= 1.0)
        disp('Detected voltage exceeds 1V: stopping acquisition')
        % stop continuous acquisitions explicitly
        src.stop()
        plot(timestamps, data)
    else
        disp('Continuing to acquire data')
    end
end
While loop: Scans acquired = 2200
While loop: Scans acquired = 3200
While loop: Scans acquired = 4200
While loop: Scans acquired = 5200
While loop: Scans acquired = 6200
While loop: Scans acquired = 7200
While loop: Scans acquired = 8200
While loop: Scans acquired = 9200
While loop: Scans acquired = 10000
Acquisition stopped with 10000 scans acquired