[Archive] 강좌게시판

취소
다음에 대한 결과 표시 
다음에 대한 검색 
다음을 의미합니까? 

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

 [myLV.net 집필진 강좌 – Goodmaner]

 

 지난 강좌에서는 프런트패널 제어하기와 관련하여 살펴 보았습니다.
 
프런트패널 제어와 관련해서는 개인마다 선호하는 방법들이 다양할텐데요.
 
이번에 강의할 디자인패턴의 경우에는 가장 많이 사용하는 대표 디자인 패턴들이 정해져 있습니다.
 
LabVIEW에서는 다른 프로그램들처럼 Template 형태로 자주 사용하는 디자인 패턴들에 대해서 코드를 제공합니다.
 
아래 그림에서처럼 "파일>>새로 만들기"를 클릭하면 "새로 만들기"라고 하는 다이얼로그 창이 뜨면서 6가지의 디자인 패턴을 위한 Template을 제공합니다.
 
1.JPG

 

2.JPG

 

마스터/슬레이브 디자인 패턴은 알림자를 사용하는데, 이 경우 마스터 루프에 동기화되어서 슬레이브 루프가 실행이 되지만, 버퍼 구조를 가지고 있지 않기 때문에 동작 중에 데이터 손실이 발생할 수 있습니다. 따라서 이 디자인 패턴은 데이터 손실이 발생해도 상관없고, 하나의 마스터 루프에서 여러 개의 슬레이브 루프로 데이터를 전송할때(broadcasting) 사용합니다. 사용자 인터페이스 이벤트 핸들러 디자인 패턴은 프런트 패널에서 마우스나 키보드에 의한 이벤트가 발생할 때 특정 코드가 실행되도록 하고자 할 때 사용합니다. 생산자/소비자 데이터 디자인 패턴은 마스터/슬레이브 디자인 패턴에서 알림자 대신 큐를 사용한 디자인 패턴으로 루프 간에 데이터 손실이 없습니다. 생산자/소비자 이벤트 디자인 패턴은 생산자 루프에서 이벤트 구조를 사용하도록 함으로써 사용자 이벤트에 동기화하여 코드가 실행될 수 있도록 해줍니다. 일반적으로 프로그램은 사용자 이벤트를 받아서 특정 동작을 수행하도록 운영되기 때문에, 위에서 언급한 자주 사용되는 디자인 패턴 중 생산자/소비자 이벤트 디자인 패턴이 가장 일반적으로 많이 사용됩니다. 큐 메시지 핸들러 디자인 패턴은 특정 실행 순서로 동작하도록 할때 사용하는 디자인 패턴입니다. 상태머신 디자인 패턴과 유사하기 때문에, 관련 디자인 패턴보다는 상태머신 디자인 패턴을 더 많이 사용합니다. 표준 상태 머신 디자인 패턴은 사전에 정의해 놓은 상태들 간에 천이과정을 통하여 프로그램이 실행되도록 하는 디자인 패턴입니다. 예를 들어서 상태를 A,B,C로 정의해 놓고, 실행을 A>>B>>C 순으로 실행되도록 운영할 수 있습니다. 이 디자인 패턴은 아래에서 다시 언급하겠지만, 디자인 패턴 응용으로 생산자/소비자 구조 중 소비자 구조 안에서 기능 수행을 하는 부분을 코드로 구현할때 표준 상태 머신 디자인 패턴을 사용하면 매우 유용합니다. 구현하고자하는 프로그램의 성격에 따라서 위에서 언급한 6가지 디자인 패턴 중 가장 적합한 것을 선택해서 프로그래밍하면 됩니다. 6가지 디자인 패턴 중 생산자/소비자 이벤트 구조 및 이를 응용한 구조에 대해서 좀 더 살펴보겠습니다. 아래 그림은 생산자/소비자 이벤트 구조와 관련 구조에 사용자 이벤트 구조를 추가한 구조에 대한 구성도입니다.
 
3.JPG

 

위에서 언급했듯이 생산자 루프에서는 사용자 이벤트를 감지하고, 관련 이벤트에 대해서 기능 수행은 소비자 루프에서 실행되도록 운영합니다. 이때 기능 수행과 관련하여 코드 구현 시 표준 상태 머신 구조를 사용할 수 있습니다. 그리고 실 시간으로 프런트 패널에 데이터를 업데이트해야 할 경우 기능 수행하는 루프에서 같이 처리하게 될 경우 타이밍 이슈가 발생할 수 있기 때문에, 이런 문제를 해결하기 위하여 프런트 패널 업데이트를 위한 루프를 별도로 운영할 수 있습니다. 예를 들어서 실 시간으로 영상 장비로부터 영상과 관련한 데이터를 주기적으로 취득해서 프런트 패널에 업데이트를 하는 경우, 기능 수행 루프에서 주기적으로 영상 데이터를 취득하도록 하고, 실제 프런트 패널에 데이터를 업데이트하는 것은 프런트 패널 업데이트 루프에서 수행하도록 운영할 수 있습니다. 이렇게 데이터 취득과 화면 디스플레이하는 것을 분리하게 되면, 추후 취득한 영상에 대해서 후처리 과정 추가를 손쉽게 할 수 있도록 해줍니다.
 
이 구조에 추가로 사용자 이벤트 구조를 사용하여 기능 수행하는 루프 또는 프런트 패널 업데이트 루프에서 에러가 발생할 경우 사전에 등록한 사용자 이벤트를 통하여 생산자 루프에 알려줘서 기능 수행하는 루프와 프런트 패널 업데이트 루프를 정지하도록 운영할 수 있습니다. 사용자 이벤트를 등록해서 운영하는 방법에 대해서 살펴보면,
 
4.JPG

 

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

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

 

6.JPG

 

지금까지 LabVIEW에서 가장 자주 사용하는 디자인 패턴들에는 어떤 것들이 있는지 살펴보았고, 특히 생산자/소비자 이벤트 구조 및 이를 응용한 생산자/소비자 이벤트 + 사용자 이벤트 구조에 대해서 자세히 살펴보았습니다.
다음 강좌에서는 기능 수행하는 루프에서 많이 사용되는 표준 상태 머신 디자인 패턴에 대해서 살펴보도록 하겠습니다.
기여자