You are here

LabVIEW Tech-Tip 3호 - VI 서버(VI Server)

 

VI 서버란 컴퓨터 내의 LabVIEW VI이나 실행파일을 프로그램적으로 제어하는 기술입니다. 이 기술은 로컬 컴퓨터뿐에서만 아니라 원격 컴퓨터의 VI 및 실행파일에도 접근할 수 있는 고급 프로그래밍 기법입니다. VI 서버는 Functions 팔레트에 위치한 VI 서버 전용 함수를 사용하거나 ActiveX 컨트롤을 사용해 LabVIEW의 속성에 접근합니다. VI 서버 기술을 효과적으로 활용하기 위한 접근법을 소개합니다.

 >> 예제 코드 다운로드                                                                                                                           LabVIEW Tech-Tip 목록 보기 

 
VI 서버란 무엇인가?

VI 서버란 컴퓨터 내의 LabVIEW VI이나 실행파일을 프로그램적으로 제어하는 기술입니다. 이 기술은 로컬 컴퓨터뿐에서만 아니라 원격 컴퓨터의 VI 및 실행파일에도 접근할 수 있는 고급 프로그래밍 기법입니다. VI 서버는 Functions 팔레트에 위치한 VI 서버 전용 함수를 사용하거나 ActiveX 컨트롤을 사용해 LabVIEW의 속성에 접근합니다. VI 서버 기술을 효과적으로 활용하려면 객체 지향 프로그래밍 개념을 먼저 숙지하는 것을 권장합니다.

언제 VI 서버를 사용하는가?

VI 서버는 로컬이나 원격 컴퓨터에 위치한 VI이나 실행파일의 속성에 프로그램적인 접근이 필요한 경우에 사용됩니다. 예를 들자면, 서울에서 근무 중인 철수가 대구에 거주하시는 부모님의 비닐하우스에 내부 온도를 모니터링 하고 적정한 온도로 제어해야 하는 경우에 사용될 수 있습니다. 비닐하우스에는 LabVIEW가 탑재된 컴퓨터, 온도제어 어플리케이션 프로그램, 온도 센서, 자동제어 난방기 등이 존재할 것입니다. 철수는 VI 서버 기술을 통해 자신의 컴퓨터에서 대구 비닐하우스의 컴퓨터에 vi를 수행시켜 난방기를 제어하게 됩니다. 마찬가지로 로컬 컴퓨터에서도 A라는 어플리케이션 소프트웨어로 B, C, D라는 프로그램의 속성에 접근할 수 있습니다.

VI 서버를 위한 기본기

VI 서버를 사용하기 위해서는 팔레트 내에 VI 서버 함수의 위치와 각 함수의 역할에 대한 숙지가 요구됩니다. 아래 3가지 핵심 함수와 3가지 노드의 특성을 파악합니다.

 

그림 1. Functions 팔레트 내의 VI 서버 함수의 위치

[핵심함수01] Open Application Reference

VI 서버 어플리케이션에 반드시 사용되는 함수는 아니지만 원격의 컴퓨터에 위치한 vi를 구동할 때는 필수인 함수입니다. Machine Name에는 원격에 위치한 컴퓨터의 주소가 문자열 형태로 기입됩니다. 예를 들어, 원격의 어플리케이션에서는 상대 컴퓨터의 IP (예: 130.164.15.250) 또는 도메인 명칭 (예: foo.ni.com)을 기입하고 로컬의 어플리케이션에서는 빈 문자열로 남깁니다. Port number는 3363이 디폴트 값으로 지정됩니다. 이 함수는 다음 연결될 VI 서버 함수에 application reference 값을 반환합니다.

 

[핵심함수02] Open VI Reference

VI 서버 어플리케이션에는 반드시 사용되는 함수며 디스크 상의 위치 경로로 vi path에 지정된 VI, 사용자 정의 컨트롤, 또는 글로벌 변수의 레퍼런스(reference)를 변환합니다. Application reference 터미널에 와이어링이 연결되지 않으면 자동적으로 로컬 컴퓨터의 vi를 참조합니다. (참고: 출력 값인 vi reference를 strictly typed VI reference로 출력하려면 type specifier VI Refnum 터미널에 원하는 형태의 VI reference control 또는 상수를 연결해야 합니다.)

 [핵심함수03] Close Application or VI Reference 

VI 서버 어플리케이션의 최종단에 위치하는 함수로 어플리케이션을 종료하기 전에 실행파일 또는 VI의 참조를 종료시킵니다.

 

[핵심노드01] Call By Reference Node 

Call By Reference Node는 VI를 호출할 때 사용된다는 점에서 SubVI 노드와 유사합니다. Reference 터미널이 연결되면 본 노드의 입출력은 해당 객체와 동일한 커넥터 팬을 갖게 됩니다. 따라서 노드 하단에 나타나는 입출력 터미널을 통해 데이터 전달이 수행됩니다. 여기서 Call By Reference Node의 특징은 사용자가 원하는 SubVI를 다이내믹하게 불러들여 활용하고 사용이 끝나면 처분시켜 메모리의 사용을 효과적으로 유지할 수 있는 점입니다.

▶예제 1: 예제 파일 폴더 내의 Call By Reference 예제 폴더로 이동합니다. 여기서 SubVIs.llb 라이브러리를 C 드라이브(C:\)에 복사합니다. 본 예제에서 Open Application Reference 함수의 역할은 미세하므로 추가 설명은 없습니다. Open VI Reference 함수의 vi path 터미널에는 SubVIs 라이브러리의 경로가 입력됩니다. 그리고 type specifier VI Refnum 터미널에는 SubVI Type Def 컨트롤()이 위치합니다. 본 컨트롤을 제작하려면 Controls 팔레트 >> Refnum 팔레트의 VI Refnum을 프런트 패널에 위치시킵니다. 오른 마우스 클릭 후 Select VI Server Class >> Browse…를 선택하고 Call By Reference로 불러드릴 SubVI를 선택하면 SubVI의 커넥터 팬대로 컨트롤의 모양이 변경됩니다. 그런 다음 Call By Reference Node를 연결하면 자동으로 입출력 터미널이 생성됩니다. 마지막으로 Open Application Reference 함수와 Open VI Reference 함수를 Close Reference 함수로 종료시킵니다.

 

그림 2. Call By Reference Node 소개 예제

 

[핵심노드02] Property Node 

레퍼런스 객체의 속성을 읽어오거나 변경하기 위해 사용되는 노드입니다. Application 클래스 또는 VI 클래스 VI 클래스를 선택하려면 오른 마우스 클릭 후 Select Class >> VI Server에서 Application 또는 VI를 선택합니다. 그러면 연결된 레퍼런스에 따라 메뉴가 변경됩니다. 이 밖에도 VISA나 ActiveX의 속성에 접근하기 위한 메뉴도 제공됩니다.

 

그림 3. Property Node가 제공하는 다양한 메뉴들

 

[핵심노드03] Close Application or VI Reference 

Invoke Node는 VI 또는 어플리케이션 객체의 method(동작)를 제어합니다. 따라서 method는 객체에 대한 매개 변수를 갖게 되며 Open VI Reference 함수의 출력 값인 레퍼런스를 연결하면 관련된 매개 변수가 method 이름 아래 정렬됩니다. 희색 바탕의 매개 변수는 필수 입력이고 회색 바탕의 매개 변수는 권고 입력을 의미합니다.

▶예제 2: 예제 파일 폴더 내의 팝업 제어 예제 폴더로 이동합니다. Bring Forward.vi와 Server SubVI.vi를 모두 띄웁니다. 메인 vi는 Bring Forward.vi로 아래 그림과 동일합니다. 그림 4의 1번 구간은 현 vi의 경로를 읽어와 Open VI Reference 함수에 입력시킵니다. 2번 구간은 그림 3처럼 노드 VI로 선정한 다음 다시 오른 마우스 클릭하여 Properties >> Front Panel Window >> Is Frontmost를 선택하면 선정되며 데이터를 받아드려야 하므로 다시 오른 마우스 클릭해 Change to Write을 선택합니다. 이렇게 Property Node는 LabVIEW의 객체의 속성을 변경할 때 사용됩니다. 그림 4의 3번 구간은 Invoke 노드를 사용하였습니다. Method의 매개 변수를 나타내기 위해서는 2번 구간의 출력 값을 입력 받아야만 합니다. 자동으로 vi를 수행하는 method를 선택하려면 오른 마우스 클릭 후 methods >> Run VI를 선택합니다. 즉, 2번 Property Node는 SubVI의 프런트 패널을 가장 앞으로 가져오는 역할을 수행하며 3번 Invoke Node는 SubVI를 실행시킵니다. 여기서 SubVI가 수행되고 핸들(프로그램 제어권)을 돌려받기 위해서는 Wait until done에 False 상수를 연결합니다. True 상수를 연결할 경우 Main 프로그램에서 1st Case를 선택하면 SubVI가 종료될 때까지 대기하여 Main 프로그램의 버튼이 동작하지 않게 됩니다. (참고: 2번과 3번 노드가 비슷한 외형을 갖기 때문에 동일한 기능을 수행할 것으로 오해할 수 있습니다. 자세히 관찰하면 하나는 스패너(spanner: ) 그림이 있고 다른 하나는 화살표 그림입니다.) 프로그램의 후반부에는 프런트 패널을 프린터에 출력시키는 Invoke Node와 프런트 패널을 위치를 복귀시키는 Property Node가 사용되었습니다. 마지막에는 Open VI Reference 함수로 불러들인 레퍼런스를 종료시키기 위해 Close Application or VI Reference 함수가 사용되었습니다.

 

그림 4. VI 서버를 구동 시키기 위해 Property Node와 Invoke Node를 사용한 예제

▶예제 3: 예제 파일 폴더 내의 병렬 수행 예제 폴더로 이동합니다. 본 예제는 VI 서버를 이용해 여러 개의 SubVI를 구동하는 예제입니다. 예제에는 4개의 SubVI를 동시에 띄우는 멀티 윈도우즈 방식의 고급 프로그래밍 기법입니다. 여기서 주목할 만한 점은 SubVI 1과 2는 Open VI Reference 함수가 While Loop 내부에 있고 3과 4는 프로그래밍 시작 전에 위치합니다. 이 의미는 SubVI 3과 4는 초기에 SubVI를 만들고 Main 프로그램이 종료될 때까지 이를 유지합니다. SubVI 3과 4의 문자열 컨트롤에 임의의 값을 저장 후 SubVI를 종료시키고 다시 Start 시키면 이전 기입 값이 그대로 남아있는 것을 확인할 수 있습니다. 반면 SubVI 1과 2는 SubVI가 종료되면 모든 리소스를 제거하고 다시 Start할 때 초기 레퍼런스 생성부터 수행합니다. 전체 프로그램이 대용량일 경우 SubVI 1과 2처럼 필요할 때 윈도우를 만들고 사용이 완료되면 제거하는 프로그래밍도 효과적일 수 있습니다.

 

그림 5. VI 서버를 이용한 병렬 수행 예제

본 강의에서는 LabVIEW VI이나 실행파일을 프로그램적으로 제어하는 기술인 VI 서버 기술을 연습하였습니다. 또한 VI 서버 기술을 효과적으로 활용하려면 객체 지향 프로그래밍 개념을 먼저 숙지하는 것을 권장합니다.

추가 학습 자료

기타. 프로그램적으로 어플리케이션을 제어하는 고급 예제 (필수)와 기타. VI Server로 웹에 프런트 패널 띄우는 예제를 꼭 확인하십시오. 자세한 내용은 LabVIEW 7.0 입문 제 12장(박흥복 저, 정익사)을 참고하십시오.

>> LabVIEW에 대한 더 많은 정보를 확인하세요! ni.com/korea/labview

>> LabVIEW 개발자 네트워크에서 LabVIEW 관련 예제를 다운로드 받으세요! mylv.net