exponenta event banner

Получение непрерывных и фоновых данных с помощью устройств NI

В этом примере показано, как получать аналоговые входные данные с помощью неблокирующих команд. Это позволяет продолжить работу в окне команд 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);

Установите ScansAvailableFcnCount

По умолчанию 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