NI-DAQmx의 10가지 함수 학습을 통해 데이터 수집 어플리케이션의 80%를 해결하십시오

내용

NI-DAQmx 시작하기 시리즈는 NI-DAQmx 프로그래밍 기초에 대한 학습을 돕는 것이 목표입니다. 이 시리즈에서는 동영상 및 텍스트 튜토리얼을 통해 MAX(Measurement & Automation Explorer)에서 디바이스의 동작을 확인하는 것부터 LabVIEW로 데이터 수집 어플리케이션을 프로그래밍하는 것까지 학습할 수 있습니다. 이 시리즈는 DAQ Assistant를 사용하는 방법을 학습하려는 초보자뿐만 아니라, NI-DAQmx의 고급 기능을 활용하려는 숙련된 사용자에게 모두 도움이 되도록 구성되었습니다.

NI-DAQmx: 개발 시간 단축 및 성능 향상

NI-DAQmx가 출시된 이후, NI 데이터 수집(DAQ) 하드웨어 사용자는 개발 시간을 절약하고 데이터 수집 어플리케이션의 성능은 향상하도록 설계된 NI-DAQmx의 많은 기능을 최대한 활용해왔습니다.

상당한 개발 시간을 절약하는 기능 한 가지는 바로 NI-DAQmx 어플리케이션 프로그래밍 인터페이스(API)입니다. 이는 모든 디바이스 기능과 디바이스 제품군에 걸쳐 동일한 기능을 제공합니다. 이는 다기능 디바이스의 모든 기능이 동일한 함수들(아날로그 입력, 아날로그 출력, 디지털 I/O 및 카운터)을 사용하여 프로그램된다는 의미입니다. 또한 디지털 I/O 디바이스와 아날로그 출력 디바이스가 이처럼 동일한 함수 집합으로 프로그램된다는 뜻입니다. LabVIEW에서는 다형성 덕분에 이것이 가능합니다. 다형성 VI는 하나 이상의 입력 및/또는 출력 터미널에서 여러 데이터 타입을 허용합니다. NI-DAQmx API는 또한 모든 관련 프로그래밍 환경에서 일관성을 유지합니다. 단일 함수 모음의 사용법만 익히면 여러 프로그래밍 환경에서 대부분의 NI 데이터 수집 하드웨어를 프로그램할 수 있습니다.

개발 경험을 향상하는 NI-DAQmx의 또 다른 기능으로 DAQ Assistant가 있습니다. DAQ Assistant가 제공하는 그래픽 인터페이스를 사용하면 간단한 태스크부터 복잡한 태스크까지 어떤 종류의 데이터 수집 태스크라도 설정할 수 있으므로 프로그래밍하지 않고도 어플리케이션을 만들 수 있습니다. 또한, 트리거 및/또는 클럭 신호를 수동으로 라우팅해야 하기 때문에 일반적으로 구현하기 어려운 프로세스인 동기화는 NI-DAQmx를 사용하여 단일 디바이스의 여러 기능 영역 간, 그리고 여러 디바이스 간에 신호 라우팅을 자동으로 수행하여 간단하게 구현할 수 있습니다.

NI-DAQmx를 사용하여 빌드하는 데이터 수집 어플리케이션은 성능을 극대화하도록 설계된 아키텍처의 이점을 얻을 수 있습니다. 그 시작은 불필요한 재구성을 제거하는 효율적인 상태 모델입니다. 이 오버헤드가 제거되면 설정과 수집이 모두 최적화됩니다. 또한 50kS/s 이상의 단일 포인트 I/O 속도를 달성할 수 있습니다. 메모리 매핑 레지스터 덕분에 이런 수준의 성능이 가능합니다.

NI-DAQmx 아키텍처의 또 다른 중요한 특징은 측정 멀티스레딩입니다. NI-DAQmx는 다중 스레드로 동작하므로 여러 데이터 수집 작업이 동시에 수행되어 여러 작업을 포함하는 어플리케이션의 성능을 크게 향상할 수 있습니다. 또한 이와 같은 어플리케이션의 프로그래밍을 크게 단순화해 줍니다.

몇 가지 함수만 배워도 이러한 이점을 활용하기 시작할 수 있습니다. 실제로, 10개의 NI-DAQmx 함수가 데이터 수집 어플리케이션 중 80%를 해결하는 기능을 제공합니다. 이 문서에서는 이러한 함수의 기능과 함수가 사용되는 어플리케이션 유형을 모두 이해하는 데 도움이 되도록 자세한 설명을 제공합니다.

참고:기술 지원 데이터베이스 문서에서 참조하는 위치에서 이 문서 전체에서 참조하는 예제입니다.

DAQ 어시스턴트

도구»DAQmx 태스크 생성/편집 [CVI]
프로젝트»새 항목 추가»DAQmx 태스크 [.NET]






 

DAQ Assistant는 NI-DAQmx 버추얼 채널 및 태스크를 대화식으로 생성, 편집 및 실행하기 위한 그래픽 인터페이스입니다. NI-DAQmx 버추얼 채널은 DAQ 디바이스의 물리적 채널과 입력 범위 및 맞춤 스케일링과 같은 해당 채널의 설정 정보로 설정됩니다. NI-DAQmx 태스크는 버추얼 채널, 타이밍, 트리거링 정보와 기타 수집 또는 생성과 관련된 설정의 모음입니다. 다음 그림에서 DAQ Assistant는 유한 변형률 측정을 수행하도록 설정되어 있습니다.

 


다음 문서는 LabVIEW, LabWindows/CVI와 .NET에서의 DAQ Assistant 사용법을 설명합니다.

NI-DAQmx Express VI 튜토리얼
LabWindows/CVI에서 DAQ Assistant 사용하기
Measurement Studio에서 DAQ Assistant 사용하기

DAQ Assistant는 지정된 수집 또는 생성 작업을 설정 및/또는 수행하기 위한 코드를 생성할 수도 있습니다. 이러한 작업을 LabVIEW에서 수행하는 절차는 DAQ Assistant 도움말DAQ Assistant를 사용하여 LabVIEW 코드 자동 생성 문서에 설명되어 있습니다. 다음 그림은 DAQ Assistant의 인스턴스, 자동 생성된 설정과 예제 LabVIEW 코드를 보여줍니다.


특정 데이터 수집 어플리케이션은 DAQ Assistant가 제공하는 것보다 더 큰 유연성 및/또는 더 높은 성능을 요구합니다. 이러한 어플리케이션에는 아래에 설명된 간단하면서도 강력한 NI-DAQmx 기능이 필요합니다.

NI-DAQmx 버추얼 채널 생성



라이브러리»NI-DAQmx»채널 생성/설정 [CVI]

Task.Channel.CreateChannel 프로퍼티 [.NET]








NI-DAQmx 버추얼 채널 생성 함수는 버추얼 채널을 생성하여 태스크에 추가합니다. 또한 여러 버추얼 채널을 생성하고 모든 버추얼 채널을 하나의 태스크에 추가할 수도 있습니다. 태스크를 지정하지 않으면 이 함수가 태스크를 생성합니다. NI-DAQmx 버추얼 채널 생성 함수에는 수많은 인스턴스가 있습니다. 각 인스턴스는 버추얼 채널이 수행하는 측정 또는 생성 유형에 대응됩니다.

LabVIEW에서 채널 생성

다음 그림은 서로 다른 NI-DAQmx 버추얼 채널 생성 VI 인스턴스를 이용하는 네 가지 예제를 보여줍니다.


NI-DAQmx 버추얼 채널 생성 함수의 입력은 인스턴스에 따라 다릅니다. 그러나 몇몇 입력값은 전부는 아니지만 대부분의 인스턴스에 공통으로 사용됩니다. 예를 들어 버추얼 채널에서 사용할 물리적 채널(아날로그 입력 및 아날로그 출력), 라인(디지털) 또는 카운터를 지정할 입력이 필요합니다. 또한 아날로그 입력, 아날로그 출력 및 카운터 작동은 최소값최대값 입력을 받아 신호의 최소 및 최대 예상값을 기반으로 측정과 생성을 설정하고 최적화합니다. 또한 맞춤형 스케일도 많은 유형의 버추얼 채널에 적용할 수 있습니다. 다음 LabVIEW 블록 다이어그램에서는 NI-DAQmx 버추얼 채널 생성 VI를 사용해 열전쌍 버추얼 채널을 생성하는 것을 보여줍니다.

 

.NET에서 채널 생성

NI-DAQmx .NET 라이브러리에 있는 대부분의 클래스는 직접 인스턴스화할 수 없습니다. 이 클래스들은 클래스의 하위 객체로 사용됩니다.

이 클래스들에는 특정 유형의 채널에 쓰이는 프로퍼티가 포함됩니다. 예를 들어, Count와 같은 프로퍼티는 카운터에만 적용할 수 있으며 CIChannelCOChannel 클래스에만 존재합니다. 다음 유형의 채널을 NI-DAQmx .NET 클래스 라이브러리와 연결할 수 있습니다.

아날로그 입력 채널 — 클래스

아날로그 출력 채널 — 클래스

디지털 입력 채널 — 클래스

디지털 출력 채널 — 클래스

카운터 입력 채널 — 클래스

카운터 출력 채널 — 클래스

Task 클래스에는 6가지 유형의 채널( , , , , , ) 각각에 대한 채널 컬렉션 프로퍼티가 있습니다. 채널을 만들려면 채널 컬렉션에 있는 여러 가지 채널 생성 메소드 중 하나를 사용하면 됩니다.

새 Task 객체를 인스턴스화한 후 AIChannel 객체를 만들고 할당하는 일은 Channel 클래스에서 적절한 멤버 함수를 호출하여 이루어집니다. 다음 코드 스니펫은 간단한 아날로그 입력 전압 채널을 생성합니다.

analogInTask = new Task();

AIChannel myChannel;

myChannel = analogInTask.AIChannels.CreateVoltageChannel(

    "dev1/ai1", //채널의 물리적 이름

    "myChannel", //이 채널과 연관된 이름

    AITerminalConfiguration.Differential, //차동 와이어링

    -10, //-10v 최소

    10, //10v 최대

    AIVoltageUnits.Volts //volts 사용
);

 

C/C++에서 태스크 만들기

DAQmxCreateTask() 함수로 태스크를 만들고 DAQmxCreateAIVoltageChan()으로 아날로그 입력 전압 채널을 만드십시오. 다양한 측정 유형을 위한 채널 생성에 대한 정보는 NI-DAQmx C 참조 도움말을 살펴보십시오. 다음은 이 두 함수를 사용하는 방법을 나타내는 코드 스니펫입니다.

TaskHandle  taskHandle=0;
char        chan[256] = "Dev1/ai0";
float64     min = -10, max = 10;

DAQmxCreateTask("",&taskHandle);

DAQmxCreateAIVoltageChan(taskHandle ,chan ,"", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

 

참고 예제:

LabVIEW Digital - Finite Output.vi
Thermocouple - Continuous Input.vi
CVI Write Dig Port
Cont Thrmcpl Samples-Int Clk
.NET WriteDigPort
ContAcqThermocoupleSamples_IntClk

 

NI-DAQmx 트리거


라이브러리»NI-DAQmx»트리거링 [CVI]

Task.Triggers 프로퍼티 [.NET]

 

NI-DAQmx 트리거 함수는 트리거가 특정 동작을 수행하도록 구성합니다. 가장 일반적으로 사용되는 동작은 시작 트리거참조 트리거입니다. 시작 트리거는 수집 또는 생성을 시작합니다. 참조 트리거는 수집된 샘플 세트에서 트리거 이전 데이터가 끝나고 트리거 이후 데이터가 시작되는 위치를 설정합니다. 이러한 트리거는 모두 디지털 에지나 아날로그 에지에서, 또는 아날로그 신호가 윈도우로 들어가거나 나오는 경우에 발생하도록 구성할 수 있습니다.

LabVIEW에서 트리거 생성

다음 LabVIEW 블록 다이어그램은 아날로그 입력을 위해 NI-DAQmx 트리거 VI를 사용하여 디지털 에지에서 시작 트리거와 참조 트리거가 모두 발생하도록 설정된 태스크를 보여줍니다.


많은 데이터 수집 어플리케이션에서는 단일 디바이스의 서로 다른 기능 영역(예: 아날로그 출력 및 카운터)의 동기화가 필요합니다. 또한 여러 디바이스의 동기화가 필요한 경우도 있습니다. 이러한 동기화를 달성하려면 단일 디바이스의 여러 기능 영역 또는 여러 디바이스 간에 트리거 신호를 라우팅해야 합니다. NI-DAQmx는 자동으로 이 라우팅을 수행합니다. NI-DAQmx 트리거 함수를 사용하면 유효한 모든 트리거 신호가 함수의 소스 입력 목록에 표시됩니다. 예를 들어, 다음 NI-DAQmx 트리거 VI에서 디바이스 2에 대한 시작 트리거 신호는 명시적으로 라우팅을 하지 않아도 디바이스 1에 대한 시작 트리거 소스로 표시됩니다.

 

.NET에서 트리거 생성

Task 객체와 Channel을 생성한 후 Task.Triggers 컬렉션의 메소드를 호출하여 태스크에 트리거를 추가할 수 있습니다. 다음은 Digital Edge Start Trigger를 생성하는 코드 스니펫입니다.

analogInTask = new Task();

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("PFI0", triggerEdge);

ConfigureDigitalEdgeTrigger 함수로 전송된 파라미터에 따라 디바이스는 내부 또는 외부 라인에서 상승 또는 하강 디지털 에지를 기다려 데이터 수집을 시작할 것입니다. 위의 코드 스니펫에서 디바이스는 PFI 0에서 상승하는 디지털 에지 트리거를 찾도록 설정되었습니다.

 

C/C++에서 트리거 생성

DAQmxCfgDigEdgeStartTrig() 함수를 사용하여 디지털 에지 시작 트리거를 생성합니다. 다른 트리거 생성에 대한 정보는 NI-DAQmx C 참조 도움말을 살펴보십시오. 아래는 이 함수를 이용하여 PFI0에서 들어오는 상승 디지털 에지를 찾아 트리거하도록 설정하는 방법을 보여주는 코드 스니펫입니다.

char        startTrigger[256] = "Dev1/PFI0";
int         startEdge = 0; // rising edge

DAQmxCreateTask("",&taskHandle));

DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

DAQmxCfgDigEdgeStartTrig(taskHandle, startTrigger, startEdge);
 

 

NI-DAQmx 타이밍 및 동기화 기능 문서에는 NI-DAQmx와의 동기화를 수행하기 위해 NI-DAQmx 트리거 기능을 사용하는 방법에 관한 추가 정보가 포함되어 있습니다.

참고 예제:

LabVIEW Voltage - Finite Input.vi
Voltage - Continuous Input.vi
CVI Acq-Int Clk-Dig Start&Ref
Cont Acq-Int Clk-Anlg Start
.NET AcqVoltageSamples_IntClkDigStartAndRef
ContAcqVoltageSamples_IntClkAnalogStart

NI-DAQmx 타이밍


라이브러리»NI-DAQmx»타이밍 [CVI]

Task.Timing 프로퍼티 [.NET]







NI-DAQmx 타이밍 함수는 하드웨어 타이밍 데이터 수집 작업의 타이밍을 설정합니다. 여기에는 작업의 연속성과 유한성 여부 지정하기, 유한한 수집 또는 생성 작업의 경우 샘플 수 선택하기, 필요한 경우 버퍼 생성하기가 포함됩니다.

샘플 타이밍이 필요한 작업(아날로그 입력, 아날로그 출력 및 카운터)의 경우, NI-DAQmx 타이밍 함수의 샘플 클럭 인스턴스는 샘플 클럭의 소스(내부나 외부 소스)와 속도를 모두 설정합니다. 샘플 클럭을 통해 샘플을 수집하고 생성하는 속도를 제어합니다. 각 클럭 펄스는 태스크에 포함된 각 버추얼 채널에 대해 하나의 샘플 수집 또는 생성을 트리거링합니다.

 

LabVIEW에서 태스크 타이밍 설정


다음 LabVIEW 블록 다이어그램은 NI-DAQmx 타이밍 VI의 샘플 클럭 인스턴스를 사용하여 외부 샘플 클럭을 통한 연속 아날로그 출력 생성을 설정하는 방법을 보여줍니다.


데이터 수집 어플리케이션에서 동기화를 달성하려면 트리거 신호가 단일 디바이스의 다양한 기능 영역과 여러 디바이스 간에 라우팅되어야 하는 것처럼, 타이밍 신호도 동일한 방식으로 라우팅되어야 합니다. NI-DAQmx는 이 라우팅도 자동으로 수행합니다. 유효한 모든 타이밍 신호가 NI-DAQmx 타이밍 함수의 소스 입력 목록에 나타납니다. 예를 들어, 다음 DAQmx 타이밍 VI에서 디바이스의 아날로그 출력 샘플 클럭 신호는 명시적 라우팅 없이도 아날로그 입력 채널의 샘플 클럭 소스로 나타납니다.


NI-DAQmx 타이밍 및 동기화 기능 문서에는 NI-DAQmx와의 동기화를 위해 NI-DAQmx 타이밍 기능을 사용하는 방법에 관한 추가 정보가 포함되어 있습니다.

대부분의 카운터 작업에서는 측정되는 신호가 타이밍을 제공하기 때문에 샘플 타이밍이 필요하지 않습니다. 이러한 어플리케이션에는 NI-DAQmx 타이밍 함수의 암시적 인스턴스를 사용해야 합니다. 다음 LabVIEW 블록 다이어그램은 NI-DAQmx 타이밍 VI의 암시적 인스턴스를 이용하여 버퍼형 펄스 폭 수집 태스크를 지정된 개수의 샘플로 한정되도록 설정하는 것을 보여줍니다.


.NET에서 태스크 타이밍 설정

샘플 클럭 소스, 샘플 클럭 속도, 수집하거나 생성할 샘플 수를 설정하려면 Channel.Timing.ConfigureSampleClock() 함수를 사용하십시오. 다음 코드 스니펫은 디바이스의 PFI 0에 연결된 외부 샘플 클럭을 기반으로 연속 수집 태스크를 생성합니다.

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock(

"/Dev1/PFI0", // 외부 클럭 소스 라인, 내부 클럭에는 “” 사용

10000, // 외부 클럭의 예상 속도 또는 내부 클럭의 실제 속도

SampleClockActiveEdge.Rising, // tick의 상승 또는 하강 에지에서 수집

SampleQuantityMode.ContinuousSamples, // 연속 또는 유한 샘플

1000 // 획득할 유한 샘플 수, 연속인 경우 버퍼 크기에 사용됨

);

 

C/C++에서 태스크 타이밍 설정

DAQmxCfgSampClkTiming 함수를 사용하여 C 또는 C++에서 태스크 타이밍을 설정하십시오. 다음 코드 스니펫은 10000Hz로 동작하는 내부 클럭으로 태스크 타이밍을 설정하는 예입니다.

char        clockSource[256] = "";
float64     rate = 10000;

DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);

 

특정 데이터 수집 디바이스는 디지털 I/O 작업의 타이밍 작업에 핸드셰이킹을 이용합니다. 핸드셰이킹은 각 샘플을 전송하기 위해 외부 디바이스와 요청 및 응답(ACK) 타이밍 신호 교환 기술을 사용합니다. NI-DAQmx 타이밍 함수의 핸드셰이킹 인스턴스는 디지털 I/O 작업을 위한 핸드셰이킹 타이밍을 설정합니다.

참고 예제:

LabVIEW Voltage - Continuous Output.vi
Counter - Read Pulse Width and Frequency (Finite).vi
CVI Cont Gen Volt Wfm-Ext Clk
Buff Semi-Period-Finite
.NET ContGenVoltageWfm_ExtClk
MeasBuffered_SemiPeriodFinite

 

NI-DAQmx 태스크 시작


라이브러리»NI-DAQmx»태스크 설정/컨트롤»태스크 시작 [CVI]

Task.Start 메소드 [.NET]


서문에서 언급했듯이 NI-DAQmx가 사용하는 상태 모델은 높은 수준의 효율성을 얻고 성능을 최대화하기 위해 불필요한 재구성을 제거합니다. 이 상태 모델은 태스크가 가질 수 있는 5가지 상태로 구성됩니다. 각 상태에 대한 자세한 정보는 NI-DAQmx 주요 개념≫NI-DAQmx의 채널 및 태스크≫NI-DAQmx 태스크≫태스크 상태 모델 아래의 NI-DAQmx 도움말에서 확인할 수 있습니다.

NI-DAQmx 태스크 시작 함수는 태스크를 실행 상태로 전환합니다. 실행 상태에서 태스크는 지정된 수집 또는 생성을 수행합니다. NI-DAQmx 읽기 함수가 실행될 때 NI-DAQmx 태스크 시작 함수가 사용되지 않으면 태스크가 암시적으로 실행 상태로 전환되고 시작됩니다. NI-DAQmx 태스크 시작 함수가 사용되지 않고 자동 시작 입력이 지정된 상태에서 NI-DAQmx 쓰기 함수가 실행되는 경우에도 이러한 자동 전환이 수행됩니다.

반드시 필요한 것은 아니지만, 하드웨어 타이밍 수집 또는 생성과 관련된 태스크는 NI-DAQmx 태스크 시작 기능을 사용하여 명시적으로 시작하는 것이 좋습니다. 또한 루프 내에서와 같이 NI-DAQmx 읽기 함수 또는 NI-DAQmx 쓰기 함수가 여러 번 실행될 경우에도 NI-DAQmx 태스크 시작 함수를 사용해야 합니다. 그렇지 않으면 태스크가 반복적으로 시작 및 중지되므로 태스크 성능이 저하됩니다. NI-DAQmx 태스크 시작 함수를 사용할 시점을 설명하는 추가 정보는 DAQmx 태스크 시작 및 DAQmx 태스크 중지 VI 사용 시기 문서에서 확인할 수 있습니다.

 

LabVIEW에서 태스크 시작

다음 LabVIEW 블록 다이어그램은 아날로그 출력 생성이 단일 소프트웨어 타이밍 샘플로만 구성되므로 NI-DAQmx 시작 함수를 사용할 필요가 없는 상황을 보여줍니다.


반대로, 다음 LabVIEW 블록 다이어그램은 NI-DAQmx 읽기 기능이 카운터에서 값을 읽기 위해 여러 번 실행되므로 NI-DAQmx 시작 기능을 사용해야 하는 상황을 보여줍니다.

 

.NET에서 태스크 시작

작업을 시작하려면 Task 객체에서 Start() 함수를 사용하십시오. 다음 코드 스니펫은 Start() 함수 사용 예를 보여줍니다.

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock( ... );

analogInTask.Start();

 

C/C++에서 태스크 시작

태스크를 시작하려면 DAQmxStartTask() 함수를 사용하십시오. 사용 예는 다음과 같습니다.

DAQmxStartTask(taskHandle);

 

참고 예제:

LabVIEW Counter - Continuous Output.vi
Current - Continuous Input.vi
CVI Dig Pulse Train-Cont
Cont 0-20mA Samps-Int Clk
.NET GenDigPulseTrain_Continuous
ContAcq0_20mACurrentSamples_IntClk

NI-DAQmx 읽기


라이브러리»NI-DAQmx»읽기 함수 [CVI]

ChannelReader 클래스 [.NET]



NI-DAQmx 읽기 함수는 지정된 수집 태스크에서 샘플을 읽습니다. 수집 유형(아날로그, 디지털 또는 카운터), 버추얼 채널 수, 샘플 수 및 선택할 데이터 유형을 선택할 수 있도록 여러 함수 인스턴스가 존재합니다. 지정된 개수의 샘플이 DAQ 보드의 FIFO에서 RAM의 PC 버퍼로 전송된 후, NI-DAQmx 읽기 함수는 샘플을 PC 버퍼에서 어플리케이션 개발 환경(ADE) 메모리로 이동합니다.

LabVIEW에서 데이터 읽기

다음 그림은 다양한 NI-DAQmx 읽기 VI 인스턴스를 사용하는 네 가지 예를 보여줍니다.


여러 샘플을 읽을 수 있는 NI-DAQmx 읽기 함수의 인스턴스는 함수가 실행될 때 읽을 채널당 샘플 수를 지정하는 입력을 포함합니다. 유한 수집의 경우, 채널당 샘플 수를 -1로 설정하면 요청된 모든 샘플이 수집될 때까지 기다린 다음 해당 샘플을 읽습니다. 연속 수집에서 채널당 샘플 수를 -1로 설정하면 함수가 실행될 때 버퍼에 존재하는 모든 샘플을 읽습니다. 다음 LabVIEW 블록 다이어그램은 NI-DAQmx 읽기 VI로 여러 아날로그 입력 버추얼 채널에서 여러 샘플을 읽고 데이터를 파형으로 반환하는 것을 보여줍니다. 그리고 채널당 샘플 수가 상숫값 10과 연결되어 있으므로 VI가 실행될 때마다 각 버추얼 채널에서 10개의 샘플을 읽습니다.

 

.NET에서 데이터 읽기

NI-DAQmx .NET 라이브러리로 데이터를 읽으려면 판독기(reader)와 스트림 객체를 사용하십시오. 이 프로그래밍 패턴은 파일 및 네트워크 I/O용 .NET 프레임워크 전체에서 사용되는 패턴과 유사합니다.

이 판독기와 스트림 클래스에는 I/O 관련 프로퍼티와 원시 I/O를 위한 메소드가 있습니다. 특정 태스크에 해당하는 DaqStream 클래스의 인스턴스를 가져오려면 프로퍼티를 사용하십시오. DaqStream 클래스의 인스턴스는 직접 인스턴스화할 수 없습니다.

NI-DAQmx 라이브러리에서 읽기를 수행하려면 판독기의 생성자에 DaqStream 클래스의 인스턴스를 전달하여 인스턴스를 생성하십시오. 그 후, 다음 코드 스니펫에서와 같이 판독기 클래스의 메소드를 호출하여 데이터를 읽으십시오.

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

//판독기를 생성하여 스트림에 연결
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);

//읽기 수행
double[] data = reader.ReadMultiSample(100);

 

C/C++에서 데이터 읽기
C 또는 C++로 아날로그 입력 태스크에서 아날로그 데이터를 읽으려면 DAQmxReadAnalogF64() 함수를 사용하십시오. 추가적인 읽기 기능은 NI-DAQmx C 참조 도움말에서 알아보십시오. 다음은 단일 채널에서 샘플 1,000개를 읽는 코드 스니펫 예입니다.

int numRead = 0;

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);

 

참고 예제:

LabVIEW Voltage - SW-Timed Input.vi
Digital - Finite Input.vi
CVI One Sample
Read Dig Chan
.NET AcqOneVoltageSample
ReadDigChan

 

NI-DAQmx 쓰기


라이브러리»NI-DAQmx»쓰기 함수 [CVI]

ChannelWriter 클래스 [.NET]





NI-DAQmx 쓰기 함수는 샘플을 지정된 생성 태스크에 씁니다. 생성 유형(아날로그 또는 디지털), 버추얼 채널 수, 샘플 수 및 선택할 데이터 유형에 따라 다른 함수 인스턴스를 사용할 수 있습니다. NI-DAQmx 쓰기 함수는 샘플을 어플리케이션 개발 환경(ADE) 메모리에서 RAM의 PC 버퍼로 이동합니다. 그 후 이 샘플은 생성될 수 있도록 PC 버퍼에서 DAQ 보드 FIFO로 전송됩니다. 

NI-DAQmx 쓰기 함수의 각 인스턴스에는 자동 시작 입력이 있으므로 태스크가 명시적으로 시작되지 않은 경우 함수가 암시적으로 태스크를 시작할지 여부를 결정할 수 있습니다. 본 문서의 NI-DAQmx 태스크 시작 섹션에서 설명했듯이, 하드웨어 타이밍을 사용하는 생성 태스크는 NI-DAQmx 태스크 시작 함수를 사용하여 명시적으로 시작되어야 합니다. NI-DAQmx 쓰기 함수가 여러 번 실행될 경우에도 성능을 최대화하려면 태스크 시작 함수를 사용해야 합니다.

LabVIEW에서 데이터 쓰기

다음 그림은 네 가지 예로 다양한 NI-DAQmx Write VI 인스턴스의 사용 예를 보여줍니다.


유한 아날로그 출력 생성을 위한 다음 LabVIEW 블록 다이어그램에서는 생성 작업이 하드웨어 타이밍을 이용하므로 NI-DAQmx 쓰기 VI의 자동 시작 입력에 "False" 불리언 상수가 연결되어 있습니다. NI-DAQmx 쓰기 VI는 하나의 채널에 대한 여러 아날로그 출력 데이터 샘플을 태스크에 아날로그 파형으로 쓰도록 설정되어 있습니다.


.NET에서 데이터 쓰기

NI-DAQmx .NET 라이브러리로 데이터를 쓰려면 작성기(writer) 및 스트림 객체를 사용하십시오. 이 프로세스는 위에서 설명한 데이터 읽기와 유사합니다.

쓰기를 수행하려면 생성자에 DaqStream 클래스의 인스턴스를 전달하여 작성기의 인스턴스를 만드십시오. 그 후 다음 코드 스니펫에서와 같이 작성기 클래스에서 메소드를 호출하여 데이터를 쓰십시오.

analogOutTask = new Task();

analogOutTask.AOChannels.CreateVoltageChannel( ... );

//작성기를 생성하여 스트림에 연결
AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream);

//쓰기 수행
double[] data = writer.WriteMultiSample(100);

 

C/C++로 데이터 쓰기
아날로그 데이터를 쓰려면 DAQmxWriteAnalogF64() 함수를 사용하십시오. 다른 형식의 데이터 작성에 대한 정보는 NI-DAQmx C 참조 도움말에서 알아보십시오. 다음은 아날로그 데이터 샘플 1,000개를 쓰는 코드 스니펫의 예입니다.

int written = 0;

DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);

 

참고 예제

LabVIEW Voltage - Finite Output.vi
Digital - Finite Output.vi
CVI Volt Update
Write Dig Chan
.NET GenVoltageUpdate
WriteDigChan

 

NI-DAQmx 완료 시까지 대기


라이브러리»NI-DAQmx»태스크 설정/제어»태스크 완료 시까지 대기 [CVI]

Task.WaitUntilDone 메소드 [.NET]


NI-DAQmx 완료 시까지 대기 함수는 태스크 종료 전 데이터 수집 작업이 완료되기를 기다립니다. 태스크가 중지되기 전에 지정된 수집 또는 생성 작업이 완료되도록 하려면 이 함수를 사용하면 됩니다. 가장 일반적으로, NI-DAQmx 완료 시까지 대기 함수는 유한한 태스크와 함께 사용됩니다. 유한 수집 또는 생성 태스크가 완료되면 이 함수의 실행이 끝나므로 태스크를 안전하게 종료할 수 있습니다. 또한 타임아웃 입력으로 최대 대기 시간을 지정할 수 있습니다. 이 시간 내에 수집 또는 생성이 완료되지 않으면 함수는 종료되고 알맞은 오류가 출력됩니다.

LabVIEW에서 완료 시까지 대기

다음 LabVIEW 블록 다이어그램에는 NI-DAQmx 완료 시까지 대기 VI를 사용하여 태스크를 지우기 전에 유한 디지털 출력 태스크가 완료되었음을 확인하는 방법을 보여줍니다.


.NET에서 완료 시까지 대기

.NET에서 이 함수를 사용하는 방법에 대한 자세한 내용은 GenMultVoltUpdates_IntClk 배포 예제를 참조하십시오.

C/C++에서 완료 시까지 대기

버퍼의 모든 샘플이 생성될 때까지 대기하려면 DAQmxWaitUntilTaskDone() 함수를 사용하면 됩니다. 쓰기 또는 시작 함수 후에 호출하십시오.

 

참고 예제

LabVIEW Digital - Finite Output.vi
Voltage - Finite Output.vi
CVI Dig Pulse
Mult Volt Updates-Int Clk
.NET GenDigPulse
GenMultVoltUpdates_IntClk

 

NI-DAQmx 태스크 지우기


라이브러리»NI-DAQmx»태스크 설정/제어»태스크 지우기 [CVI]

Task.Dispose Method [.NET]


 

NI-DAQmx 태스크 지우기 함수는 지정된 태스크를 지웁니다. 태스크가 현재 실행 중이면 이 함수는 먼저 태스크를 정지한 후 모든 리소스를 해제합니다. 태스크가 지워지고 나면 다시 생성하지 않는 한 해당 태스크를 사용할 수 없습니다. 따라서 태스크를 다시 사용해야 하는 경우 NI-DAQmx 태스크 정지 함수를 사용하여 태스크를 정지하되 지우지는 않아야 합니다.

지속적인 작업에서 실제 수집 또는 생성을 중지하려면 NI-DAQmx 태스크 지우기 기능을 사용해야 합니다.

LabVIEW에서 태스크 지우기

다음 LabVIEW 블록 다이어그램에서는 카운터를 사용하여 연속 펄스 트레인이 생성됩니다. 펄스 루프는 While 루프가 종료되고 NI-DAQmx 태스크 지우기 VI가 실행될 때까지 계속 출력됩니다.


.NET에서 태스크 지우기

태스크가 읽기 또는 쓰기를 마치면 Task.Dispose 메소드를 호출하십시오.

C/C++에서 태스크 지우기

태스크가 읽기 또는 쓰기를 마치면 DAQmxClearTask() 함수를 사용하십시오.

참고 예제

LabVIEW Voltage - Continuous Output.vi
Counter - Count Edges (Continuous Clock).vi
CVI Cont Gen Volt Wfm-Int Clk
Cnt Dig Events
.NET ContGenVoltageWfm_IntClk
CountDigEvents

 

NI-DAQmx 프로퍼티

속성 [CVI]

프로퍼티 [.NET]

NI-DAQmx 프로퍼티는 데이터 수집 작업과 관련된 모든 프로퍼티에 대한 액세스를 제공합니다. 이러한 프로퍼티는 NI-DAQmx 프로퍼티로 출력하여 설정할 수 있으며, 프로퍼티의 현재 값도 NI-DAQmx 프로퍼티에서 읽어서 얻을 수 있습니다.

앞에서 설명한 NI-DAQmx 함수들을 사용하여 많은 프로퍼티를 설정할 수 있습니다. 예를 들어 샘플 클럭 소스샘플 클럭 활성 에지 프로퍼티는 NI-DAQmx 타이밍 함수를 사용하여 설정할 수 있습니다. 그러나 자주 사용되지 않는 프로퍼티들은 NI-DAQmx 프로퍼티 노드를 통해서만 액세스할 수 있습니다.

LabVIEW에서 프로퍼티 사용하기(프로퍼티 노드)


LabVIEW에서는 하나의 NI-DAQmx 프로퍼티 노드로 여러 프로퍼티를 쓰거나 읽을 수 있습니다. 예를 들어, 다음 LabVIEW NI-DAQmx 타이밍 프로퍼티 노드는 샘플 클럭의 소스를 설정합니다. 그 후 샘플 클럭의 소스를 읽습니다. 마지막으로 샘플 클럭의 활성 에지가 설정됩니다.


다음 LabVIEW 블록 다이어그램은 NI-DAQmx 채널 프로퍼티 노드로 하드웨어 저역 통과 필터를 활성화한 다음 스트레인 게이지 측정에 사용할 필터 차단 주파수를 설정합니다.


 

.NET에서 프로퍼티 사용

위 타이밍 섹션에서 언급했듯이 Task 객체 내부의 하위 클래스 및 컬렉션에서 많은 프로퍼티가 설정됩니다. 다음 코드 스니펫은 NI-DAQmx의 일반적 프로퍼티 사용 예를 보여줍니다.

//새 NI-DAQmx 태스크 생성
Task t = new Task();

//Task 클래스의 하위 객체 프로퍼티에 액세스
t.Timing.SamplesPerChannel = 1000;

 

C/C++에서 프로퍼티 사용

태스크의 프로퍼티를 읽거나 쓰기 위해 각 프로퍼티에는 getter와 setter 함수가 있습니다. 추가적인 정보는 NI-DAQmx C 프로퍼티 항목 아래의 NI-DAQmx C 참조 도움말에서 프로퍼티와 함수 목록을 참조하십시오.

참고 예제

LabVIEW Strain - Continuous Input.vi
Thermocouple (with OTCD) - Continuous Input.vi
CVI Cont Strain Samples
Cont Accel Samps-Int Clk-Anlg Start
.NET AcqStrainSamples
ContAcqAccelSamp_IntClk_AnalogStart

 

결론

NI-DAQmx는 개발 시간은 줄이고 데이터 수집 어플리케이션의 성능은 향상합니다. NI-DAQmx가 개발 시간을 줄이는 방법 중 하나는 적은 수의 함수로 대부분의 기능을 제공하는 API입니다. 실제로 이 문서에서 설명한 10가지 함수만 배워도 데이터 수집 어플리케이션의 80%를 해결할 수 있습니다.