주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

사용자 코드를 세션 인터페이스에서 DataAcquisition 인터페이스로 전환

이 항목은 사용자의 코드를 세션 인터페이스에서 DataAcquisition 인터페이스로 전환하는 데 도움을 줍니다. DataAcquisition 인터페이스는 R2020a 이상 버전에서 지원됩니다. 이전 버전을 사용 중인 경우 세션 인터페이스를 대신 사용하십시오.

일반적인 워크플로 명령어 전환하기

이 표는 일반적인 워크플로우에 대한 세션 인터페이스 명령어와 해당 DataAcquisition 인터페이스 명령어를 나열합니다.

수행할 작업 세션 명령어DataAcquisition 명령어
시스템에서 사용할 수 있는 지원되는 하드웨어 찾기
시스템에서 사용 가능한 지원 공급업체 찾기
툴박스를 초기 상태로 재설정
daq.reset
인터페이스 객체 생성
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");
카운터 출력 채널 추가
addCounterOutputChannel...
      (s,'Dev1','ctr0','PulseGeneration')
addoutput(d,"Dev1","ctr0","PulseGeneration");
데이터 스캔 레이트 설정
s.Rate = 48000
d.Rate = 48000;
출력할 데이터를 대기열에 넣기
queueOutputData(s,outputSignal)

백그라운드 작업에만 필요합니다.

preload(d,outputSignal)
MATLAB®을 차단하는 동기식 포그라운드 작업을 시작

입력 신호를 수집합니다.

s.DurationInSeconds = 5;
inData = startForeground(s);
Duration은 read 함수의 입력 인수입니다.
inData = read(d,seconds(5));

출력 신호를 생성합니다.

queueOutputData(s,outputSignal);
startForeground(s);
출력 데이터는 write 함수에 직접 제공됩니다.
write(d,signalData)

신호를 생성하고 수집하는 작업을 동시에 수행합니다.

queueOutputData(s,outputSignal);
inData = startForeground(s);

동시 입출력에는 readwrite를 사용하십시오.

inData = readwrite(d,outputSignal);
MATLAB을 차단하지 않고 실행되는 비동기 백그라운드 읽기 작업 시작
s.DurationInSeconds = 5;
startBackground(s)
start(d,"Duration",seconds(5))
    ⋮
inData = read(d,"all")
MATLAB을 차단하지 않고 실행되는 비동기 백그라운드 쓰기 작업 시작
queueOutputData(s,outputSignal);
startBackground(s);
preload(d,outputSignal);
start(d)
연속적인 백그라운드 작업 시작
s.IsContinuous = true;
inData = startBackground(s);
start 함수는 연속 작동을 지정합니다.
start(d,"Continuous")
연속적인 백그라운드 쓰기 작업 시작
lh = addlistener(s,'DataRequired',@queueMoreData);
s.IsContinuous = true;
queueOutputData(s,outputSignal);
startBackground(s);

데이터가 미리 로드된 경우, 생성은 start 함수로 시작됩니다.

d.ScansRequiredFcn = @writeMoreData;
preload(d,outputSignal);
    ⋮
start(d,"Continuous")

데이터가 미리 로드되지 않은 경우, 생성 과정은 write 함수로 시작됩니다.

d.ScansRequiredFcn = @writeMoreData;
start(d,"Continuous")
    ⋮
write(d,outputSignal)
콜백 구성
listenDA = addlistener(s,'DataAvailable',@logData);
listenDR = addlistener(s,'DataRequired',@queueMoreData);
listenEO = addlistener(s,'ErrorOccurred',@handleError);
d.ScansAvailableFcn = @logData;
d.ScansRequiredFcn = @writeMoreData;
d.ErrorOccurredFcn = @handleError;
외부 트리거 지정
addTriggerConnection...
    (s,'External','Dev3/PFI0','StartTrigger');
addtrigger(d,"Digital","StartTrigger","External","Dev3/PFI0");
입력 신호 범위를 지정
ch = addTriggerConnection...
			(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);

DataAcquisition 인터페이스

  1. 시스템에서 사용할 수 있는 하드웨어를 찾습니다.

    devs = daqlist
  2. National Instruments 장치용 DataAcquisition을 생성합니다.

    d = daq("ni");
  3. DataAcquisition 스캔 레이트를 8000으로 설정합니다.

    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 속성은 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;

아날로그 출력 생성기 코드

세션 인터페이스 코드와 DataAcquisition 인터페이스 코드를 비교하려면 MATLAB 릴리스 R2019b 및 R2020a에서 아날로그 출력 생성기로 생성된 코드를 사용할 수 있습니다. 이 두 예시 모두에서, 신호 생성기는 National Instruments USB-6211의 단일 채널에 1초 동안 10Hz 테스트 신호 사인파를 생성했습니다.

%% 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