텍스트 기반 프로그래밍 환경에서 NI-DAQmx 사용하기

내용

개요

일반적으로 DAQmx를 사용한 데이터 수집 프로그래밍을 위해서는 다음 단계를 따라야 합니다.

  • 태스크 및 버추얼 채널 생성하기
  • 타이밍 파라미터 설정하기
  • 태스크 시작하기
  • DAQ에서 읽기 작업 수행하기
  • DAQ에 쓰기 작업 수행하기
  • 태스크 정지 및 지우기

텍스트 기반 프로그래밍 환경의 데이터 수집은 함수 호출이 NI-DAQmx VI와 동일하므로 LabVIEW NI-DAQmx 프로그래밍과 매우 유사합니다.

태스크 및 버추얼 채널 생성하기

버추얼 채널은 이름, 물리적 채널, 입력 터미널 연결, 측정이나 생성 타입과 같은 셋팅 모음이며 스케일링 정보를 포함할 수 있습니다.

태스크는 NI-DAQmx에서 중요한 개념으로, 타이밍, 트리거, 기타 프로퍼티를 가진 하나 이상 버추얼 채널의 모음입니다. 개념적으로 태스크는 수행하려는 측정 또는 생성을 나타냅니다. 아날로그 입력 및 출력, 디지털 입력 및 출력, 카운터 작업 등을 위한 태스크를 생성할 수 있습니다.

C에서 태스크 및 아날로그 입력 채널을 생성하려면 다음 함수를 호출하십시오.

DAQmxCreateTask("", &taskHandle));

DAQmxCreateAIVoltageChan (taskHandle, "Dev1/ai0", "Voltage", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL);

.NET에서 태스크 및 아날로그 입력 채널을 생성하려면 아래와 같이 태스크 객체를 생성한 뒤 채널을 생성하십시오.

analogInTask = new Task();
AIChannel myChannel;
myChannel = analogInTask.AIChannels.CreateVoltageChannel(
    "dev1/ai0", //채널의 물리적 이름
    "myChannel", //이 채널과 연관된 이름
    AITerminalConfiguration.Differential, //차동 와이어링
    -10, //10v 최소
    10, //10v 최대
    AIVoltageUnits.Volts //전압 사용

타이밍 파라미터 설정하기

NI의 데이터 수집 디바이스 대부분은 샘플 클럭을 사용하여 샘플 수집 및 생성 속도를 제어합니다. 이 샘플 클럭은 샘플 사이의 시간 간격을 설정합니다. 이 클럭의 tick이 발생할 때마다 채널당 하나의 샘플 수집 또는 생성이 시작됩니다.

소프트웨어에서 샘플 속도를 지정하여 간격(클럭이 신호를 수집 또는 생성하는 속도)을 지정할 수 있습니다. 신호에 적용하는 신호 컨디셔닝 또는 어플리케이션 내의 채널 개수를 조절하여 샘플 속도를 제한할 수도 있습니다.

C에서 타이밍 파라미터를 설정하려면 아래와 같이 DAQmxCfgSamp 함수를 호출하십시오.

DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising,

DAQmx_Val_FiniteSamps, 1000);

.NET에서 타이밍 파라미터를 구성하려면 아래와 같이 Task.Timing 프로퍼티를 사용하십시오.

analogInTask.Timing.ConfigureSampleClock(

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

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

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

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

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

);

NI-DAQmx가 제어하는 디바이스가 어떤 작업을 하면, 동작을 수행하는 것입니다. 가장 보편적인 동작 두 가지는 샘플 생성과 웨이브폼 수집 시작입니다. 모든 NI-DAQmx 동작에는 자극이나 원인이 필요합니다. 자극이 발생하면 동작이 수행됩니다. 동작의 원인은 트리거라고 불립니다. 수집을 시작하는 시작 트리거와 같이, 트리거의 이름은 발생시키는 동작을 따라 명명됩니다.

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

디바이스의 PFI 라인 0에서 들어오는 상승 디지털 신호에 대해 시작 트리거를 구성하려면 C에서 DAQmxCfgDigEdgeStartTrig 함수를 사용하십시오.

DAQmxCfgDigEdgeStartTrig (taskHandle, "PFI0", DAQmx_Val_Rising);

.NET에서 시작 트리거를 구성하려면 아래와 같이 Task.Triggers.StartTrigger 컬렉션에서 ConfigureDigitalEdgeTrigger를 사용합니다.

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

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

 

태스크 시작하기

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

C에서 태스크를 시작하려면 DAQmxStartTask 함수를 사용합니다.

DAQmxStartTask(taskHandle);

.NET에서 태스크를 시작하려면 Task.Start 함수를 사용합니다.

analogInTask.start();

 

읽기 또는 쓰기 작업

NI-DAQmx는 데이터 읽기 및 쓰기를 위한 여러 함수를 제공합니다. 대부분은 여러 옵션을 사용할 수 있습니다. 읽기 및 쓰기 함수에는 데이터 포맷데이터 구조라는 두 가지 주요 선택 기준이 있습니다. 데이터 포맷은 반환되는 데이터의 타입을 지정합니다. 예를 들어 카운터 읽기는 정수 또는 부동소수 포맷을 반환할 수 있습니다. 두 번째 카테고리인 데이터 구조는 데이터가 반환되는 구조를 다룹니다. 예를 들어 아날로그 읽기에는 다양한 배열 및 스칼라 조직이 있습니다.

데이터 처리에 따라 데이터가 수집되거나 생성될 수 있습니다. 수집 모드에서는 읽기 작업이 버퍼로부터 지정된 수의 샘플을 읽어야 합니다. 데이터 생성 모드에서는 샘플이 데이터 수집 보드 버퍼에 기록됩니다.

C에서 데이터를 읽으려면 DAQmxReadAnalog 함수 호출을 사용합니다.

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL)'

.NET에서 데이터를 읽으려면 ChannelReader 객체를 생성하여 Task.Stream에 바인딩한 후에 아래와 같이 읽기 함수를 호출합니다.

//판독기를 생성하여 스트림에 연결
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);
//읽기 수행
double[] data = reader.ReadMultiSample(100);

.NET에서 데이터 읽고 쓰기에 대한 더 자세한 정보는 NI-DAQmx .NET 2.0 Framework 도움말에서 "Reading and Writing with the NI-DAQmx .NET Library" 섹션을 참조하십시오.

 

태스크 정지 및 지우기

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

C에서 태스크를 정지하고 지우려면 다음 함수를 사용합니다.

DAQmxStopTask(taskHandle);

DAQmxClearTask(taskHandle);

.NET에서 태스크를 정지하고 지우려면 아래와 같이 Task.StopTask.Dispose 메소드를 사용합니다.

analogInTask.Stop();

analogInTask.Dispose();

DAQmx 어플리케이션 프로그래밍 인터페이스(API)

DAQmx에는 데이터 수집 프로그래밍에 필요한 API가 함께 제공됩니다. DAQmx API는 모든 데이터 수집 작업을 수행하는 방법에 대한 함수가 포함된 라이브러리 세트입니다. 이 API에는 LabWindows/CVI, C, C++, Visual Basic 6.0, VB.NET 및 C#에 대한 지원이 포함됩니다.

DAQmx API는 DAQmx 드라이버와 함께 설치되며 다음과 같은 참조 매뉴얼이 함께 제공됩니다.

  • NI-DAQmx C Reference 도움말
  • NI-DAQmx C API Visual Basic 6.0 도움말
  • NI-DAQmx .NET Framework 1.1 도움말(Visual Studio 2003)
  • NI-DAQmx .NET Framework 2.0 도움말(Visual Studio 2005)
  • NI-DAQmx .NET Framework 3.5 도움말(Visual Studio 2008)
  • NI-DAQmx .NET Framework 4.0 도움말(Visual Studio 2010)


이 모든 API에는 함수 및 클래스 라이브러리를 사용하여 NI 데이터 수집 (DAQ) 디바이스와 통신하고 디바이스를 제어하는 방법에 대한 자세한 정보가 포함되어 있습니다.

C에서 DAQmx 프로그래밍하기

다음은 NI 데이터 수집 보드를 사용하여 트랜스듀서에서 유한한 수의 전압 샘플을 얻기 위한 아날로그 입력 전압 작업의 예입니다.

********************************************************************************

#include <stdio.h>
#include <NIDAQmx.h>
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
       int32       error=0;
       TaskHandle  taskHandle=0;
       int32       read;
       float64     data[1000];
       char        errBuff[2048]={'\0'};

// DAQmx 아날로그 전압 채널 및 타이밍 파라미터

DAQmxErrChk (DAQmxCreateTask("", &taskHandle));

DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL));

DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000));

// DAQmx 시작 코드

DAQmxErrChk(DAQmxStartTask(taskHandle));

// DAQmx 읽기 코드

DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL));

// 태스크 정지 및 지우기

에러:
       if( DAQmxFailed(error) )
             DAQmxGetExtendedErrorInfo(errBuff,2048);
       if( taskHandle!=0 )  {
              DAQmxStopTask(taskHandle);
              DAQmxClearTask(taskHandle);
       }
       if( DAQmxFailed(error) )
              printf("DAQmx Error: %s\n",errBuff);
              return 0;
}

********************************************************************************

참고: DAQmx 라이브러리에 액세스하기 위해서는 main.c 프로그램에 NIDAQmx.h 헤더 파일을 포함시켜야 합니다. 

이 샘플 코드에서는 다음 함수가 태스크를 생성했습니다.

int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);

이 함수는 태스크에 이름을 지정하고 생성된 태스크 참조를 출력했습니다. 그런 다음 이 함수는 버추얼 전압 채널을 설정했습니다.

int32 DAQmxCreateAIVoltageChan (TaskHandle taskHandle, const char physicalChannel[], const char nameToAssignToChannel[], int32 terminalConfig, float64 minVal, float64 maxVal, int32 units, const char customScaleName[]);

이 함수 호출은 생성된 태스크에 대한 참조, 물리적 채널 이름, 버추얼 채널에 지정할 이름, 채널에 대한 입력 터미널 설정, 측정할 단위로 나타낸 최소 및 최대 값, 채널에 적용할 사용자 정의 스케일의 이름을 지정합니다.

버추얼 전압 채널을 설정한 후에는 샘플 클럭 설정 함수가 샘플링 속도, 샘플 모드 및 읽을 샘플의 수를 지정했습니다.

int32 DAQmxCfgSampClkTiming (TaskHandle taskHandle, const char source[], float64 rate, int32 activeEdge, int32 sampleMode, uInt64 sampsPerChanToAcquire);

샘플 모드는 DAQmx_Val_ContSamps 상수를 사용하여 연속으로 설정할 수도 있습니다. 전압 샘플 수집을 실제로 시작하려면 설정된 태스크에 대한 참조로 다음 함수를 호출해야 합니다.

int32 DAQmxStartTask (TaskHandle taskHandle);

DAQmxReadAnalogF64는 다음 함수 호출에서처럼 하나 이상의 아날로그 입력 채널이 포함된 태스크에서 여러 개의 부동소수 샘플을 읽습니다.

int32 DAQmxReadAnalogF64 (TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[], uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);

여기서는 1000개의 샘플을 읽은 뒤 수집된 샘플의 수와 동일한 크기의 배열에 썼습니다.

마지막으로 DAQmxStopTask 및 DAQmxClearTask가 태스크를 정지하고 DAQmxStartTask 호출 전의 상태로 되돌리며 태스크에 예약된 리소스를 해제합니다. 태스크를 지운 후에는 다시 생성하거나 다시 로드하지 않는 한 해당 태스크를 사용할 수 없습니다.

.NET에서 DAQmx 프로그래밍하기

Visual Basic 및 C#용 Microsoft .NET Framework DAQmx 라이브러리의 API를 사용하여 동일한 작업에 대한 유사 코드를 작성할 수 있습니다. 이 API에는 NI-DAQmx에 .NET 인터페이스를 제공하는 클래스, 대리자 및 열거형이 포함되어 있습니다. 매우 간단한 읽기 작업의 예제 코드는 아래와 같습니다.

********************************************************************************

// 채널 생성
   myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "", (AITerminalConfiguration)(-1), rangeMinimum, rangeMaximum,    AIVoltageUnits.Volts);

// 타이밍 스펙 설정
   myTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, samplesPerChannel);

// 태스크 확인
   myTask.Control(TaskAction.Verify);

// 데이터용 테이블 준비
   InitializeDataTable(myTask.AIChannels, ref dataTable);
   acquisitionDataGrid.DataSource = dataTable;

// 데이터 읽기
   reader = new AnalogMultiChannelReader(myTask.Stream);

// 태스크 지우기
   myTask.Dispose();

********************************************************************************

참고: 프로그램을 성공적으로 실행하려면 NationalInstruments.DAQmx 클래스 라이브러리가 포함되어야 합니다.

예제 코드

NI-DAQmx에는 각 프로그래밍 환경에 대한 예제 세트가 함께 제공됩니다.  다음 디렉토리 위치 중 하나에서 C API를 사용하여 예제를 찾을 수 있습니다.
<Program Files>\National Instruments\NI-DAQ\Examples\DAQmx ANSI C
또는
<Documents and Settings>\All Users\Documents\National Instruments\NI-DAQ\Examples\DAQmx ANSI C

.NET API의 경우 다음 디렉토리 위치 중 하나에서 예제를 찾을 수 있습니다.
C:\Program Files\National Instruments\MeasurementStudioVS2005\DotNET\Examples\DAQmx
또는
<Documents and Settings>\All Users\Documents\National Instruments\NI-DAQ\Examples\DotNET2.0

VB라는 폴더에는 Visual Basic .NET 예제가 있으며, CS라는 폴더에는 C# 예제가 있습니다.

Visual Basic 6.0 예제는 다음 디렉토리 위치 중 하나에서 찾을 수 있습니다.
<Program Files>\National Instruments\NI-DAQ\Examples\Visual Basic 6.0
또는
<Documents and Settings>\All Users\Documents\National Instruments\NI-DAQ\Examples\Visual Basic 6.0

NI-DAQmx 도움말 및 API 문서

NI-DAQmx 드라이버를 설치하고 C 및/또는 .NET 지원을 선택하고 나면 도움말 바로 가기를 시작 메뉴의 프로그램 ≫ National Instruments ≫ NI-DAQ ≫ 텍스트 기반 코드 지원에서 찾을 수 있습니다.

프로그램 ≫ National Instruments ≫ NI-DAQ 아래에 있는 NI-DAQmx 도움말에서는 NI-DAQmx 개념을 심도 있게 다루는 문서를 열람할 수 있습니다.