티스토리 뷰

랩뷰에서 DLL 사용하기


다른 텍스트 기반의 언어와 LabVIEW를 연동하는데 필요한 정보에 대해서 알아보도록 하겠습니다. 다른 텍스트 언어와 연동을 하기 위해서는 DLL 기반의 파일이 있어야 합니다. 그럼 DLL이란 무엇이까요?


DLL(Dynamic Linking Library)이란?


OS/2, 윈도즈 등의 운영 체계(OS) 본래 기능으로, 소프트웨어의 루틴을 몇 개의 파일로 나누어 디스크에 두고 필요한 것만을 실행 메모리에 실어서 사용하기 위한 파일. DLL로 사용되는 파일은 확장자가 ‘dll’로 되어 있기 때문에 ‘DLL 파일’이라고 부른다. DLL의 장점은 루틴을 공통으로 사용하는 것이다. 루틴의 함수 집단을 자료집이라고 하는데, 보통 실행 파일을 작성할 때 자료집을 포함해서 컴파일하는 경우가 많다. 그러나 이 방법은 동일 루틴을 다수의 실행 파일이 갖게 되어 비효율적이다. DLL은 다수의 실행 파일에 공유될 수 있기 때문에 디스크 용량이나 메모리를 절약할 수 있다. 또 프로그램을 수정하려는 경우, DLL 파일만을 수정함으로써 완료되는 경우도 있다. 윈도즈 등에서는 OS 기능은 물론 DLL을 애플리케이션과 공유할 수도 있으나, DLL 파일 등의 애플리케이션이 공유되고 있는지는 이용자 수준에서는 판단하기가 어렵다.

<출처 : IT용어사전, 한국정보통신기술협회>


이러한 DLL파일을 랩뷰에서는 어떻게 처리할 수 있을까요? 라이브러리 함수 호출 노드라는 녀석을 이용하게 되면 DLL 파일을 읽어 올 수 있습니다. 라이브러리 함수 호출 노드는 아래와 같이 생겼습니다. 


그럼 라이브러리 함수 호출 노드는 어디에서 찾을 수 있을까요? 블록 다이어그램에서 오른쪽 마우스 버튼을 누르시면 나오는 함수에서 연결-라이브러리 & 실행 파일 - 라이브러리 함수 호출 노드를 선택하시면 됩니다.



이제 DLL을 사용할 수 있는 조건을 만족되었습니다. 그럼 간략히 DLL 파일을 읽어와서 처리해보도록 하겠습니다.

블록 다이어 그램의를 더블 클릭합니다. 그러면 dll과 함수를 연결할 수 있는 다음과 같은 창이 뜨게됩니다.



사용자가 알아야 하는 부분은 빨간 네모 박스안의 라이브러리 이름 또는 경로와 함수 이름입니다.

  • 라이브러리 이름 또는 경로: dll 파일의 경로를 나타냅니다. "LabVIEW"라고 치시면 LabVIEW 내부의 함수들을 사용할 수 있습니다.
  • 함수 이름: dll 파일 혹은 라이브러리 이름에 포함된 함수를 지정할 수 있습니다.

1) 특정 자료형의 포인터 


먼저 자료형을 사용하기 위해서는 LabVIEW와 Text언어 사이의 데이터 타입이 어떻게 차이가 나는지 부터 확인해 보겠습니다. LabVIEW와 텍스트언어 사이의 데이터 타입의 차이는 다음과 같습니다. 


<출처 : ni.com>


그럼 아래의 함수처럼 정의된 dll을 어떻게 적용할 수 있는지 알아보도록 하겠습니다.

void plus_double(int x, int y, int* result); 


dll 파일을 선택하고 plus_double이라는 함수를 함수 이름에 찾습니다. 그리곤 파라미터 탭으로 넘어가서 아래의 버튼을 통해서 파라미터를 적용합니다. int x, int y는 파라미터의 데이터 타입에 32비트 부호 정수를 선택하면 됩니다. 



하지만 마지막 result는 Integer의 포인터입니다. 포인터를 넘기기 위해서는 전달이라고 되어 있는 부분에 "값의 포인터"로 변경을 하셔야 합니다.



자 이렇게 되면 dll에 대한 Import가 완료 되었습니다. 확인을 누르신 뒤 컨트롤과 인디케이터를 연결하여 테스트 해보시면 됩니다. 


2) 문자열


C언어에서 문자열은 char의 포인터 입니다. 그럼 char * 문자열을 어떻게 넘겨 받을 까요? 아래의 함수가 정의된 dll을 처리해보도록 하겠습니다. 아래의 그림처럼 설정을 하시면 됩니다.


void PassStringPointer(char * str); 


3) 구조체


구조체는 어떻게 처리할 수 있을 까요? 아래처럼 구성된 구조체를 다음과 같은 방식으로 처리가 가능합니다. 

typedef structure{

int x, int y, int radius

} circle;

void ProcessStructure(int x, int y, int radius, struct simpleStructCircle);



상세한 내용은 아래의 링크를 참조해주십시오.


이 글이 도움이 되셨나요?
그렇다면 아래의 그림을 클릭해주세요.



댓글