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

Этот пример показывает, как получить аналоговые входные данные с помощью команд, не блокирующих. Это позволяет вам продолжать работу в командном окне MATLAB во время сбора. Это называется фоновым приобретением. Используйте приобретение переднего плана, чтобы MATLAB ждал завершения всего сбора, прежде чем можно будет выполнить следующую команду.

Создайте и сконфигурируйте объект DataAcquisition

Использование daq для создания объекта DataAcquisition и addinput чтобы добавить к нему входа канал. Этот пример использует модуль NI 9205 в National Instruments ™ ® CompactDAQ Chassis NI cDAQ-9178. Это модуль 1 в шасси.

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

Постройте график Live данных по мере их приобретения

Во время фонового сбора 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);

Сконфигурируйте 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