Получите непрерывный и фоновые данные Используя устройства NI

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

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

Используйте daq создать объект DataAcquisition и addinput чтобы добавить вход образовывают канал к нему. Этот пример использует модуль NI 9205 в Национальном 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);

Сконфигурируйте DataAcquisition, чтобы получать постоянно. Прослушиватель обнаруживает 1-вольтовое событие и вызывает stop.

start(dq, "continuous");

Используйте pause в цикле, чтобы контролировать количество сканов, полученных за длительность приобретения. Обратите внимание на то, что строка состояния, отображенная ScansAvailableFcn может появиться перед последней строкой состояния, отображенной циклом с условием продолжения.

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