Переход вашего кода от сеанса к интерфейсу 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);

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

Начало операции
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. Добавьте аналоговый входной канал для устройства с идентификационными Dev1 для измерения напряжения, а затем запустите сбор.

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

Интерфейс DataAcquisition

  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)

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

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

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

Сеансовый интерфейс

Интерфейс сеанса использует прослушиватели и события, чтобы инициировать определенные действия. The 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

Интерфейс DataAcquisition использует функции обратного вызова, которые выполняются при вхождениях, определяемых определенными свойствами. The 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 в MATLAB releases R2019b и R2020a. В обоих этих примерах генератор создал тестовый сигнал на 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).