exponenta event banner

Перенос кода из сеанса в интерфейс сбора данных

В этом разделе описывается переход кода из интерфейса сеанса в интерфейс DataAcquisition.

Переход к общим командам рабочего процесса

В этой таблице перечислены команды интерфейса сеанса для общих рабочих процессов и соответствующие им команды интерфейса DataAcquisition.

Для этого Команда сеансаКоманда сбора данных
Поиск поддерживаемого оборудования, доступного для вашей системы
daq.getDevices
Восстановить исходное состояние панели инструментов
daqreset
Создать объект интерфейса
s = daq.createSession('ni')
d = daq("ni");
Добавление канала аналогового ввода
addAnalogInputChannel(s,'Dev1',1,'Voltage')
addinput(d,"Dev1","ai1","Voltage")
Добавление канала аналогового выхода
addAnalogOutputChannel(s,'Dev1',0,'Current')
addoutput(d,"Dev1","ao1","Current")
Добавить цифровую входную линию
addDigitalChannel...
      (s,'Dev1','Port0/Line0:1','InputOnly')
addinput(d,"Dev1","port0/line1","Digital");
Добавить входной канал счетчика
addCounterInputChannel...
      (s,'Dev1','ctr0','EdgeCount')
addinput(d,"Dev1","ctr0","EdgeCount");
Данные очереди для вывода
queueOutputData(s,outputSignal);
preload(d,outputSignal);

(Требуется только для фоновой эксплуатации.)

Запуск операции
startForeground(s);
startBackground(s);

Для операций основной системы, блокирующих работу MATLAB ®:

write(d,signalData)
read(d,8000)
readwrite(d,8000)

Для фоновых операций, которые выполняются без блокирования MATLAB:

preload(d,outputSignal);
start(d)
Установка скорости сканирования данных
s.rate = 48000
d.Rate = 48000;
Укажите внешний триггер
addTriggerConnection...
    (s,'External','Dev3/PFI0','StartTrigger');
addtrigger(d,"Digital","StartTrigger","External","Dev3/PFI0");
Укажите диапазон входных сигналов
ch = addAnalogInputChannel...
			(s,'Dev1',1,'Voltage');
ch.Range = [-5 5];
ch = addinput(d,"Dev1","ai4","Voltage");
ch.Range = [-5 5];

Получение аналоговых данных

Интерфейс сеанса

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

  1. Найдите оборудование, доступное для вашей системы.

    d = daq.getDevices
  2. Создайте сеанс для устройств National Instruments ®.

    s = daq.createSession('ni');
  3. Установите скорость сканирования сеанса равной 8000.

    s.Rate = 8000
  4. Добавьте аналоговый входной канал для устройства с ID Dev1 для измерения напряжения, а затем запустите сбор данных.

    addAnalogInputChannel(s,'Dev1',1,'Voltage');
    startForeground(s);

Интерфейс сбора данных

  1. Найдите оборудование, доступное для вашей системы.

    devs = daqlist
  2. Создайте DataAcquisition для устройств National Instruments.

    d = daq("ni");
  3. Установите скорость сканирования DataAcquisition равной 8000.

    d.Rate = 8000
  4. Добавление аналогового входного канала для устройства с идентификатором Dev1 для измерения напряжения, а затем начать сбор данных.

    addinput(d,"Dev1","ai1","Voltage");
    data = read(d,4000);

    Результаты сканирования возвращаются в расписание data.

Использовать триггеры

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

Интерфейс сеанса

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

  1. Создайте сеанс и добавьте два аналоговых входных канала.

    s = daq.createSession('ni');
    ch = addAnalogInputChannel(s,'Dev1',0:1,'Voltage');
  2. Сконфигурируйте терминал и диапазон каналов в сеансе.

    ch(1).TerminalConfig = 'SingleEnded';
    ch(1).Range = [-10.0 10.0];
    ch(2).TerminalConfig = 'SingleEnded';
    ch(2).Range = [-10.0 10.0];
  3. Создайте внешнее триггерное соединение и установите однократное выполнение триггера.

    addTriggerConnection(s,'External','Dev1/PFI0','StartTrigger');
    s.Connections(1).TriggerCondition = 'RisingEdge';
    s.TriggersPerRun = 1;
  4. Установите скорость и продолжительность сбора данных.

    s.Rate = 50000;
    s.DurationInSeconds = 0.01;
  5. Получение данных на переднем плане и печать данных.

    [data,timestamps] = startForeground(s);
    plot(timestamps,data)

Интерфейс сбора данных

  1. Создайте DataAcquisition и добавьте два аналоговых входных канала.

    d = daq("ni");
    ch = addinput(d,"Dev1",0:1,"Voltage");
  2. Сконфигурируйте конфигурацию терминала и диапазон каналов в DataAcquisition.

    ch(1).TerminalConfig = "SingleEnded";
    ch(1).Range = [-10.0 10.0];
    ch(2).TerminalConfig = "SingleEnded";
    ch(2).Range = [-10.0 10.0];
  3. Создайте внешнее триггерное соединение и установите однократное выполнение триггера.

    addtrigger(d,"Digital","StartTrigger","Dev1/PFI0","External");
    d.DigitalTriggers(1).Condition = "RisingEdge";
    d.NumDigitalTriggersPerRun = 1;
  4. Установка частоты сканирования при получении.

    d.Rate = 50000;
  5. Получение данных в основной системе в течение 0,01 секунды и печать данных из всех каналов.

    data = read(d,seconds(0.01));
    plot(data.Time, data.Variables)

Инициировать операцию, когда число сканирований превышает указанное значение

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

Интерфейс сеанса

Интерфейс сеанса использует прослушиватели и события для запуска определенных действий. NotifyWhenDataAvailableExceeds свойство может инициировать DataAvailable событие. Прослушиватель определяет выполняемую в это время операцию.

  1. Создайте сеанс сбора данных, добавьте аналоговый входной канал.

    s = daq.createSession('ni');
    addAnalogInputChannel(s,'Dev1','ai0','Voltage');
  2. Установите скорость сканирования 800 000 сканирований в секунду, которая автоматически устанавливает DataAvailable уведомление об автоматическом запуске 10 раз в секунду.

    s.Rate = 800000;
    s.NotifyWhenDataAvailableExceeds
    ans =
        80000
  3. Увеличение NotifyWhenDataAvailableExceeds до 160 000.

    s.NotifyWhenDataAvailableExceeds = 160000;
  4. Добавьте прослушиватель для определения функции вызова при возникновении события.

    L = addlistener(s,'DataAvailable', ...
           @(src,event)readAndLogData(src));

Интерфейс сбора данных

Интерфейс DataAcquisition использует функции обратного вызова, которые выполняются в экземплярах, определяемых определенными свойствами. ScansAvailableFcnCount определяет, когда инициировать функцию обратного вызова, определенную ScansAvailableFcn.

  1. Создайте интерфейс DataAcquisition и добавьте аналоговый входной канал.

    d = daq("ni");
    ch = addinput(d,"Dev1",1,"Voltage");
  2. Установите скорость сканирования 800 000 сканирований в секунду, которая автоматически корректирует ScansAvailableFcnCount собственность.

    d.Rate = 800000;
    d.ScansAvailableFcnCount
        80000
  3. Увеличение ScansAvailableFcnCount до 160 000.

    d.ScansAvailableFcnCount = 160000;
  4. Определите функцию обратного вызова для момента подсчета.

    d.ScansAvailableFcn = @readAndLogData;

Код генератора аналогового выхода

Для сравнения кода интерфейса сеанса и кода интерфейса DataAcquisition можно использовать код, сгенерированный генератором аналоговых выходов в версиях R2019b и R2020a MATLAB. В обоих этих примерах генератор создавал синусоидальный сигнал 10 Гц в течение 1 секунды на одном канале USB-6211 National Instruments.

%% Auto-generated by Data Acquisition Toolbox Analog Output Generator in MATLAB R2020a.
%% Create DataAcquisition Object
% Create a DataAcquisition object for the specified vendor.

d = daq("ni");
%% Add Channels
% Add channels and set channel properties, if any.

addoutput(d,"Dev1","ao0","Voltage");
%% Set DataAcquisition Rate
% Set scan rate.

d.Rate = 250000;
%% Define Test Signal
% Create a test sine wave signal of specified peak-to-peak amplitude for each 
% channel.

amplitudePeakToPeak_ch1 = 20;

sineFrequency = 10; % 10 Hz
totalDuration = 1; % 1 seconds

outputSignal = [];
outputSignal(:,1) = createSine(amplitudePeakToPeak_ch1/2, ...
                        sineFrequency, d.Rate, "bipolar", totalDuration);
outputSignal(end+1,:) = 0;
%% Generate Signal
% Write the signal data.

write(d,outputSignal);
%% Clean Up
% Clear all DataAcquisition and channel objects.

clear d outputSignal
%% Create Test Signal
% Helper function for creating test sine wave signal.

function sine = createSine(A, f, sampleRate, type, duration)

numSamplesPerCycle = floor(sampleRate/f);
T = 1/f;
timestep = T/numSamplesPerCycle;
t = (0 : timestep : T-timestep)';

if type == "bipolar"
    y = A*sin(2*pi*f*t);
elseif type == "unipolar"
    y = A*sin(2*pi*f*t) + A;
end

numCycles = round(f*duration);
sine = repmat(y,numCycles,1);
end
%% Auto-generated by Data Acquisition Toolbox Analog Output Generator in MATLAB R2019b
%% Create Data Acquisition Session
% Create a session for the specified vendor.

s = daq.createSession('ni');
%% Set Session Properties
% Set properties that are not using default values.

s.Rate = 250000;
%% Add Channels to Session
% Add channels and set channel properties.

addAnalogOutputChannel(s,'Dev1','ao0','Voltage');
%% Define Test Signal
% Create a test sine wave signal of specified peak-to-peak amplitude for each 
% channel.

amplitudePeakToPeak_ch1 = 20;

sineFrequency = 10; % 10 Hz
totalDuration = 1; % 1 seconds

outputSignal(:,1) = createSine(amplitudePeakToPeak_ch1/2, ...
                        sineFrequency, s.Rate, 'bipolar', totalDuration);
outputSignal(end+1,:) = 0;
%% Queue Signal Data
% Make signal data available to session for generation.

queueOutputData(s,outputSignal);
%% Generate Signal
% Start foreground generation

startForeground(s);
%% Clean Up
% Clear the session and channels.

clear s outputSignal
%% Create Test Signal
% Helper function for creating test sine wave signal.

function sine = createSine(amplitude, frequency, sampleRate, type, duration)

sampleRatePerCycle = floor(sampleRate/frequency);
period = 1/frequency;
s = period/sampleRatePerCycle;
t = (0 : s : period-s)';

if strcmpi(type, 'bipolar')
    y = amplitude*sin(2*pi*frequency*t);
elseif strcmpi(type, 'unipolar')
    y = amplitude*sin(2*pi*frequency*t) + amplitude;
end

numCycles = round(frequency*duration);
sine = repmat(y, numCycles, 1);
end

Справка по предыдущему интерфейсу

Интерфейс DataAcquisition поддерживается в R2020a и более поздних версиях. Если используется более ранняя версия, используйте интерфейс сеанса. Дополнительные сведения и примеры интерфейса сеанса см. в разделе Документация инструментария сбора данных (R2019b).