MoonNote

반응형
     

 

 

 

이벤트 구조 심화편(Advanced Event Structure)

이번 시간에는 지난번 다루어보았던 이벤트 구조(Event Structure)에 대해 좀 더 알아보는 시간을 가지도록 하겠습니다. 이벤트 구조의 동작만 알아도 LabVIEW에서 사용하는데 크게 문제가 없기 때문에 따로 지난 시간에 언급드리진 않았는데요. 한번 사용해보았으니 이제 자세히 리뷰를 해보도록 하겠습니다. 이벤트 구조에 대해서 잘 기억이 안나시는 분들은 이전 포스팅 내용을 한번 정독하시고 본문을 읽어주시길 권장드립니다.

 

랩뷰(Tutorial) 17 | 이벤트 구조(Event Structure)

이벤트(Event)란, 프로그래밍에서 이벤트라고 하면 '지정한 조건에서의 특정 기능이 실행'되도록 하는 것입니다. 프로그래밍 언어가 익숙하신 분들은 어렵지 않겠으나 반대로 '굳이 써야하나..?'

moonnote.tistory.com

 

 이벤트 구조는 크게 정적 이벤트(Static Event)동적 이벤트(Dynamic Event)로 나뉘어집니다. 일반적으로 많이 사용하는 이벤트 구조 기능은 바로 정적 이벤트(Static Event)입니다. 정적 이벤트도 내부적으로 알림 이벤트(Notify Event)필터 이벤트(Filter Event)로 세분화 되는데 이해를 돕기 위해 이미지로 한번 표현해 보았습니다.

 

이벤트 구조 블록도(Event Structure Block Diagram)

 

 

정적 이벤트(Static Event)

 정적(Static)이란 한번 정해지면 변하지 않고 계속 유지되는 성질을 보통 정적이라고 말합니다. 프로그램에서는 생성된 객체(Object), 즉, 랩뷰에서는 컨트롤 또는 인디케이터를 말하겠죠?😉 이러한 객체에 정해져 있는 특성 중 하나를 선택하여 이벤트를 걸어주는 것입니다. 예를 들어, 불리언 버튼을 하나 생성하여 버튼이 가지고 있는 '값 변경', '키 누름', '마우스 다운', '마우스 업', '마우스 휠' 등과 같은 버튼이 가지고 있는 프로퍼티 중 하나에 이벤트를 거는 것이라고 보면 되겠습니다. "객체의 타입에 따라 정해져 있는 특성(Properties)에 이벤트를 걸어준다!"라고 생각하시면 되겠네요. 정적의 개념을 설명드리고 싶어 개인적으로 예시를 들어 말씀드렸으나 자세한 내용이 궁금하신 분은 추가 검색 부탁 드립니다. 우리가 지난 시간 사용해보았던 버튼의 값 변경 이벤트가 바로 정적 이벤트(Static Event)인 것이죠. 참고를 위해 이전 챕터의 이미지를 재활용해보았습니다.

'이벤트 추가...' 메뉴 선택 후 정지 버튼에 대한 "값 변경" 이벤트 설정 화면

 

알림 이벤트(Notify Event)와 필터 이벤트(Filter Event)

정적 이벤트 내에서도 알림 이벤트와 필터 이벤트로 분류된다고 했었는데요. 한번 살펴보도록 겠습니다. 이벤트 편집 패널의 이벤트 아이템 중 특정 이벤트들은 동일한 이벤트임에도 불구하고 녹색 화살표빨간 화살표(네이밍 끝에 ?로 표시)로 두 개가 표시되어 있는 것을 확인할 수 있습니다. 녹색이 알림 이벤트, 빨강이 필터 이벤트입니다.

 

알림 이벤트(Notify Event)와 필터 이벤트(Filter Event)

 

보통 우리가 사용하는 이벤트는 녹색 화살표로 표시된 알림 이벤트인데요.

알림과 필터의 차이점은 LabVIEW 도움말에서는 다음과 같이 설명하고 있습니다.

  LabVIEW 도움말 참조

알림 : 알림 이벤트는 사용자 작업이 발생했다는 것을 알립니다.
 필터 : 필터 이벤트를 사용하면, LabVIEW가 해당 이벤트와 연계된 기본 동작을 수행하기 전에 사용자가 이벤트 데이터를 검증하거나 변경할 수 있습니다. 또한 변경 사항이 VI에 영향을 주는 것을 방지하려면 이벤트 전체를 무시할 수 있습니다.

 

위의 내용을 요약해보자면 알림 이벤트의 경우 이벤트 발생 시 바로 기본 동작을 수행하고 필터 이벤트의 경우 동작 수행 전 한 번의 검증 또는 변경이 가능하도록 말 그대로 필터링 처리를 하는 것입니다. 랩뷰 코드로 한번 살펴보겠습니다. 이벤트 구조를 하나 생성하여 '패널 닫기'(알림 이벤트)'패널 닫기?'(필터 이벤트) 이벤트를 추가합니다. 그러고나서 두 이벤트 케이스를 비교해보면 필터 이벤트 같은 경우 우측에 이벤트 필터 노드가 있는 것을 보실 수 있습니다.

 

좌 : 패널 닫기(알림 이벤트), 우 : 패널 닫기?(필터 이벤트)

 

알림 이벤트의 경우 패널 닫기 이벤트 발생 시 이벤트 케이스 구조 안의 코드와 패널 닫기 동작이 바로 실행됩니다. 즉, 윈도우 창이 닫혀버리는거죠. 필터 이벤트의 경우 이벤트가 발생하여도 코드 및 동작 수행 전 이벤트 필터 노드에 의해 이벤트 데이터를 한번 식별하는 것이죠. 위의 이미지에 보이는 '버림?'이라는 이벤트 필터 노드에 True 값을 설정하게되면 패널 닫기 버튼(X 표시 버튼)을 눌러도 기본 동작을 버림 처리하였기 때문에 창이 닫히지 않게 됩니다. While문에 이벤트 구조를 사용한 아래의 코드를 예시로 돌려보겠습니다.

필터 이벤트 - 닫기 동작 '버림?' 설정

 

코드를 보시면 '패널 닫기?' 이벤트에서 '버림?' 필터 노드와 While문의 조건 터미널에 모두 True 값을 설정하였습니다. 코드를 실행하고 닫기를 누르면 위의 설명하였던 대로 패널 닫기 동작은 무시하고 이벤트 데이터 안에 작성된 코드, 예시에서는 True 상수가 While 문 조건 터미널로 값을 전달하면서 While문에 종료됩니다. 패널 닫기 동작은 무시, 루프 정지 조건 코드는 실행이라고 보시면 되겠습니다. 실행 화면입니다.

 

 

 

동적 이벤트(Dynamic Event)

 동적이란 정적과는 반대의 개념으로 계속해서 변하는 성질을 말합니다. 즉, 특정 상황에서만 발생하는 이벤트를 사용자가 다이나믹하게 설정할 수 있는데요. LabVIEW에서는 블록다이어그램 [이벤트 등록] 노드를 사용하여 출력되는 다이나믹 이벤트 참조를 이벤트 구조에 연결해서 사용해야 합니다. [이벤트 등록] 노드는 함수 팔레트 >> 대화 상자 & 이벤트 케이스 >> 이벤트 >> 이벤트 등록에 위치해 있습니다.

[이벤트 등록] 노드 위치

 

사용법은 사용자가 등록하고자 하는 이벤트를 이벤트 소스에 와이어링 시켜줍니다. LabVIEW에서 이벤트를 발생시키려면 객체의 참조([VI 서버 ] 노드) 값을 얻어야지만 되는데, 이벤트 소스에 와이어링 시키는 타입으로 객체 참조 또는 [사용자 이벤트 생성] 노드에서 출력되는 사용자 이벤트 출력이 있습니다. LabVIEW에서는 다이나믹 이벤트 등록시 기존 등록을 수정할 경우에만 이벤트 등록 참조 번호를 연결하라고 권장하고 있으니 참고하시기 바랍니다. 이 외 자세한 사항은 LabVIEW 도움말을 살펴보시면 되겠습니다. 아래는 객체 참조와 사용자 이벤트 출력을 다이나믹 이벤트로 설정한 예시 이미지입니다.

 

이벤스 소스 연결 - 참조 or 사용자 이벤트

[이벤트 등록] 노드에서 출력되는 다이나믹 등록 참조 번호를 이벤트 구조에 등록하려면 이벤트 구조 우클릭 메뉴에서 '다이나믹 이벤트 보이기' 항목을 활성화하여 아래의 이미지 처럼 연결시켜주면 됩니다.

다이나믹 이벤트 설정 구조

 

위의 이미지처럼 등록을 완료하였다면 이벤트 편집 패널에서 이벤트 선택시 다이나믹 항목이 활성화되면서 직접 설정한 이벤트 목록들이 리스트에 나타나는 것을 확인하실 수 있습니다.

다이나믹 이벤트 소스

 

한번 실습을 해보기위해 두 다이나믹 이벤트를 모두 추가하여 이벤트 발생시 While문의 조건 터미널에 True 값을 연결해보겠습니다.

다이나믹 이벤트 추가 (#Event1 : 정지 버튼 '값 변경', #Event2 : 사용자 이벤트)

 

그리고나서 이벤트 구조에 타임 아웃 5초를 설정하여 타임 아웃시 사용자 이벤트를 발생시켜보는 코드를 작성해보겠습니다. [사용자 이벤트 발생] 노드는 이벤트 등록 노드와 동일하게 함수 팔레트 >> 대화 상자 & 이벤트 케이스 >> 이벤트 >> 사용자 이벤트 발생에 있습니다.

이벤트 타임아웃 설정 및 사용자 이벤트 발생

 

자 이제 코드 실행과 관련된 작성은 모두 끝났습니다. 나머지 부분은 크리티컬하진 않으나 VI가 실행을 마치고나면 기존의 LabVIEW에서 할당하여 잡고있던 참조 리소스들을 메모리에서 지워주기 위해 [사용자 이벤트 삭제]와 [이벤트 등록 해제] 노드를 이용하여 깔끔하게 지워주도록 합니다.

 

코드를 한번 실행해보면 정지 버튼을 누르거나 사용자 이벤트 발생(타임아웃 5초 경과)시 코드가 종료되는 것을 확인하실 수 있습니다.
(최초 실행 : 5초 기다리고 사용자 이벤트가 발생하여 코드 종료, 두번째 실행 : 정지 버튼을 눌러서 종료)

 

이상으로 LabVIEW 이벤트 구조 심화편(Advanced Event Structure)에 대한 포스팅을 마치도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

※ 이 글이 도움이 되었다면 "👆🏻구독"과 "🤍공감" 버튼을 클릭해주세요. 클릭 한번이 글 쓰는데 큰 힘이 됩니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band