В этом примере показано, как получать аналоговые входные данные с помощью неблокирующих команд. Это позволяет продолжить работу в окне команд MATLAB во время сбора данных. Это называется фоновым приобретением. Используйте функцию сбора данных основной системы, чтобы программа MATLAB ожидала завершения всего сбора данных до выполнения следующей команды.
Использовать daq для создания объекта DataAcquisition и addinput для добавления к нему входного канала. В этом примере используется модуль NI 9205 в National Instruments ® CompactDAQ Chassis NI cDAQ-9178. Это модуль 1 в корпусе.
dq = daq("ni"); addinput(dq, "cDAQ1Mod1", "ai0", "Voltage"); dq.Rate = 2000;
Во время фонового сбора данных DataAcquisition может обрабатывать полученные данные определенным способом с помощью ScansAvailableFcn собственность.
dq.ScansAvailableFcn = @(src,evt) plotDataAvailable(src, evt);
По умолчанию ScansAvailableFcn называют 10 раз в секунду. Изменение ScansAvailableFcnCount для уменьшения частоты вызовов. ScansAvailableFcn назовут, когда накопленное число очков превысит эту стоимость. Установите ScansAvailableFcnCount в уровень, который приводит к одному звонку в ScansAvailableFcn в секунду.
dq.ScansAvailableFcnCount = 2000;
Использовать start для запуска фонового сбора данных.
start(dq, "Duration", seconds(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

Получать непрерывно до тех пор, пока не будет выполнено определенное условие. В этом примере прием до тех пор, пока сигнал не станет равным или превысит 1 В.
dq.ScansAvailableFcn = @(src,evt) stopWhenEqualsOrExceedsOneV(src, evt);
Настройте получение данных непрерывно. Прослушиватель обнаруживает событие 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