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

랩뷰 디자인 패턴: 상태 머신

에이티에스 2023. 6. 1. 08:43
728x90

상태 머신은 LabVIEW 개발자들이 어플리케이션을 신속히 구축할 때 가장 자주 사용하는 기본적인 아키텍처 중 하나입니다. 상태 머신 아키텍처는 상태 다이어그램 또는 흐름 차트가 표현하는 복합 의사결정 알고리즘을 구현하는 데 사용할 수 있습니다.

보다 정확하게 설명하면, 상태 머신은 다이어그램의 각 상태에 대해 특정한 작업을 수행하는 “무어 머신”에 의해 표현되는 모든 알고리즘을 구현합니다. 상태 머신은 구분이 명확한 상태가 존재하는 어플리케이션에 사용됩니다. 각 상태는 하나 또는 여러 상태가 될 수 있으며, 프로세스 흐름을 끝마칠 수도 있습니다.

 

상태 머신은 사용자 입력 또는 상태 내부에 연산 결과에 따라 어떤 상태가 다음에 실행될지 결정됩니다. 대부분의 어플리케이션들에는 여러 동작이 수행될 수 있는 기본 상태인 “초기화” 상태가 필요합니다. 수행되는 동작들은 이전의 그리고 현재의 입력 및 상태에 따라 다를 수 있습니다. “정지 (shutdown) 상태는 동작 정리를 수행하는 데 사용할 수 있습니다.

 

상태 머신은 사용자 인터페이스를 프로그래밍할 때 가장 많이 사용됩니다. 사용자 인터페이스를 생성할 때 다른 사용자 동작은 사용자 인터페이스를 다른 처리 영역으로 전송합니다. 이러한 각 영역들은 상태 머신에서 상태들로서 작동하게 됩니다. 이 영역들은 보다 심도 있는 처리를 위한 영역이 되거나 또 다른 사용자 이벤트를 기다릴 수 있습니다. 이 같은 예에서 상태 머신은 다음 작동이 수행되기 위해 사용자를 지속적으로 모니터링합니다. 

 

이 예에서 각 프로세스 영역은 각각의 상태로 표현합니다. 각 상태의 테스트 결과에 따라 다른 상태를 호출할 수 있을 것입니다. 이러한 프로세스는 지속적으로 발생할 수 있어 테스트 중인 프로세스의 깊이 있는 분석을 수행할 수 있습니다.

 

1. 상태 머신을 사용하는 이유

상태 머신은 의사 결정 알고리즘을 구현하는 강력한 기능 외에도, 어플리케이션 계획 수립 기능으로도 사용가능합니다. 어플리케이션의 복잡성이 증가할수록 적합한 디자인의 필요성도 늘어납니다. 상태 다이어그램과 상태 차트는 매우 유용하며 때때로 디자인 프로세스에도 필수적이기도 합니다.

 

상태 머신은 어플리케이션 계획 수립에 장점이 있을 뿐 아니라 생성하기도 쉽습니다. 효과적인 상태 머신을 구축하는 데는 필요한 상태 테이블을 만드는 설계자도 필요합니다. 설계자는 이 테이블을 이용하여 각 상태가 다른 상태와 연관되는 방법을 계획할 수 있습니다. 작동하는 상태 머신의 생성과 관련된 디자인 프로세스는 어플리케이션의 전체 디자인도 향상시키게 될 것입니다.

 

2. 상태 머신 구축

대포가 위험할 정도로 뜨거워지지 않고 계속해서 발포할 수 있는 어플리케이션을 생성하고자 합니다. 첫 단계로 상태 다이어그램을 이용하여 로직을 표현하게 될 것입니다 (그림 1).

이 다이어그램에서 살펴보면 각 상태 (oval node)는 컨트롤 프로세스가 현 상태일 때 수행되는 작동을 기술하는 반면, transition (화살표)은 프로세스가 한 상태에서 다른 상태로 이동할 수 있는 시기와 방법을 간단히 기술합니다.

그림 1: 상태 다이어그램

상태 머신의 각 상태는 고유한 기능을 수행하고, 다른 상태를 호출합니다. 상태 통신은 일부 상태 또는 시퀀스에 따라 다릅니다. 상태 다이어그램을 LabVIEW 다이어그램으로 변환하려면 다음 인프라가 필요합니다:

 

While 루프 – 계속해서 여러 상태를 실행

케이스 구조 – 각 케이스에는 각 상태를 실행하기 위한 코드 포함

시프트 레지스터 – 상태 변환 정보 포함

전환 코드 – 시퀀스에서 다음 상태 결정 (아래 예제 확인)

 

상태 다이어그램의 흐름 (그림 1)은 루프가 구현하는 반면, 개별 상태는 케이스 구조의 케이스들이 대체합니다. While 루프의 시프트 레지스터는 현재 상태를 계속해서 기록하며 케이스 구조 입력에 입력됩니다.

그림 2: 상태 머신

다음으로 변환될 상태를 결정하는 데는 여러가지 방식들이 존재합니다. 일반적인 네 가지 방식이 존재하는데 그 내용은 하단에서 설명하도록 합니다 (참고 – 다음에서 설명하는 방식 예에서, “Init”은 어떤 상태로든 변환 가능):

 

그림 3a

그림 3a는 딱 하나의 가능한 변화만 가진 “Init” 상태를 나타냅니다.

그림 3b

그림 3b는 두 개 상태 선택이 가능한 “Shut Down” 또는 “Power Up”을 가진 “Init”을 나타냅니다.

그림 3c

그림 3c는 불리언 배열과 함께 열거형 상수 배열을 사용하는 “Init” 상태를 나타냅니다. 불리언 배열에는 각 변환 “Init”에 상응하는 불리언이 존재합니다. 열거형 상수 배열은 각 변환 이름을 나타냅니다. 불리언 배열의 첫 번째 “참” 불리언 인덱스는 열거형 배열의 새로운 상태에 해당하는 인덱스를 의미하게 됩니다.

 

그림 3d

그림 3d는 다음 상태로 변환되는 내부 루프와 케이스 구조를 사용하는 “Init”을 나타냅니다. 내부 케이스 구조에는 현재 상태가 남겨진 각 변환에 대한 하나의 다이어그램이 포함되어 있습니다. 내부 케이스 구조의 각 케이스에는 두 개의 입력인 불리언 값 (변환이 수행되어야 하는지를 지정)과 열거형 상수 (어떤 변환이 수행될지 지정)가 있습니다.

 

루프 인덱스를 입력으로서 케이스 구조에 사용함으로써 이 코드는 “참” 불리언 출력으로 다이어그램을 찾을 때까지 각 변환 케이스를 하나씩 효율적으로 실행합니다. “참” 불리언 출력을 찾은 후에 케이스는 변환이 수행되는 새로운 상태로 이동합니다. 이 방식이 이전 방식보다 약간 복잡하게 보이긴 하지만, 루프 인덱스의 출력을 열거형을 “캐스팅”함으로써 변환에 이름을 추가하는 기능을 제공합니다. 이 같은 장점을 통해 “자동 문서”를 변환 코드에 추가할 수 있습니다.

 

 

 

3. 예제 – 콜라 머신

이 어플리케이션에는 다음과 같은 요구조건이 있습니다:

 

모든 콜라 제품은 50센트에 판매

이 머신은 5센트, 10센트, 25센트만 수용

정확한 거스름돈은 필요 없음

동전을 주입하는 프로세스 동안 거스름돈은 언제든 반환 가능

 

첫 번째 단계는 상태 다이어그램을 생성해야 할 것입니다. 이를 생성하기 위한 몇 가지 방식이 있지만 상태가 많으면 효율성이 떨어진다는 점을 명심합니다.

 

이 예제에서 상태 다이어그램은 8개의 상태를 가지게 될 것입니다. 이 상태들은 다음을 사용하게 됩니다:

1) INIT – 콜라 머신 초기화

2) WIAT FOR EVENT – 머신이 동전 주입을 기다림

3) RETUREN CHANGE – 머신이 거스름돈을 반환

4) 콜라 제품 – 머신이 음료수를 제공하기 위해 50센트 또는 그 이상의 센트를 주입 받음

5) 25센트 – 소비자가 25센트 주입

6) 10센트 – 소비자가 10센트 주입

7) NICKEL – 소비자가 5센트 주입

8) EXIT – 거스름돈이 반환 및/또는 음료수가 제공된 후 머신은 꺼짐 (어플리케이션 종료)

 

그림 4

상태 다이어그램이 완성되었으므로 이제 LabVIEW 상태 머신 어플리케이션을 시작할 준비가 되었습니다. 

 

 

4. 중요 정보

상태 머신, 코드 중복(redundancy) 및 열거형 변수 사용을 생성할 때 주의해야 할 몇 가지 사항이 있습니다

 

코드 중복

문제: 상태 머신의 생성에서 가장 어려운 부분은 상태 다이어그램에서 가능한 상태들을 차별화시키는 것입니다. 예를 들어, 콜라 머신 상태 다이어그램 (그림 4)에서 어떤 유형의 동전이 주입되었는지에 따라 한 상태에서 다른 상태로 이동하는 “응답 대기가 아닌 0, 5, 10, 20, 25, 30, 35, 40, 45, 50 센트 상태를 가질 수 있습니다. 이는 정확하게 동일한 케이스 다이어그램으로 11개의 다른 상태를 생성하게 됩니다. 중복되는 코드는 보다 큰 규모의 어플리케이션에서 큰 문제가 될 수 있습니다.

 

솔루션: 다른 상태들이 동일한 케이스 다이어그램을 가지고 있을 경우, 이 상태들을 하나의 상태에 결합시키도록 합니다. 예를 들어, “응답 대기” 상태는 코드 중복을 피하기 위해 생성됩니다.

 

열거형 변수 사용

문제: 열거형은 상태 머신에서 케이스 선택자로 널리 사용됩니다. 사용자가 이 열거형에서 상태를 추가하거나 삭제하려고 할 경우, 열거형의 복사본들에 남겨진 연결된 와이어들이 깨지게 됩니다. 이는 열거형으로 상태 머신 구현 시 가장 흔하게 부딪히는 문제 중 하나입니다.

 

솔루션: 이 문제는 두 가지 해결방법이 있습니다.

1. 모든 열거형 변수가 변경된 열거형 변수에서 복사된 경우, 와이어 깨짐이 사라질 것입니다.

2. 열거형으로 새 컨트롤을 생성하고 서브메뉴에서 “타입정의”를 선택합니다. 타입정의를 사용함으로써, 모든 열거형 복사본들은 사용자가 상태를 추가하거나 제거할 경우 자동으로 업데이트되게 됩니다.

 

728x90
반응형
그리드형