이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
NI 장치를 사용하여 연속 및 백그라운드 데이터 수집하기
이 예제에서는 비차단(non-blocking) 명령을 사용하여 아날로그 입력 데이터를 수집하는 방법을 보여줍니다. 이를 통해 수집 중에도 MATLAB® 명령 창에서 작업을 계속할 수 있습니다. 이것을 백그라운드 수집이라고 합니다. 포그라운드 수집을 사용하면 MATLAB가 다음 명령을 실행하기 전에 전체 수집 작업이 완료될 때까지 기다리게 됩니다.
DataAcquisition 객체 생성 및 구성
DataAcquisition 객체를 생성하고, daq 및 addinput 함수를 사용하여 입력 채널을 추가합니다. 이 예제에서는 National Instruments™ CompactDAQ 섀시 NI cDAQ-9178에 장착된 NI 9205 모듈을 사용합니다. 이것은 섀시의 모듈 1입니다.
dq = daq("ni"); addinput(dq, "cDAQ1Mod1", "ai0", "Voltage");
스캔 레이트를 초당 2000 샘플로 설정하십시오.
dq.Rate = 2000;
백그라운드 수집에서 라이브 데이터 그래프 그리기
백그라운드 수집 중에 DataAcquisition 객체는 ScansAvailableFcn 속성을 사용하여 수집된 데이터를 지정된 방식으로 처리할 수 있습니다. 이 예제에서는 ScansAvailableFcn 속성을 사용하여 콜백 함수를 설정함으로써, 수집된 데이터로 실시간 플롯을 업데이트합니다.
dq.ScansAvailableFcn = @(src,evt) plotDataAvailable(src, evt);
콜백이 트리거되는 빈도를 제어하려면 ScansAvailableFcnCount 속성에 값을 설정하십시오. 이 값은 콜백이 실행되기 전에 확보되어야 하는 스캔 횟수를 지정합니다. 예를 들어, 콜백을 초당 10회 트리거하려면 값을 Rate/10로 설정하십시오.
dq.ScansAvailableFcnCount = 200;
DataAcquisition 객체의 UserData 속성에 핸들을 저장하여 실시간으로 업데이트되는 선 플롯을 생성합니다. 이를 통해 콜백 함수는 백그라운드 수집 과정 중에 선 플롯에 동적으로 액세스하고 업데이트할 수 있습니다.
figure; xlabel("Time (s)"); ylabel("Amplitude"); dq.UserData = animatedline;
백그라운드 수집 시작
start 함수를 사용하여 백그라운드 수집을 시작하십시오. 이 예제는 5초 동안 백그라운드 데이터 수집을 수행합니다.
start(dq, "Duration", seconds(5))
수집 과정에서 수행해야 할 다른 계산이 없으므로, while 루프와 pause를 함께 사용하여 수집 상태를 주기적으로 확인하고 수집된 스캔 횟수를 표시할 수 있습니다. 이 일시 중지 덕분에 루프가 빈번한 폴링 루프로 변하는 것을 방지합니다.
while dq.Running pause(0.5) fprintf("Scans acquired = %d\n", dq.NumScansAcquired) end fprintf("Acquisition stopped after %d scans\n", dq.NumScansAcquired);
Scans acquired = 8000
Scans acquired = 9000
Scans acquired = 10000
Acquisition stopped after 10000 scans

수신 데이터에서 고유한 이벤트 포착
특정 조건이 충족될 때까지 백그라운드에서 데이터를 지속적으로 수집할 수 있습니다. 이 예제에서는 신호가 1 V 이상이 될 때까지 데이터를 수집합니다.
dq.ScansAvailableFcn = @(src,evt) stopWhenEqualsOrExceedsOneV(src, evt);
DataAcquisition 객체의 UserData 속성에 핸들을 저장하여 실시간으로 업데이트되는 선 플롯을 생성합니다. 이를 통해 콜백 함수는 백그라운드 수집 과정 중에 선 플롯에 동적으로 액세스하고 업데이트할 수 있습니다.
figure; xlabel("Time (s)"); ylabel("Voltage"); dq.UserData = animatedline;
연속적인 백그라운드 수집을 시작합니다. 리스너가 1V 이벤트를 감지해야만 수집이 중단됩니다.
start(dq, "continuous");
while 루프를 pause와 함께 사용하여 수집 상태를 주기적으로 확인하고, 수집된 스캔 수를 표시합니다. 이 일시 중지 덕분에 루프가 빈번한 폴링 루프로 변하는 것을 방지합니다.
while dq.Running pause(0.5) fprintf("Scans acquired = %d\n", dq.NumScansAcquired) end fprintf("Acquisition terminated after %d scans\n", dq.NumScansAcquired);
Scans acquired = 4000 Continuing to acquire data Continuing to acquire data Detected voltage exceeds 1V: stopping acquisition Scans acquired = 4600 Acquisition terminated after 4600 scans

콜백 함수
이 콜백 함수는 백그라운드에서 수집된 데이터로 실시간 그래프를 업데이트합니다.
function plotDataAvailable(src, ~) [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix"); addpoints(src.UserData, timestamps , data); end
이 콜백 함수는 리스너가 1V 이벤트를 감지하고 stop을 호출할 때까지 데이터를 지속적으로 수집하도록 DataAcquisition 객체를 설정합니다.
function stopWhenEqualsOrExceedsOneV(src, ~) [data, timestamps, ~] = read(src, src.ScansAvailableFcnCount, "OutputFormat", "Matrix"); addpoints(src.UserData, timestamps , data); if any(data >= 1.0) % stop continuous acquisitions explicitly src.stop() disp('Detected voltage exceeds 1V: stopping acquisition') else disp('Continuing to acquire data') end end