프로그래밍/랩뷰 기술자료

랩뷰 디자인패턴 유형 및 구현방법

에이티에스 2023. 6. 1. 07:12
728x90

랩뷰에서 사용되는 디자인 패턴의 유형을 알아보고 각 디자인 패턴 구현방법에 대해 알아보겠습니다. 

LabVIEW에서는 다른 프로그램들처럼 Template 형태로 자주 사용하는 디자인 패턴들에 대해서 코드를 제공합니다.

아래 그림에서처럼 "파일>>새로 만들기"를 클릭하면 "새로 만들기"라고 하는 다이얼로그 창이 뜨면서 6가지의 디자인 패턴을 위한 Template을 제공합니다.

 

 

 

마스터/슬레이브 디자인 패턴

마스터/슬레이브 디자인 패턴은 알림자를 사용하는데, 이 경우 마스터 루프에 동기화되어서 슬레이브 루프가 실행이 되지만, 버퍼 구조를 가지고 있지 않기 때문에 동작 중에 데이터 손실이 발생할 수 있습니다. 

따라서 이 디자인 패턴은 데이터 손실이 발생해도 상관없고, 하나의 마스터 루프에서 여러 개의 슬레이브 루프로 데이터를 전송할때(broadcasting) 사용합니다. 사용자 인터페이스 이벤트 핸들러 디자인 패턴은 프런트 패널에서 마우스나 키보드에 의한 이벤트가 발생할 때 특정 코드가 실행되도록 하고자 할 때 사용합니다. 

 
 

생산자/소비자 데이터 디자인 패턴

생산자/소비자 데이터 디자인 패턴은 마스터/슬레이브 디자인 패턴에서 알림자 대신 큐를 사용한 디자인 패턴으로 루프 간에 데이터 손실이 없습니다. 생산자/소비자 이벤트 디자인 패턴은 생산자 루프에서 이벤트 구조를 사용하도록 함으로써 사용자 이벤트에 동기화하여 코드가 실행될 수 있도록 해줍니다. 

 
일반적으로 프로그램은 사용자 이벤트를 받아서 특정 동작을 수행하도록 운영되기 때문에, 위에서 언급한 자주 사용되는 디자인 패턴 중 생산자/소비자 이벤트 디자인 패턴이 가장 일반적으로 많이 사용됩니다. 
큐 메시지 핸들러 디자인 패턴은 특정 실행 순서로 동작하도록 할때 사용하는 디자인 패턴입니다. 상태머신 디자인 패턴과 유사하기 때문에, 관련 디자인 패턴보다는 상태머신 디자인 패턴을 더 많이 사용합니다. 
 
 
 

표준 상태머신 디자인 패턴

표준 상태 머신 디자인 패턴은 사전에 정의해 놓은 상태들 간에 천이과정을 통하여 프로그램이 실행되도록 하는 디자인 패턴입니다. 예를 들어서 상태를 A,B,C로 정의해 놓고, 실행을 A>>B>>C 순으로 실행되도록 운영할 수 있습니다. 
이 디자인 패턴은 아래에서 다시 언급하겠지만, 디자인 패턴 응용으로 생산자/소비자 구조 중 소비자 구조 안에서 기능 수행을 하는 부분을 코드로 구현할때 표준 상태 머신 디자인 패턴을 사용하면 매우 유용합니다. 
 
구현하고자하는 프로그램의 성격에 따라서 위에서 언급한 6가지 디자인 패턴 중 가장 적합한 것을 선택해서 프로그래밍하면 됩니다. 6가지 디자인 패턴 중 생산자/소비자 이벤트 구조 및 이를 응용한 구조에 대해서 좀 더 살펴보겠습니다. 
 
아래 그림은 생산자/소비자 이벤트 구조와 관련 구조에 사용자 이벤트 구조를 추가한 구조에 대한 구성도입니다.
 

 

위에서 언급했듯이 생산자 루프에서는 사용자 이벤트를 감지하고, 관련 이벤트에 대해서 기능 수행은 소비자 루프에서 실행되도록 운영합니다. 이때 기능 수행과 관련하여 코드 구현 시 표준 상태 머신 구조를 사용할 수 있습니다.

 
그리고 실 시간으로 프런트 패널에 데이터를 업데이트해야 할 경우 기능 수행하는 루프에서 같이 처리하게 될 경우 타이밍 이슈가 발생할 수 있기 때문에, 이런 문제를 해결하기 위하여 프런트 패널 업데이트를 위한 루프를 별도로 운영할 수 있습니다.
 
예를 들어서 실 시간으로 영상 장비로부터 영상과 관련한 데이터를 주기적으로 취득해서 프런트 패널에 업데이트를 하는 경우, 기능 수행 루프에서 주기적으로 영상 데이터를 취득하도록 하고, 실제 프런트 패널에 데이터를 업데이트하는 것은 프런트 패널 업데이트 루프에서 수행하도록 운영할 수 있습니다.
이렇게 데이터 취득과 화면 디스플레이하는 것을 분리하게 되면, 추후 취득한 영상에 대해서 후처리 과정 추가를 손쉽게 할 수 있도록 해줍니다.
 

이 구조에 추가로 사용자 이벤트 구조를 사용하여 기능 수행하는 루프 또는 프런트 패널 업데이트 루프에서 에러가 발생할 경우 사전에 등록한 사용자 이벤트를 통하여 생산자 루프에 알려줘서 기능 수행하는 루프와 프런트 패널 업데이트 루프를 정지하도록 운영할 수 있습니다. 사용자 이벤트를 등록해서 운영하는 방법에 대해서 살펴보면,

 

 

위의 그림에서처럼 블록 다이어그램에서 함수 팔레트 프로그래밍>>대화 상자 & 사용자 인터페이스>>이벤트 API를 이용하여 사용자 이벤트를 등록할 수 있습니다.

아래 그림은 간단하게 문자열 타입의 "test"라고 하는 사용자 이벤트를 등록해서 아래 While Loop의 루프반복횟수 값이 15가 되면, "test"라고 하는 사용자 이벤트가 발생하고, "test stop"이라는 문자열을 발생하도록 하는 프로그램입니다.
 

 

 

앞서 언급한 "생산자/소비자 이벤트 디자인패턴"을 구현할 때 기능을 수행하는 소비자 루프를 구성할 때 "표준 상태 머신 디자인 패턴"을 사용할 수 있습니다. 뿐만 아니라 사용자 인터페이스가 간단한 프로그램을 구현할 때도 사용하면 매우 편리합니다. "표준 상태 머신 디자인 패턴"은 사전에 정의해 놓은 상태들 간에 천이과정을 통하여 프로그램이 실행되도록 하는 디자인 패턴입니다. 

 

예를 들어서 상태를 A,B,C로 정의해 놓고, 실행을 A>>B>>C 순으로 실행되도록 운영할 수 있습니다. 이 디자인 패턴을 사용하는 경우 프로그램에 대한 유지보수 및 확장성이 뛰어납니다. 예를 들어서 기존에 구현한 내용 중에서 일부 기능을 수행하지 않도록 한다거나, 새로운 기능을 추가하려고 하는 경우 간단한 프로그램 수정을 통하여 구현 가능합니다.

 

LabVIEW를 어느 정도 사용할 줄 아는 분들의 경우에는 이미 알고 있는 내용이겠지만, LabVIEW를 시작한지 얼마되지 않았거나, 체계적으로 배우지 못한 분들을 고려하여 아래와 같은 상태머신 구조에 대해서 함께 LabVIEW로 구현해보도록 하겠습니다.

 
 
위에 표시한 상태머신에 대해서 살펴보도록 하겠습니다. 
 
프로그램을 시작하면 "초기화" 상태로 천이하고, 이후 "대기" 상태로 천이합니다.
 
"초기화" 상태에서는 프로그램에서 사용하는 각종 변수들을 초기화시켜줍니다.
 
"대기" 상태에서는 사용자 이벤트를 기다리고 있다가, 아래 그림에서와 같은 사용자 UI 상의 버튼들을 클릭하면, 클릭한 버튼마다 각기 다른 동작을 수행합니다.
 
"프로세스 1" 버튼을 클릭하면 위 상태머신에서처럼 "A" >> "B" >> "C"로 순차적으로 천이하고, 이후에 다시 "대기" 상태로 천이합니다.
 
"프로세스 2" 버튼을 클릭하면 "A" >> "B"로 천이한 후 다시 "대기" 상태로 천이합니다.
 
"프로세스 3" 버튼을 클릭하면 "A"로 천이한 후 다시 "대기" 상태로 천이합니다.
 
"종료" 버튼을 클릭하면 "종료" 상태로 천이하고 프로그램을 종료합니다.
 

 

지금부터는 LabVIEW를 이용하여 위의 상태머신을 구현해 보겠습니다.

 

 

위의 그림에서처럼 LabVIEW를 실행한 상태에서 "파일">>"새로 만들기"를 클릭합니다.

 

 

왼쪽 트리구조에서 "표준 상태 머신"을 선택하고 확인 버튼을 클릭합니다.

 

 

확인 버튼을 클릭하면 위 그림에서처럼 "표준 상태 머신"에 대한 기본 Template 코드가 자동으로 생성됩니다. 이 상태에서 "저장" 버튼을 클릭하면, 상태머신 구조에 대한 컨트롤을 저장할 수 있습니다. "StateMachineStates.ctl"이라는 파일로 저장하겠습니다.

 

 

다음은 "표준 상태 머신"으로 프로그램하고자 하는 VI 파일을 StateMachine_Example.vi라는 파일로 저장하겠습니다.
앞에서 먼저 저장한 컨트롤 파일(StateMachine_Example.vi)을 열어서 아래와 같이 "아이템 편집"을 클릭합니다.
 

 

운영하고자 하는 상태들("초기화", "대기", "A", "B", "C", "종료")을 삽입한 후 확인버튼을 클릭합니다.

이제부터는 StateMachine_Example.vi 파일을 열어서 각각의 상태에 대한 코드를 구현하겠습니다.
 
먼저 "초기화" 상태입니다. VI를 실행하면, 가장 먼저 수행하게 되는 부분으로 아래 그림에서처럼 While 루프 밖에서 초기
값들을 정의하고 시프트 레지스터로 초기 값들을 설정해줍니다.

"초기화" 상태가 수행 완료되면, "대기" 상태로 천이합니다.

 

 

 

"대기" 상태에서는 사용자 이벤트가 발생하는지를 체크해서 발생한 이벤트에 해당하는 상태로 천이하도록 해줍니다. 아래 그림에서처럼 클러스터 형태로 정의한 컨트롤에 대해서 값이 변경되면 그에 해당하는 다음 상태로 천이합니다.

 

클러스터에 대해서 "클러스터를 배열로" 함수와 "1D 배열 검색" 함수를 이용하여 각각의 버튼("프로세스 1", "프로세스 2", "프로세스 3", "종료")에 이벤트가 발생하는지 여부를 확인하도록 하였습니다. "대기" 상태는 -1, "프로세스 1" 상태는 0, "프로세스 2" 상태는 1, "프로세스 3" 상태는 2, "종료" 상태는 3입니다.

 

"A" 상태에서는 "단일 버튼 대화 상자" 함수를 이용하여 "A"라는 문자를 출력하게 합니다. 이후에는 조건에 따라서 다음에 천이할 상태를 결정합니다. "프로세스 1" 또는 "프로세스 2" 버튼을 클릭한 경우에는 "B" 상태로 천이하고, "프로세스 3" 버튼을 클릭한 경우에는 "대기" 상태로 천이합니다.

 

"B" 상태에서는 "단일 버튼 대화 상자" 함수를 이용하여 "B"라는 문자를 출력하게 합니다. 이후에는 조건에 따라서 다음에 천이할 상태를 결정합니다. "프로세스 1" 버튼을 클릭한 경우에는 "C" 상태로 천이하고 "프로세스 2" 버튼을 클릭한 경우에는 "대기" 상태로 천이합니다.

 

"C" 상태에서는 "단일 버튼 대화 상자" 함수를 이용하여 "C"라는 문자를 출력하게 합니다. 이후에는 변수들을 초기화시킨 후 "대기" 상태로 천이합니다.

 

 

"종료" 상태에서는 While 루프를 빠져나가도록 해서 프로그램을 종료시킵니다.

 

 

이처럼 "표준 상태 머신 디자인 패턴"을 이용하여 사용자 인터페이스가 간단한 프로그램을 손쉽게 구현할 수 있습니다. 서두에 프로그램의 유지 보수 및 확장성이 용이하다고 말씀드렸습니다.

 

예를 들어서 "프로세스 1" 버튼을 클릭하더라도 이와 관련한 상태들로 천이하게 안하고 싶으면, 아래 그림에서와 같이 간단하게 "프로세스 1"에 해당하는 케이스 구조 내용만 수정하면 됩니다. 뿐만 아니라 새로운 기능을 추가하고 싶으면, 새로운 기능에 해당하는 상태를 추가한 후 추가된 상태에 원하는 기능을 코드로 구현하면 됩니다.

 

 

[myLV.net 집필진 강좌] 디자인패턴(1) - NI Community

[myLV.net 집필진 강좌] 디자인패턴(2) - NI Community

728x90
반응형
그리드형