티스토리 뷰



[LabVIEW] 랩뷰 디자인 패턴 1 - 상태머신


이 글에서는 LabVIEW에서 가장 많이 사용하고 있는 디자인 패턴 중 하나인 상태머신에 대해서 알아보도록 하겠습니다. 상태머신을 이해하기 위해서는 '상태'가 무엇을 의미하는지 부터 파악하고 있어야 할 것 같습니다.


컴퓨터 공학 혹은 전자 계열의 전공을 가지신 분이라면 상태다이어그램에 다해서 많이 들어보셨을 겁니다. 상태 다이어그램을 그릴려면 어떻게 해야 할까요? 어떠한 프로그램을 구현해야 할 때 요구사항이 필요할 것입니다. 이러한 요구사항은 어떠한 기능을 수행하는지 판단하고 이를 언어로 구체화 시켜야 합니다.




[상태 다이어그램의 예]

상태란? 시간의 흐름에 따라 변하는 객체의 값을 말합니다. 상태는 시작, 끝, 상태 전이로 구분을 할 수 있습니다. 


 이름

 설명 

 시작 

 상태의 시작을 의미합니다. 

 상태 전이 

 프로그램을 실행하면서 가지는 의미가 있는 알고리즘 단계를 말합니다. 

 사건과 동작으로 주로 구성이 됩니다.

 끝

 상태의 종료를 의미합니다. 


상태의 변화는 프로그램이 수행이 변화하는 과정으로 표현을 할수도 있습니다. 아래에서 예로 들겠지만, 간략히 자판기 기능을 구현해 보자고 한다면, 자판기는 아래와 같은 요구사항을 가질 것입니다.


  • 자판기에 동전을 투입한다.
  • 자판기를 통해서 제품을 구입한다.
  • 자판기에 넣은 동전에 대해 환불을 요청한다.

위의 요구사항의 동사를 한번 살펴보도록 하겠습니다. 동전투입, 제품구입, 환불과 같은 내역을 정리할 수 있습니다. 이러한 동사들은 상태의 행위를 변경하는 내역들입니다. 이와같이 동사를 기반으로 상태 전이가 발생한다고 할 수 있겠습니다. 


상태를 정의하는 방법은 다양합니다. 하지만 저는 개인적으로 동사를 위주로 정리를 하여 상태 다이어그램을 그리고자합니다. 사람에 따라 정의하는 방법이 다를 수 있겠지만, 동사를 위주로 정의를 하면 프로그램 상에서 처리해야 하는 알고리즘을 구현할 수 있기 때문에 비교적 효율적이라고 생각을 합니다.


지금까지 상태에 대해서 알아보았습니다. 이제는 이러한 상태라는 개념을 이용하여 실질적으로 LabVIEW에서 어떻게 사용할 수 있는지를 파악해 보도록 하겠습니다.


1) LabVIEW에서 상태머신을 사용하기 위해 이해해야 하는 것들


LabVIEW를 통해서 상태머신을 구현하기 위해서는 루프(While), 시프트레지스터, 케이스 구조, 타입정의된 열거형 상수, (Optional) 이벤트 구조를 LabVIEW에서 사용할 수 있어야 합니다. 


 이름

 설명 

 While

 상태를 지속적으로 전이하기 위해서는 프로그램이 계속 반복 실행이 되어야 합니다. 

 따라서 반복 구문 중 하나인 While문을 사용합니다. 

 시프트레지스터

 현재 상태와 다음 상태에 대한 정보를 저장할 수 있는 저장소 역할을 합니다. 

 이는 이전 반복문의 결과를 저장하여 다음 반복문에서 사용할 수 있게 합니다.

 케이스 구조

 각 상태에 따라 처리되는 알고리즘을 구현하기 위해서 사용합니다.

 타입정의된 열거형 상수

 상태의 값을 표현하기 위해서 나타냅니다. 

 열거형 상수를 사용해도 되지만, 열거형 상수는 내용업데이트 시 시스템 전체에 없데이트

 되지 않기 때문에 타입정의를 사용하는 것이 좋습니다.

 이벤트

 이벤트 기반의 상태머신을 구현할 때 이용합니다. 




[상태 머신을 위해 필요한 것들]



위에 대한 내용을 잘 모르신다면 아래의 링크들을 통해서 간략히 살펴보시기 바랍니다. 이벤트와 타입정의된 열거형에 대해서는 추후 작성을 하여 업데이트 하도록 하겠습니다.



2) 그럼 왜 상태머신을 사용해야 하는가?


LabVIEW는 왼쪽에서 오른쪽으로 데이터 및 알고리즘 흐름으로 구현되는 언어입니다. 수많은 Sequence가 있는 알고리즘을 구현해야 합다면, 아~~주 긴 블록다이어그램이 구성이 될것입니다. 이렇게 구현되는 것을 LabVIEW에서는 정적 시퀀스라고 합니다. 정적 시퀀스에서 이전에 실행했던 알고리즘이 필요하다면 똑같은 기능을 구현하거나, SubVI로 빼서 함수와 같이 사용해야 합니다.


이렇게 구현된다면 구현의 시간이 오래걸리며, 유지보수시 엄청난 문제를 만들 수 있습니다. 이러한 문제를 해결하기 위해서는 각 알고리즘을 상태로 정의하여 동적 시퀀스의 일종인 상태 머신을 이용할 수 있습니다. 


3) 상태머신의 구조


상태 머신의 구조는 아래와 같이 구성이 됩니다. While문 안에 케이스 구조가 들어가고 케이스 구조는 각 상태에 대한 알고리즘이 들어갑니다. 타입정의된 열거형 상수는 프로그램에 필요한 각 상태의 이름을 나타내고, 이 이름들이 케이스에 할당이 됩니다. 내부연산이 끝이 나고 다음 상태를 결정합니다. 상태에 대한 정보는 시프트레지스터에 저장이 되겠죠.




상태전이는 각 케이스의 알고리즘이 종료될 때 발생합니다. 알고리즘에 따라서 상태가 변경될 수도 있고, 기존의 상태로 유지될 수도 있습니다. 조건에 따라 상태 변이를 발생해야 한다면 아래와 같이 구현을 할 수도 있을 겁니다. 



4) 상태 머신 구현해보기


아래와 같이 자판기에 대한 상태가 정의되었다고 했을때, 간략히 상태머신으로 구현할 수 있을것입니다. 코드를 통해서 살펴보는 것은 좋은 공부방법 중 하나라고 생각합니다. 




코드를 설명드릴까 하다가, 코드를 업로드 해놓는게 좋을 것 같아 생략하고 코드를 올려드립니다. 궁금한점이 있으시면 물어보세요~




이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.


댓글