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