Перейдите свой код от сеанса до интерфейса DataAcquisition

Эта тема помогает вам перейти свой код от интерфейса сеанса до интерфейса DataAcquisition.

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

Эта таблица приводит команды интерфейса сеанса для общих рабочих процессов и их соответствующие команды интерфейса 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);

(Необходимый только для фоновой работы.)

Операция Start
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. Установите частоту развертки сеанса на 8 000.

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

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

Интерфейс DataAcquisition

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

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

    d = daq("ni");
  3. Установите частоту развертки DataAcquisition на 8 000.

    d.Rate = 8000
  4. Добавьте канал аналогового входа для устройства с ID 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)

Интерфейс DataAcquisition

  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 свойство может запустить a 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

Интерфейс 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;

Код Analog Output Generator

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

%% 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 и позже. Если вы используете более ранний релиз, используйте интерфейс сеанса вместо этого. Для получения дополнительной информации и примеры интерфейса сеанса, см. Документацию Data Acquisition Toolbox (R2019b).