[myLV.net 집필진 강좌 – Goodmaner]
이번 강좌에서는 LabVIEW2017의 새로운 기능들 중 하나인 Malleable VI(가변 VI)에 대해서 소개해 드리고자 합니다.
지난 5월 NIWeek2017 행사에서 1986년에 LabVIEW SW를 개발한 Jeff Kodosky님(현 NI Co-founder & Fellow)이 직접 "Using Malleable VIs for more code reuse"라는 주제로 Malleable VI에 대해서 소개를 해주셨습니다.
제목에서처럼 코드 재 사용성을 높이기 위하여 관련 기능이 추가되었다고 볼 수 있을 것 같습니다.
Malleable VI는 텍스트 기반 프로그래밍 언어인 C++에서 지원하는 함수 오버로딩(overloading)과 유사합니다. 여기에서 함수 오버로딩이라 함은 서로 다른 여러 개의 함수가 하나의 이름을 공유하는 것을 말합니다. Malleable VI는 다양한 데이터 타입(숫자형, 불리언, 문자열, 기타)을 입력 받을 수 있고, 출력 터미널의 데이터 타입은 입력 터미널의 데이터 타입에 의하여 결정됩니다. 이 기능을 사용하는 경우 아래와 같은 제약사항이 있기 때문에 이를 잘 준수해 주어야 합니다.
1.모든 컨트롤/인디케이터들은 top-level 다이어그램에 있어야 합니다.
아래 그림은 입력/출력 터미널들이 top-level 다이어그램에 있어서 코드 상 문제가 없습니다.
아래 그림의 경우에는 출력 터미널이 케이스 구조 안에 있어서 실행 버튼이 깨진 상태입니다.
2.모든 컨트롤/인디케이터들은 반드시 커넥터 팬이 연결되어야 합니다.
3.VI 프로퍼티의 "실행" 항목에서 "호출하는 VI로 subVI 인라인" 옵션이 선택되어 있어야 합니다.
위의 3가지 조건들 중 하나라도 만족하지 못하면 실행버튼이 깨져서 실행이 안됩니다.
LabVIEW2017의 함수 팔레트에는 아래와 같이 Malleable VI들을 제공하고 있습니다.
지금까지 설명드린 내용을 바탕으로 직접 Malleable VI를 생성하고, 이를 사용한 간단한 테스트를 진행해보겠습니다.
Malleable VI는 아래 그림에서와 같이 새로운 파일을 생성할 때 "가변 VI"를 선택해서 만들수도 있고, 기존 VI 파일의 확장자(.vi)를 .vim으로 변경해서 만들수도 있습니다.
위에서 언급했었던 "데이터 흐름 지연(Stall Data Flow.vim)"과 동일한 기능을 아래와 같이 구현합니다.(Delay.vim) 이때 데이터 입력/출력에 해당하는 부분은 "배리언트"로 생성해줍니다. 참고로 "배리언트" 데이터 타입은 LabVIEW에 있는 모든 데이터 타입에 대한 일반 컨테이너입니다. 다른 데이터를 배리언트로 변환할 때 배리언트는 데이터 및 원래 데이터 타입을 저장하여, LabVIEW가 차후에 배리언트 데이터를 원래 데이터로 올바르게 변환시킬 수 있습니다.
그리고 생성한 "Delay.vim"을 호출하여 아래와 같은 테스트 코드를 작성합니다.(Test_Delay_VIM.vi)
위의 테스트 코드에서 보는 바와 같이 하나의 VI(Delay.vim) 파일로 다양한 데이터 타입(숫자형, 불리언, 문자열)의 입력 터미널을 연결할 수 있고, 출력 터미널은 입력 터미널에 의하여 자동으로 결정되어짐을 확인할 수 있습니다.
이번에는 기본적으로 제공하는 "데이터 흐름 지연(Stall Data Flow.vim)" 함수를 이용하여 아래와 같이 간단한 테스크 코드를 작성해봅니다. (Test_StallDataFlow.vi)
위의 테스트 코드에서 보는 바와 같이 하나의 VI(Stall Data Flow.vim) 파일로 다양한 데이터 타입(숫자형, 불리언, 문자열)의 입력 터미널을 연결할 수 있음을 확인할 수 있습니다. 이처럼 예전에는 입력 터미널의 데이터 타입마다 SubVI를 별도로 만들어서 운영하였는데, Malleable VI를 활용하면 하나의 SubVI로 다양한 데이터 타입의 입력 터미널을 연결하여 사용할 수 있기 때문에 코드 재사용성이 좋아집니다.
참고로 이와 유사한 기능으로 다형성 VI(Polymorphic VI)가 있습니다. 이는 여러 개의 VI가 1개의 VI에서 선택적으로 호출되는 형태로써, 코딩을 좀 더 효율적으로 할 수 있지만 아래와 같이 여러가지 문제점들을 가지고 있습니다.
1.절대경로 다형성 VI에서 호출하는 Sub VI는 내부적으로 절대경로로 등록되기 때문에 Sub VI의 위치 또는 경로가 바뀌면 호출 에러가 발생할 수 있습니다.
2.다형성 VI가 2개 이상의 Sub VI를 호출하는데, 여기에서 호출되는 Sub VI 또한 다형성 VI로 구성되어 있다면 많은 메모리와 리소스를 차지하기 때문에 메모리 최적화 측면에서 매우 비효율적입니다.
3.호출되지 않는 Sub VI가 메모리와 리소스를 차지합니다.
따라서 "다형성 VI" 사용은 메모리와 리소스 사용하는 측면에서 비효율적이기 때문에 사용하는 것을 지양합니다.
Malleable VI와 관련하여 향후 개발 방향으로 아래와 같은 게 진행 중에 있다고 합니다.
1.Add more type-constraint primitives
2.Enhance support for classes(C++ template function concept, "traits" lite)
3.Propagate computed constants for type computation
4.Add recursion for n-D array polymorphism(n-D "map" function)
5.Add recursion for cluster polymorphism(using parallel cluster indexing)
지금까지 LabVIEW2017의 새로운 기능 중 하나인 Malleable VI에 대해서 알아보았습니다.
LabVIEW2017을 사용하여 프로그램을 개발 중이신 분들은 관련 기능을 이용하여 코드 재사용성을 높여보실 수 있을 것 같습니다.