MoonNote

반응형
     

 

 

 

지금까지 다루었던 반복문, 분기문, 시프트 레지스터, 타이밍 함수 등을 이용하여 스톱 워치와 알람 기능을 만들어보도록 하겠습니다. 혹시라도 해당 포스팅을 처음 보시거나 랩뷰를 처음 사용하시는 분들이 계시다면 앞에서 다루었던 Tutorial 10 ~ 15까지는 한번 정독 후 본문을 읽어주시기 바랍니다. 그럼 한 Step씩 랩뷰 실습을 해보도록 하겠습니다.

 

 

기본 UI 제공 파일

UI가 만들어져 있는 파일은 아래에 첨부한 vi를 다운로드하시거나 직접 버튼 3개, 숫자형 인디케이터 1개를 생성하셔도 무방합니다.

 

스톱워치 UI 화면
Stopwatch.vi
0.01MB

 

순서도(Flow chart)

보통 코드를 작성할 때 우리는 순서도, 알고리즘 또는 로직이라고 일컫는 블록도를 한번 설계해보고나서 그걸 참고하여 코드를 작성하는데요. 이번 실습에서 만들어볼 스탑워치에 대한 순서도(Flow chart)입니다.

 

Stop watch 순서도(flow chart)

 

스탑 워치

1. While 루프 생성 : Main 루프용 While문을 블록다이어그램에서 하나 생성합니다.

 

2. 시프트레지스터 생성 : 타이머 정보를 저장할 시프트 레지스터 하나를 생성합니다.

 

3. While문 안에 Case 구조를 하나 생성하고 조건 터미널에 정지 버튼을 생성합니다.

 

정지 버튼을 생성하였다면 프런트 패널에 버튼이 하나 더 추가된 것을 확인하실 수 있으실 겁니다. 저는 아래 이미지처럼 적절히 사이즈를 조절하고 버튼을 패널 하단부에 위치시켰습니다. 아래는 참고 이미지이며 그럼 다시 이어서 코드를 작성해보도록 하겠습니다.

 

4. "타이머(Numeric, DBL Type)"의 숫자형 상수를 생성하고 시프트 레지스터 초기 값 설정에 와이어링 시켜줍니다.

5. 타이머 최소 단위가 0.01s(10ms)로 While문의 루프 타임을 10ms로 설정해줍니다. 함수는 [기다림] 또는 [다음 ms 배수까지 기다림] 중 어떤 것을 사용하셔도 무방합니다.

6. Reset 버튼을 케이스 구조 선택 터미널과 와이어링 시켜주고, "참" 케이스 내부에 Time 리셋 값을 상수를 이용해 0으로 지정합니다.

7. While 루프 하단부에 똑같이 시프트레지스터를 하나 생성하고 "참" 케이스 안에 [Tick 카운트(ms)] 노드를 놓은 후 함수에서 출력되는  ms 타이머 값을 새로 생성한 시프트 레지스터에 와이어링시켜줍니다.

8. UI를 구성하면서 생성된 Stop Watch 인디케이터(Numeric, DBL Type)를 케이스 우측 바깥 쪽에 있는 Time 정보와 와이어링 연결시켜줍니다.

9. "거짓" 케이스에서는 Start/Stop 버튼 누름 유무에 따라서 Time 값을 카운팅할지, 그대로 유지할지 결정짓는 코드를 작성할 건데요. 여기에서도 Start/Stop 버튼 유무에 따른 분기가 이루어지므로 케이스 구조를 아래의 그림처럼 하나 더 안쪽에 생성하여 줍니다.

 

TIP
 
 

# 코드 스타일에 정답은 없지만 지금 실습하는 것처럼 케이스 구조 안에 케이스 구조를 계속해서 넣는 방식을 일명 "양파 껍질 구조"라고 부릅니다. 조건이 많아 질수록 가독성이 떨어지고, 코드 해석이 어려워지기에 권장하는 방법은 아님을 기억하도록 합시다. 본문에서는 아직 디자인(Design Pattern)을 배우지 않았고 간단한 조건에 대해서만 판별하기에 2중 케이스를 사용한 것일 뿐 좋은 방법은 아니기에 이런 습관을 지양하는 것이 추후 규모가 큰 코드를 짜야할 때 도움이 될 것입니다.

 

이제 여기서 Start/Stop 버튼을 누를시 "Start" 기능을 수행하여 경과 시간 체크를 시작하고 Stop watch 인디케이터에 경과 시간을 Display 해줍니다. 경과 시간 기능에 대해서는 따로 언급하지 않으니 잘 모르시는 분들께서는 이전 포스팅의 랩뷰(LabVIEW) Tutorial 15 | 타이밍(Timing) 함수의 경과 시간 확인하는 방법 내용을 참조해주시기 바랍니다.

 

10. 경과 시간 기능을 하는 코드를 제일 안쪽 "참" 케이스에서 만들고 이를 Stop watch 인디케이터에 업데이트할 수 있도록 와이어링 해줍니다. (케이스 안에 1000을 나누는 코드가 있는 것은 [Tick 카운트(ms)]에서 출력되는 값은 기본적으로 ms 단위이므로 이를 s 단위로 변경시켜 준 것임을 참고하도록 하자.)

 

11. 나머지 제일 안쪽의 "거짓" 케이스는 ¹Start전 상태와 ²Start >> Stop으로 상태 변경된 2가지 경우입니다. 2가지 경우 모두 제일 마지막에 기록된 Time 정보를 Stop watch에 업데이트해주는 것과 Start시 최초 시작 시간 정보를 위한 Tick 카운트 값을 계속 레지스터에 업데이트해주면 됩니다. 코드를 짜면 아래의 이미지와 같습니다.

 

VI 실행 화면

1. Start 버튼을 누를 때

 

2. Stop 버튼 누를 때

 

3. Reset 버튼 누를 때

 

 

이상으로 랩뷰(LabVIEW) 타이밍 함수를 이용한 스톱 워치 만들기 실습을 마치도록 하겠습니다.

 

 

 

 

 

 

 

 

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

공유하기

facebook twitter kakaoTalk kakaostory naver band