티스토리 뷰

일반적으로 랩뷰에서 subVI를 팝업 창으로 동기적으로 동작이 됩니다. 동기적으로 동작이 되면 subVI가 종료되기 이전에 subVI를 띄운 Main VI가 Waiting 상태에 빠지게 됩니다. subVI가 종료되야 Main VI의 기능이 동작하게 됩니다. 


하지만 대부분 PopUP 창을 띄울때는 MainVI에서는 기능이 제대로 실행되기를 원합니다. 이럴때는 동기적이 아닌 비동기적인 방식으로 subVI를 띄어야합니다. 


그럼 지금부터 랩뷰에서 비동기적인 방식으로 subVI를 호출하는 방법에 대해서 알아보도록 하겠습니다. 그럼 MainVI 부터 살펴보도록 하죠. Main VI에서는 특정 이벤트 혹은 버튼이 눌러지는 경우 상태머신을 기반으로 subVI를 호출할 수 있습니다. 


1) Main VI 살펴보기


아래의 코드는 상태머신 기반으로 구현을 해보았습니다. MainVI의 화면은 아래와 같습니다. 


창띄우기 버튼이 눌러지면 subVI를 호출합니다. 스톱 버튼을 누르면 프로그램이 종료가 되겠죠. 

창띄우기를 통해서 subVI를 호출한 뒤, Counter가 지속적으로 올라간다면 비동기적인 호출이 되겠고 Counter 값이 멈춰있다면 동기적인 호출이 되겠죠. 내부 코드가 계속 실행이 되는지 안되는지 확인할 수 있으니깐요.



그럼 코드를 한번 살펴보겠습니다.


2가지의 상태를 가지고 있습니다. Init가 Other이라는 상태인데요. Init 상태는 subVI 호출을 비동기적으로 합니다. Init 상태에서는 VI의 경로를 가져와서 경로에 있는 VI 실행을 비동기적으로 호출하게 됩니다. 호출만 하고 종료되는지, 실행이 되는지 전형 MainVI에서는 신경을 쓰지 않습니다. 


Other 상태는 Counter 인디케이터에 While문의 i값을 계속 넣고 있습니다.



이 VI에서는 VI 참조 열기 함수를 통해서 참조를 생성하고, 이를 비동기적으로 실행을 합니다. 

VI 참조 열기 함수에 대한 내용은 아래와 같습니다. VI 참조 열기 함수는 정해진 위치의 VI를 참조로 반환을 하는 기능을 합니다. 여기서 가장 관심있게 봐야하는 부분은 옵션입니다. 




옵션에 x80의 값이 들어가는 것을 확인할 수 있는데, 이는 아래와 같이 호출하고 호출했는지, 종료했는지 VI가 반환이 되었는지 여부를 신경쓰지 않겠다는 값입니다. 비동기적으로 호출하려면 호출 이후 상태에 대해서 알 필요가 없겠죠.



2) SubVI 살펴보기


Main VI의 사용자 인터페이스와 코드를 살펴보았습니다. 그럼 이제 SubVI도 한번 살펴봐야겠죠.

SubVI UI는 아래와 같이 생겼습니다. 그냥 Child Window 종료를 누르면 종료가 되게 만들었습니다. 



SubVI의 VI 프로퍼티에 드어가서 윈도우 모양에서 대화상자로 변경합니다. 다른 윈도우 모양이라도 상관 없지만 팝업 창으로 보이고 싶어서 이렇게 만들었습니다. 대화상자로 설정하게 되면 시작 버튼도 없어지고, 최대, 최소, 종료버튼만 남아있게 됩니다. 



그럼 코드를 한번 살펴볼까요. 

이 VI가 실행이 되면 현재 VI 경로의 Reference를 얻어와서,VI 프로퍼티에 Front Panel을 열게합니다. 그리고 상태를 Standard로 설정을 하죠.

VI 프로퍼티에 대해서 좀더 설명을 드리자면 아래와 같습니다.

Activate는 윈도우를 열때 사용하고, Standard는 아래와 같이 최대/최소/숨김 상태도 아닌 것을 의미합니다. 그리고 Close VI 버튼이 True로 바뀌게 되면 Front Panel 자체를 종료시키고, 관련 레퍼런스를 종료시킵니다. 즉, VI 실행을 종료하는 것이죠.



그럼 실행을 해보겠습니다.

실행을 하고, Counter가 64일 때 창띄우기를 눌렀습니다. 



subVI가 떠있습니다. 하지만 Counter는 계속 증가합니다. 즉 MainVI가 블록되어 있지 않고, 서로의 VI가 잘 실행이되고 있습니다. 



이 글에서는 랩뷰에서 비동기적으로 subVI를 호출하는 방법에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?



댓글