В этом примере показано, как генерировать аналоговые выходные данные с помощью неблокирующих команд. Это позволяет продолжить работу в окне команд MATLAB во время генерации. Это называется фоновой генерацией. Используйте генерацию основной системы, чтобы заставить MATLAB дождаться завершения всей генерации данных, прежде чем можно будет выполнить следующую команду.
Использовать daq для создания DataAcquisition. В этом примере используется модуль NI 9263 в National Instruments ® CompactDAQ Chassis NI cDAQ-9178. Это модуль 2 в корпусе. Вывод данных по трем каналам со скоростью 10000 сканирований в секунду.
dq = daq("ni"); dq.Rate = 10000; addoutput(dq, "cDAQ1Mod2", 0:2, "Voltage");
Формирование выходных сигналов путем создания шаблона данных, который многократно записывается в устройство вывода. Данные для каждого канала основаны на столбцах, и выходные сигналы синхронизируются с общим тактовым сигналом.
Создайте 3 формы сигнала:
data01 цикл синусоидальной волны
data11 цикл синусоидальной волны с 45-градусным фазовым запаздыванием
data210 циклов синусоидальной волны
data0 = sin(linspace(0, 2*pi, 1001))'; data1 = sin(linspace(0, 2*pi, 1001) + pi/4)'; data2 = sin(linspace(0, 2*pi*10, 1001))';
Вышеупомянутая форма сигнала содержит sin (0) и sin (2 * pi). Для последовательного повторения формы сигнала опустите конечную точку.
data0(end) = []; data1(end) = []; data2(end) = [];
При частоте генерации 10000 сканирований в секунду можно ожидать наблюдения data0 и data1 как 10 Гц синусоидальные волны и data2 в виде синусоидальной волны 100 Гц.
subplot(3,1,1) plot(data0) title('data0') grid on subplot(3,1,2) plot(data1) title('data1') grid on; subplot(3,1,3) plot(data2) title('data2') grid on;

Перед началом непрерывной генерации, preload полсекунды данных. Использовать start немедленно инициировать генерацию и вернуть управление в командную строку, позволяя выполнять другие операции в MATLAB, пока генерация выполняется в фоновом режиме.
preload(dq,repmat([data0, data1, data2], 5, 1));
start(dq, "repeatoutput")
Использовать pause в цикле для контроля количества сканирований, выводимых аппаратными средствами за время генерации.
t = tic; while toc(t) < 1.0 pause(0.1) fprintf("While loop: scans output by hardware = %d\n", dq.NumScansOutputByHardware) end fprintf("Generation has terminated with %d scans output by hardware\n", dq.NumScansAcquired);
While loop: scans output by hardware = 1109 While loop: scans output by hardware = 2089 While loop: scans output by hardware = 3100 While loop: scans output by hardware = 4095 While loop: scans output by hardware = 5093 While loop: scans output by hardware = 6094 While loop: scans output by hardware = 7082 While loop: scans output by hardware = 8082 While loop: scans output by hardware = 9088 While loop: scans output by hardware = 10099 Generation has terminated with 0 scans output by hardware
Фоновая генерация выполняется одновременно с другими операциями в MATLAB. Явный вызов stop для завершения фоновой генерации.
stop(dq)
Чтобы динамически генерировать выходные данные с помощью функции MATLAB, присвойте функцию ScansRequiredFcn DataAcquisition. Приведенный ниже код функционально эквивалентен 'repeatoutput'
dq.ScanRequiredFunction = (src,evt) write(src, repmat([data0, data1, data2], 5, 1));
start(dq, "continuous")