랩뷰 상태머신 구조 및 자판기 예제

    반응형

    안녕하세요. 지지비입니다.
    이번에는 랩뷰의 디자인 패턴 중 대표적인 상태머신 구조에 대해서 알아보도록 하겠습니다.

     

      1. 상태머신 구조란?

      상태머신 구조를 이해하기 위해서는 먼저 상태라는 단어를 이해해야 합니다. 상태는 알고리즘을 다이어그램 형태로 만들었을 때 각각의 박스를 상태로 이해하면 편할 것 같습니다. 아래는 제가 자판기 예제를 만들기 위해 작성한 다이어그램입니다. 각 상태를 빨간색 점선으로 표기했습니다.

       

      상태를 파악했으니 상태머신 구조에 대해서 알아보겠습니다. 상태머신 구조는 아래와 같이 구현합니다. While 루프, 케이스 구조, 시프트 레지스터가 상태머신 구조를 만드는 세 가지 요소입니다. 

      최초 시프트 레지스터 초기화를 통해서 초기 상태를 지정합니다(제외할 수 있음). 케이스 구조에서 상태를 실행하고, 다음 상태를 시프트 레지스터에 저장합니다. 이렇게 상태를 실행하고 다음 상태를 넣어주고를 반복하는 것이 상태머신 구조입니다.


      2. 자판기 상태머신 구조 예제

      각 상태에 대한 설명을 드리도록 하겠습니다. 

       - 프론트 패널 디자인 (자판기)

      자판기 예제 프론트 패널

       

       - 초기화 상태

      프로그램을 시작하면 시프트 레지스터 초기화를 통해 "초기화"상태로 케이스 구조가 실행되고, 총액 시프트 레지스터도 마찬가지로 0으로 초기화됩니다. 메세지 인디케이터도 빈 문자열을 넣어 초기화하고, 다음 상태는 "대기"상태를 입력해 줍니다.

       

       - 대기 상태

      대기 상태는 이벤트를 감지하기 위한 이벤트 구조가 사용되었습니다. 프론트 패널의 각 버튼들에 대해서 이벤트를 감지하도록 하였습니다. 100원, 500원, 1000원 투입 및 콜라 판매, 거스름 버튼을 눌렀을 때를 감지하여 다음 상태를 시프트 레지스터에 저장합니다. 

      아래 코드에서는 100원 투입 이벤트를 감지하여 "100원 투입"상태를 시프트 레지스터에 저장하여 다음 케이스 구조는 "100원 투입" 상태를 실행하게 됩니다.

       

       - 금액 투입 상태

      각 금액 투입 상태는 "100원 투입", "500원 투입", "1000원 투입" 상태로 나누어져 있습니다. 아래 코드는 "100원 투입"상태로 100원이 투입되었으므로 총액 값에 100원을 더하여 시프트 레지스터에 저장하도록 합니다. 그리고 다음 상태는 다시 "대기"상태로 돌아가 이벤트를 감지합니다.

       

       - 콜라 판매 상태

      콜라 버튼을 눌렀을 때 실행되는 상태입니다. 총액이 콜라 판매 금액보다 큰지 확인하고, 콜라 판매 금액보다 총액이 크면 콜라를 내보내고 총액에서 콜라 금액만큼 뺀 후 시프트 레지스터에 저장합니다. 총액이 모자라면 총액이 모자라다는 메세지를 보내고 총액은 그대로 유지합니다.

       

       - 거스름 상태

      잔돈 환불 버튼을 누르면 거스름 상태를 실행합니다. 남은 총액을 모두 거슬렀다는 메세지를 보내고 총액을 0원으로 초기화합니다.


      3. 자판기 상태머신 구조 심화 예제

      심화 예제는 제가 직접 자판기 예제를 짜면 어떨까 하고 생각하면서 짜 본 코드입니다. 각 상태가 복잡하지 않으므로 상태를 이벤트 구조 안에 넣어 간단하게 구성하였습니다. 또한 이벤트 발생 시 컨트롤 참조를 사용하여 100원, 500원, 1000원 투입 이벤트를 한 번에 처리하도록 만들어 코드 작성 시간을 줄였습니다.

      아래는 심화 예제 중 금액 투입 이벤트를 한번에 처리하도록 만들었고 총액을 시프트 레지스터를 사용하지 않고 로컬 변수를 통해 컨트롤하고 있습니다. 

       

      기본 예제와 제가 짠 예제는 조금씩 다른 점이 많이 있습니다.

      • 금액 투입 이벤트를 한 번에 처리하도록 함 (컨트롤의 라벨을 이용)
      • 대기 상태는 직접 입력하지 않고 기본 케이스 구조를 활용함
      • 총액 값을 로컬 변수를 이용
      • 콜라 값을 변수를 이용

      제가 활용하고 있는 상태머신 구조의 예제를 확인해 보시고 자동화하는데 도움이 되시길 바랍니다.

      자판기 상태머신 예제.vi
      0.04MB
      자판기 상태머신 심화 예제.vi
      0.03MB

       

      댓글

      Designed by JB FACTORY