랩뷰에서 사용되는 디자인 패턴의 유형을 알아보고 각 디자인 패턴 구현방법에 대해 알아보겠습니다.
아래 그림에서처럼 "파일>>새로 만들기"를 클릭하면 "새로 만들기"라고 하는 다이얼로그 창이 뜨면서 6가지의 디자인 패턴을 위한 Template을 제공합니다.
마스터/슬레이브 디자인 패턴
마스터/슬레이브 디자인 패턴은 알림자를 사용하는데, 이 경우 마스터 루프에 동기화되어서 슬레이브 루프가 실행이 되지만, 버퍼 구조를 가지고 있지 않기 때문에 동작 중에 데이터 손실이 발생할 수 있습니다.
따라서 이 디자인 패턴은 데이터 손실이 발생해도 상관없고, 하나의 마스터 루프에서 여러 개의 슬레이브 루프로 데이터를 전송할때(broadcasting) 사용합니다. 사용자 인터페이스 이벤트 핸들러 디자인 패턴은 프런트 패널에서 마우스나 키보드에 의한 이벤트가 발생할 때 특정 코드가 실행되도록 하고자 할 때 사용합니다.
생산자/소비자 데이터 디자인 패턴
생산자/소비자 데이터 디자인 패턴은 마스터/슬레이브 디자인 패턴에서 알림자 대신 큐를 사용한 디자인 패턴으로 루프 간에 데이터 손실이 없습니다. 생산자/소비자 이벤트 디자인 패턴은 생산자 루프에서 이벤트 구조를 사용하도록 함으로써 사용자 이벤트에 동기화하여 코드가 실행될 수 있도록 해줍니다.
표준 상태머신 디자인 패턴
위에서 언급했듯이 생산자 루프에서는 사용자 이벤트를 감지하고, 관련 이벤트에 대해서 기능 수행은 소비자 루프에서 실행되도록 운영합니다. 이때 기능 수행과 관련하여 코드 구현 시 표준 상태 머신 구조를 사용할 수 있습니다.
이 구조에 추가로 사용자 이벤트 구조를 사용하여 기능 수행하는 루프 또는 프런트 패널 업데이트 루프에서 에러가 발생할 경우 사전에 등록한 사용자 이벤트를 통하여 생산자 루프에 알려줘서 기능 수행하는 루프와 프런트 패널 업데이트 루프를 정지하도록 운영할 수 있습니다. 사용자 이벤트를 등록해서 운영하는 방법에 대해서 살펴보면,
위의 그림에서처럼 블록 다이어그램에서 함수 팔레트 프로그래밍>>대화 상자 & 사용자 인터페이스>>이벤트 API를 이용하여 사용자 이벤트를 등록할 수 있습니다.
앞서 언급한 "생산자/소비자 이벤트 디자인패턴"을 구현할 때 기능을 수행하는 소비자 루프를 구성할 때 "표준 상태 머신 디자인 패턴"을 사용할 수 있습니다. 뿐만 아니라 사용자 인터페이스가 간단한 프로그램을 구현할 때도 사용하면 매우 편리합니다. "표준 상태 머신 디자인 패턴"은 사전에 정의해 놓은 상태들 간에 천이과정을 통하여 프로그램이 실행되도록 하는 디자인 패턴입니다.
예를 들어서 상태를 A,B,C로 정의해 놓고, 실행을 A>>B>>C 순으로 실행되도록 운영할 수 있습니다. 이 디자인 패턴을 사용하는 경우 프로그램에 대한 유지보수 및 확장성이 뛰어납니다. 예를 들어서 기존에 구현한 내용 중에서 일부 기능을 수행하지 않도록 한다거나, 새로운 기능을 추가하려고 하는 경우 간단한 프로그램 수정을 통하여 구현 가능합니다.
LabVIEW를 어느 정도 사용할 줄 아는 분들의 경우에는 이미 알고 있는 내용이겠지만, LabVIEW를 시작한지 얼마되지 않았거나, 체계적으로 배우지 못한 분들을 고려하여 아래와 같은 상태머신 구조에 대해서 함께 LabVIEW로 구현해보도록 하겠습니다.
지금부터는 LabVIEW를 이용하여 위의 상태머신을 구현해 보겠습니다.
위의 그림에서처럼 LabVIEW를 실행한 상태에서 "파일">>"새로 만들기"를 클릭합니다.
왼쪽 트리구조에서 "표준 상태 머신"을 선택하고 확인 버튼을 클릭합니다.
확인 버튼을 클릭하면 위 그림에서처럼 "표준 상태 머신"에 대한 기본 Template 코드가 자동으로 생성됩니다. 이 상태에서 "저장" 버튼을 클릭하면, 상태머신 구조에 대한 컨트롤을 저장할 수 있습니다. "StateMachineStates.ctl"이라는 파일로 저장하겠습니다.
운영하고자 하는 상태들("초기화", "대기", "A", "B", "C", "종료")을 삽입한 후 확인버튼을 클릭합니다.
"초기화" 상태가 수행 완료되면, "대기" 상태로 천이합니다.
"대기" 상태에서는 사용자 이벤트가 발생하는지를 체크해서 발생한 이벤트에 해당하는 상태로 천이하도록 해줍니다. 아래 그림에서처럼 클러스터 형태로 정의한 컨트롤에 대해서 값이 변경되면 그에 해당하는 다음 상태로 천이합니다.
클러스터에 대해서 "클러스터를 배열로" 함수와 "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"에 해당하는 케이스 구조 내용만 수정하면 됩니다. 뿐만 아니라 새로운 기능을 추가하고 싶으면, 새로운 기능에 해당하는 상태를 추가한 후 추가된 상태에 원하는 기능을 코드로 구현하면 됩니다.
'프로그래밍 > 랩뷰 기술자료' 카테고리의 다른 글
NI DAQ와 랩뷰를 이용한 구적 엔코더 측정 방법 (0) | 2023.06.01 |
---|---|
랩뷰 디자인 패턴: 상태 머신 (0) | 2023.06.01 |
PID 제어 이론 (0) | 2023.05.17 |
랩뷰를 이용한 진동 분석 및 신호 처리 (0) | 2023.05.17 |
PID(Proportional-Integral-Derivative) 제어 (0) | 2023.05.06 |