You are here

LabVIEW Tech-Tip 22호: NI-DAQmx 함수 10가지만 알면 데이터 수집 프로그래밍 80% 해결

 

개요

내쇼날인스트루먼트 데이터 수집 (DAQ) 하드웨어 사용자들은 NI-DAQmx가 출시된 이후 NI-DAQmx의 수많은 기능을 활용하여 데이터 수집 어플리케이션의 개발 시간은 줄이고 성능은 개선해왔습니다.

여러분들이 가장 많이 알고 있는 DAQmx 함수는 아마 DAQ 어시스턴트일 것입니다. 이 함수를 이용하면 데이터 수집 태스크의 복잡도에 관계없이 모든 설정을 프로그래밍 없이 그래픽 기반 인터페이스를 통해 생성하여 어플리케이션을 개발할 수 있습니다. 하지만 조금 더 성능이 좋고 유연한 프로그래밍을 하기 위해서는 DAQ 어시스턴트 외에 기본적인 DAQmx 함수를 사용해야합니다. 사실 10개의 NI-DAQmx 함수만 이용해도 데이터 수집 어플리케이션의 80%는 해결할 수 있기 때문에 이번 Tech-Tip에서는 데이터 수집을 위해서 필요한 기본적인 10개의 DAQmx 함수에 대해서 살펴보도록 하겠습니다. 

 

준비사항(자세히 보기)

  • 예제 탐색기
  • MAX에서 장비 시뮬레이션

 

본 Tech-Tip에서는 각 챕터별 마지막 부분에 참고 예제들이 기재 되었습니다. 이 참고 예제들은 예제 탐색기에서 찾으실 수 있습니다.

  • 예제 찾기: 도움말»예제 찾기»하드웨어 입력과 출력»DAQmx

 

참고:

예제를 사용하실 때 하드웨어가 없으실 경우 사용에 제약이 있을 수 있습니다. 이럴 경우 MAX를 실행하셔서 장비 시뮬레이션 기능을 사용하시면, 하드웨어 없이도 시뮬레이션 된 장비를 통해 예제를 실행해보실 수 있습니다.

 

장비 시뮬레이션 하는 방법:

1. MAX를 실행하고 내시스템>>디바이스와 인터페이스 를 클릭하고 마우스 오른쪽 버튼을 눌러 새로 생성을 클릭합니다. 팝업 된 새로 생성 창에서 시뮬레이션 DAQmx 디바이스를 클릭하고 다음을 클릭합니다.

2. NI-DAQmx 시뮬레이션 디바이스 생성 창에서 시뮬레이션 하고자 하는 하드웨어를 선택하고 확인을 클릭합니다. 여기에서는 NI cDAQ-9178을 선택하도록 하겠습니다.

3. 디바이스와 인터페이스에 새로 생성된 시뮬레이션 하드웨어의 확인합니다. 여기서 생성한 cDAQ-9178 장비의 경우 모듈형 데이터 수집을 위한 섀시일 뿐이므로, 그 안에 채워질 모듈을 선택하여 추가하기 위해 생성된 시뮬레이션 하드웨어를 클릭하고 마우스 오른쪽 버튼을 눌러 cDAQ 시뮬레이션 섀시 설정을 클릭합니다.

4. 섀시의 슬롯에 사용할 모듈들을 선택하여 시뮬레이션 장비를 구성합니다.본 Tech-Tip에서는 여러가지 예제를 실행하므로 각 케이스에 해당하는 모듈들을 선택합니다.

*9201: 아날로그 전압 입력 모듈
*9213: 열전쌍 모듈
*9234: 가속도 모듈
*9263: 아날로그 전압 출력 모듈
*9401: 디지털 입출력/카운터 모듈

 

시작하기

1. DAQ 어시스턴트: 설정 기반의 함수

 

DAQ 어시스턴트는 NI-DAQmx 버추얼 채널과 태스크를 인터랙티브하게 생성, 편집 및 실행하기 위한 그래픽 기반 인터페이스 함수입니다. DAQ 어시스턴트를 사용하게 되면 기본적으로 측정하고자 하는 물리량을 선택하고, 실제 측정하게 되는 DAQ 디바이스의 물리적 채널, 이 물리 채널에 대한 설정 정보 (예, 입력 범위와 맞춤 스케일링)을 설정할 뿐 만 아니라, 측정하고자 하는 타이밍 및 트리거링 정보, 샘플링 속도 등을 설정을 하여 측정을 할수 있도록 돕는 편리한 함수입니다. 또한, 기본적인 센서 연결 방법과 실제 데이터 수집 미리 보기 등 다양한 기능을 제공하여 더욱 편리한 데이터 수집이 가능하도록 하고 있습니다. 

아래 그림에서 DAQ 어시스턴트는 스트레인의 유한 측정을 수행하도록 설정되어 있습니다.

 
DAQ 어시스턴트는 설정한 데이터 수집 또는 데이터 생성에 대한 설정을 완료한 후 실제 어플리케이션으로도 사용이 가능할 뿐 아니라, 추가적인 고급 기능이 필요할 경우, 기존의 설정하였던 내용들을 DAQmx 기본 API로 자동 코드 생성이 가능합니다. 아래 그림은 DAQ 어시스턴트의 인스턴스와 자동 생성된 설정과 LabVIEW 코드의 예를 보여줍니다.

 

코드생성은 DAQ 어시스턴트에서 마우스 오른쪽 메뉴를 클릭하여 DAQmx 코드생성을 클릭하면 간단하게 생성할 수 있습니다. 일반적으로 DAQ 어시스턴트가 제공하는 기본적인 기능 이상의 유연성 및 성능이 필요로 하기 때문에, 이 DAQmx 함수로 생성된 코드를 수정하여 조금 더 고급 기능의 데이터 수집 어플리케이션으로 활용이 가능합니다. 

 

 

2. NI-DAQmx 버추얼 채널 생성

 
NI-DAQmx 버추얼 채널 생성 함수는 버추얼 채널을 생성에 필요한 설정들을 입력 받는 함수입니다. 필요한 입력으로는 측정하는 물리량이 연결된 물리적 채널의 정보가 필수적으로 필요하며, 나머지 값들은 설정이 되지 않을 경우 기본값이 적용됩니다. 이 함수는 여러 버추얼 채널들을 생성하고 모든 채널을 태스크에 추가하는 데 사용할 수도 있습니다. 태스크가 지정되지 않았을 경우에는 함수가 자동으로 태스크를 생성합니다. 

NI-DAQmx 버추얼 채널 생성 함수는 측정하는 데이터 타입이나 물리량에 따라 다양한 인스턴스를 가지고 있습니다. 즉 인스턴스들은 특정한 측정 유형 또는 생성 유형이라고 생각하시면 됩니다.

 

LabVIEW에서 채널 생성

아래 그림은 NI-DAQmx 버추얼 채널 생성 VI의 4가지 다른 인스턴스 예들을 보여주고 있습니다. 

 

NI-DAQmx 버추얼 채널 생성 함수의 입력들 중에 특정 입력들은 공통적이지만, 일반적으로 함수에서 선택되는 각 인스턴스에 따라 자동으로 변경됩니다. 예를 들어, 아날로그 입출력, 카운터 연산은 신호의 예상되는 최소 및 최대 값을 기초로 측정과 생성을 설정하고 최적화합니다. 또한 맞춤 스케일을 여러 유형의 버추얼 채널에 적용할 수 있습니다. 그리고, 아날로그 입력의 가속도계의 경우, 센서의 민감도, 구동전류 값의 입력이 추가적으로 존재합니다. 이와 같이 생성하는 인스턴트에 따라 다양한 입력이 존재하므로, 제대로 된 인스턴트를 선택 후, 해당하는 터미널에 정확한 입력을 입력해 주면 됩니다.

아래 그림은 NI-DAQmx 버추얼 채널 생성 VI는 열전쌍 버추얼 채널을 생성하는 데 사용한 사례입니다. 추가적으로 CJC 관련 항목과, Thermocouple type 등의 입력이 존재하는 것을 확인하실 수 있습니다.

 
참고 예제:

  • 디지털 생성>>Write Dig Port.vi
  • 아날로그 측정>>온도>>Cont Acq Thermocouple Samples-Int Clk.vi

 

 

3. NI-DAQmx 트리거

NI-DAQxm 트리거 함수는 특정 작동을 수행하도록 트리거 관련 설정을 하는 함수입니다. 가장 일반적으로 사용되는 트리거의 종류는 바로 시작 트리거와 참조 트리거입니다. 시작 트리거는 특정한 상황에서 수집이나 생성을 동작을 개시하는 트리거이며, 참조 트리거는 한 세트의 수집된 샘플에서 위치를 설정하여, 설정한 트리거 위치 이전 데이터와, 이후 트리거를 설정하는 트리거입니다. 두 트리거들은 디지털 에지와 아날로그 에지에서 발생하도록 설정할 수 있으며 또는 아날로그 신호가 윈도우로 들어가거나 나올 때 발생하도록 설정할 수 있습니다.

 

LabVIEW에서 트리거 생성

아래 LabVIEW 블록 다이어그램에서는 NI-DAQmx Trigger VI를 이용하여 아날로그 데이터 수집을 디지털 에지를 받아 시작하고, 특정 신호를 받았을 때, 참조 트리거도 동시에 사용할 수 있는 트리거를 설정한 VI 예제 그림입니다.

 
여러 개의 장비가 동시에 사용될 경우, 트리거 신호가 자신의 시스템이 아닌 다른 장비에서 발생한다고 가정한다면 어떻게 될까요? 예전의 경우 이럴때는 각 디바이스간 신호의 라우팅이 필요했습니다. 하지만, NI-DAQmx에서는 이 라우팅을 자동으로 수행하여, NI-DAQmx 트리거 함수를 이용할 때 모든 유효한 트리거 신호들을 특별한 라우팅 없이 함수의 소스 입력으로 사용 가능합니다. 예를 들어, 아래 NI-DAQmx Trigger VI에서 cDAQ 2에 대한 시작 트리거 신호를 어떤 특정한 라우팅 작업을 하지 않고도 cDAQ 1에서 시작 트리거 소스로 설정하여 사용이 가능합니다.

 
참고 예제:

  • 아날로그 측정>>전압>>Acq&Graph Voltage-Int Clk-Dig Start&Ref.vi
  • 아날로그 측정>>전압>>Cont Acq&Graph Voltage-Int Clk-Analog Start.vi

 

 

4. NI-DAQmx 타이밍

 

NI-DAQmx 타이밍 함수는 하드웨어에 대한 타이밍을 설정하는 함수합니다. 이 함수에는 태스크를 연속으로 할지 유한 실행할 지와 샘플링 속도, 수집/생성할 샘플 수, 버퍼 크기 등의 설정에 관련된 입력이 포함됩니다.

특히, NI-DAQmx 타이밍 함수 중 샘플 클럭 인스턴스에서 가장 중요한 설정은 샘플 클럭의 소스 (내부 또는 외부)와 클럭의 속도입니다. 샘플 클럭은 샘플이 수집되거나 생성되는 속도를 제어하므로, 실제 작업의 성능을 제어하며, 입력은 측정하는 하드웨어의 스펙의 한도 내에서만 설정이 가능합니다. 

 

LabVIEW에서 태스크 타이밍 설정

아래 LabVIEW 블록 다이어그램은 NI-DAQmx 타이밍 VI의 샘플 클럭 인스턴스를 사용하여 내부 샘플 클럭으로 연속 아날로그 출력 신호 생성을 설정하였습니다. 외부 소스로 클럭소스를 연결하게 되면 외부 클럭을 기준으로 한 데이터 생성도 가능합니다.

 
외부 클럭을 샘플 클럭 소스로 사용하게 될 경우 이전에는 트리거와 마찬가지로 신호 라우팅이 필요했지만, NI-DAQmx는 이 라우팅을 자동으로 수행하여, 모든 유효한 타이밍 신호들을 NI-DAQmx 타이밍 함수의 소스 입력으로 사용할 수 있습니다. 예를 들어, 아래 DAQmx 타이밍 VI에서 디바이스의 아날로그 출력 샘플 클럭 신호는 특정한 라우팅이 수행되지 않았어도 아날로그 입력 채널에 대한 샘플 클럭 소스로 사용이 가능합니다.

 
대부분의 카운터 연산에는 샘플 타이밍이 필요하지 않습니다. 그 이유는 측정 중인 신호가 타이밍을 제공하지 않기 때문입니다. NI-DAQmx 타이밍 함수의 암시적 인스턴스는 이러한 어플리케이션에 사용되어야 합니다. 아래 LabVIEW 블록 다이어그램에서 NI-DAQmx Timing VI의 암시적 인스턴스는 버퍼된 펄스 폭 수집이 지정된 샘플 개수만큼 유한하도록 설정하는 데 사용된 예제를 보여주고 있습니다.(인스턴트에서 암시적(카운터)를 설정하게 되면 내부적으로 나타납니다.)

 

참고 예제:

  • 아날로그 생성>>전압>>Cont Gen Voltage Wfm-Ext Clk.vi
  • 카운터 측정>>주기 또는 펄스 폭>>Meas Buffered Semi-Period-Finite.vi

 

 

5. NI-DAQmx 태스크 시작

 
NI-DAQmx 시작 트리거 함수는 해당 태스크를 실행 상태로 분명히 전환하여, 태스크를 기존에 설정한 설정대로 데이터 수집 또는 생성을 수행합니다. 기본적으로 LabVIEW에는 5개의 태스크 상태모델이 존재하는데, DAQmx 태스크 시작 함수는 태스크는 암시적으로 실행 상태로 전환하는 역할을 한다. 때때로, NI-DAQmx 시작 트리거 함수가 사용하지 않더라도, NI-DAQmx 읽기/쓰기 함수를 실행한다면, 자동으로 실행상태로 전환됩니다.  

 
NI-DAQmx 시작 태스크 함수가 항상 필요한 것은 아니지만 명확한 태스크의 실행을 위해 하드웨어 타임 수집 또는 생성과 관련된 태스크를 명시하는 것이 좋습니다. 또한 NI-DAQmx 읽기 함수 또는 NI-DAQmx 쓰기 함수가 여러 번 실행될 경우 (예, 루프에서), NI-DAQmx 시작 태스크 함수 또한 사용되어야 합니다. 그렇지 않을 경우, NI-DAQmx 읽기/쓰기 함수가 실행될 때 마다, 루프가 반복될때마다, 태스크가 시작되고 정지되는 과정을 반복하게 되므로 태스크 성능이 저하될 것입니다. 그러므로, NI-DAQmx 시작 태스크 함수는 항상 명확하게 사용해주는 것이 좋습니다.

 

LabVIEW에서 태스크 시작

아래 LabVIEW 블록 다이어그램은 아날로그 출력 생성이 단일 소프트웨어 타임 샘플로만 이루어져있어 NI-DAQmx 태스크 시작 함수가 사용될 필요가 없는 상황을 보여주고 있습니다.

 

반대로 아래 LabVIW 블록 다이어그램은 NI-DAQmx 읽기 함수가 여러 번 실행되어 카운터로부터 읽어 NI-DAQmx 시작 함수가 사용되어야 하는 상황을 나타냅니다. 만약 DAQmx 태스크 시작함수가 존재하지 않는다면, 위에서 언급한 것처럼 루프가 실행되어 DAQmx 읽기 함수가 실행될 때 마다 태스크는 시작, 정지를 반복하게 되어 어플리케이션의 성능을 저하시킬 될 것입니다.

참고 예제:

  • 디지털 펄스 생성하기>>Gen Dig Pulse Train-Continuous.vi

 

 

6. NI-DAQmx 읽기

NI-DAQmx 읽기 함수는 지정된 수집 태스크로부터 샘플을 읽어올 때 사용하는 함수입니다. 함수의 각각의 인스턴스들은 수집 유형 (아날로그, 디지털 또는 카운터), 버추얼 채널의 개수, 샘플의 개수, 읽어올 데이터 유형을 설정합니다. 지정된 샘플 개수 만큼의 데이터가 DAQ 보드의 FIFO에서 PC 버퍼인 RAM으로 전송되면, NI-DAQmx 읽기 함수는 PC 버퍼의 샘플을 ADE (Application Development Environment) 메모리로 이동시키는 동작을 수행합니다.

 

 

LabVIEW에서 데이터 읽기

아래 그림은 NI-DAQmx Read VI의 4가지 다른 인스턴스 예들을 보여줍니다.

 
NI-DAQmx 읽기 함수의 인스턴스들에는 함수가 실행되었을 때, 데이터를 읽어오기 위해 채널당 샘플 개수를 지정하는 입력이 포함되어 있습니다. 유한 수집일 경우 채널당 샘플 개수를 -1로 지정하면, 태스크에서 요청된 모든 샘플이 수집될 때까지 기다렸다가 끝나게 되면 이 샘플들을 읽어옵니다. 연속 수집일 경우 채널당 샘플 개수를 -1로 지정하면, 함수가 실행될 때 버퍼에서 현재 사용 가능한 모든 샘플을 읽게 됩니다. 

아래 LabVIEW 블록 다이어그램에서 NI-DAQmx 읽기 VI는 여러 개의 아날로그 입력 채널에서 여러 개의 샘플을 읽고 데이터를 웨이브폼으로 반환하도록 설정되었습니다. 또한 채널당 샘플 개수 입력은 상수 값 10에 와이어로 연결되었으며, DAQmx 읽기 VI가 실행될 때마다 각 채널로부터 10개의 데이터 샘플을 읽어오게 됩니다.

 

참고 예제:

  • 아날로그 측정>>천천히 변하는 전압 신호>>Acq One Sample.vi
  • 디지털 측정>>Read Dig Chan.vi

 

 

7. NI-DAQmx 쓰기

 
NI-DAQmx 쓰기 함수는 지정된 생성 태스크에 샘플을 쓰는 함수입니다.

함수의 각각의 인스턴스들은 생성 유형 (아날로그 또는 디지털), 채널수, 샘플 개수, 선택할 데이터 유형 등을 입력 받아 동작을 수행합니다. NI-DAQmx 쓰기 함수는 ADE 메모리의 샘플을 PC 버퍼인 RAM으로 이동시킵니다. 그 다음 이 샘플들은 실제 생성을 위해 PC 버퍼에서 DAQ 보드 FIFO로 전송됩니다.

NI-DAQmx 쓰기 함수의 각 인스턴스는 자동 시작 입력을 가지고 있어서, 아직 분명히 시작되지 않았을 경우, 함수가 분명히 태스크를 실행할지 결정하게 됩니다. NI-DAQmx 시작 태스크에서 언급했듯이, NI-DAQmx 시작 태스크 함수는 하드웨어 타이밍을 사용하는 생성 태스크를 명시적으로 시작하기 위해 사용됩니다. 또한 이 함수는 NI-DAQmx 쓰기 함수가 여러 번 실행될 경우 성능을 극대화하기 위해 사용됩니다.

 

LabVIEW에서 데이터 쓰기

아래 그림은 NI-DAQmx Write VI의 4가지 다른 인스턴스 예를 보여줍니다.

 
아래 LabVIEW 블록 다이어그램은 유한 아날로그 출력 생성 예제로서 데이터 생성이 하드웨어 타임이기 때문에 NI-DAQmx Write VI의 자동 시작 입력에 “거짓” 불리언 상수가 연결되어 있고, DAQmx 태스크 시작 함수가 연결되어 있습니다. 또한 NI-DAQmx Write VI는 태스크에 각각의 채널에 대해서 여러 개의 데이터 출력을 쓰도록 설정되어 있습니다.

참고 예제:

  • 아날로그 생성>>전압>>Gen Voltage Update.vi
  • 디지털 생성>>Write Dig Chan.vi

 

 

8. NI-DAQmx 완료될 때까지 기다림

 
NI-DAQmx 완료될 때까지 기다림 함수는 데이터 수집 실행이 완료될 때까지 기다립니다. 이 함수는 태스크가 정지하기 전에 지정된 수집 또는 생성을 완료하는지를 확인하기 위해 사용됩니다. 그래서 NI-DAQmx 완료될 때까지 기다림 함수는 일반적으로 유한 수집에 사용됩니다. 이 함수가 실행을 완료하게 되면, 유한 수집 또는 생성이 완료되고 태스크는 연산을 방해하지 않고 정지할 수 있습니다. 또한 타임아웃 입력은 최대 대기 시간을 지정할 수 있어서, 데이터 수집 또는 생성이 설정한 시간 내에 완료되지 않을 경우, 함수는 종료되고 에러를 발생시킵니다.

 

LabVIEW에서 완료될 때까지 기다리기

NI-DAQmx 완료될 때 까지 기다림 VI는 아래 LabVIEW 블록 다이어그램처럼 태스크가 정리되기 전에 유한 아날로그 출력 연산이 완료되는지 확인하는 데 사용됩니다.

참고 예제:

  • 디지털 펄스 생성하기>>Gen Dig Pulse.vi
  • 아날로그 생성>>전압>>Gen Mult Volt Updates-Int Clk.vi

 

 

9. NI-DAQmx 태스크 지우기

 

NI-DAQmx 태스크 지우기 함수는 지정된 태스크를 메모리에서 지우는 함수입니다. 태스크가 현재 실행 중일 경우, 함수는 태스크를 정지한 다음 모든 리소스를 해제시킵니다. 태스크가 지워지면, 다시 생성하지 않는 한 사용할 수 없습니다. 따라서 태스크가 다시 사용될 필요가 있을 경우, 태스크를 지우지 않고, 정지만 하는 NI-DAQmx 태스크 정지 함수를 사용해야 합니다.

 

LabVIEW에서 태스크 지우기

아래 LabVIEW 블록 다이어그램에서 연속 펄스 트레인은 카운터로 생성되고 있습니다. 펄스 트레인은 While 루프가 구동되고 NI-DAQmx 태스크 지우기 VI가 실행되지 전까지는 계속해서 출력됩니다.

참고 예제:

  • 아날로그 출력>>전압>>Cont Gen Voltage Wfm-Int Clk.vi
  • 카운터측정>>디지털 이벤트 카운트>>Count Digital Events.vi

 

 

10. NI-DAQmx 프로퍼티

 

NI-DAQmx 프로퍼티는 데이터 수집과 관련된 모든 설정에 프로그램적으로 접근할 수 있습니다. 이 NI-DAQmx 프로퍼티에 써서 설정이 가능하며 현재 프로퍼티 값을 읽어 올 수도 있습니다.

하지만, 일반적으로 자주 사용하는 프로퍼티들의 경우에는 앞에서 언급한 NI-DAQmx 함수들의 입력을 통해서 설정이 가능합니다. 예를 들어, 샘플 클럭 소스 및 샘플 클럭 활성 에지 프로퍼티들은 NI-DAQmx 타이밍 함수를 이용하여 설정 가능합니다. 하지만 일부 자주 사용하지 않는 프로퍼티들은 NI-DAQmx 프로퍼티를 통해서만 접근 가능합니다.

 

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

LabVIEW에서 하나의 NI-DAQmx 프로퍼티 노드는 여러 프로퍼티들을 쓰고, 읽는데 사용할 수 있습니다. 예를 들어, 아래 LabVIEW NI-DAQmx 타이밍 프로퍼티 노드의 경우는 샘플 클럭의 소스를 설정하고, 그 다음 샘플 클럭의 소스가 읽어오며, 마지막으로 샘플 클럭의 활성 에지가 설정하도록 한 것입니다.

 

아래 LabVIEW 블록 다이어그램에서 NI-DAQmx 채널 프로퍼티노드는 하드웨어 저대역 필터를 활성화하고 필터 컷오프 주파수를 설정하는데 사용한 것입니다. 

참고 예제:

  • 아날로그 측정>>변형율>>Cont Acq Strain Samples.vi
  • 아날로그 측정>>가속도>>Cont Acq Accel Samples-Int Clk-Analog Start.vi

 

 

결론

NI-DAQmx를 잘 활용하게 되면, 데이터 수집 어플리케이션의 개발 시간은 줄이고 성능은 향상시킬 수 있습니다. 물론 위에서 언급한 기본적인 함수 외에도 많은 고급 기능들이 존재하지만, 본 Tech-Tip에서 소개된 10가지의 기본 함수들만 잘 인지하고 배워둔다면, 데이터 수집 어플리케이션들 중 80% 정도는 무난하게 해결할 수 있을 것입니다. 특히 참고 예제들 이외 다양한 예제들을 참고한다면, 더욱 편리한 개발이 가능합니다.