이번에는 LabVIEW를 이용하여 스톱워치를 구현해본 것에 대해 정리해볼 예정이다.
바로 전에는 사칙연산 계산기를 구현했었는데, 계산기에 비해서 난이도가 너무 어려워져서 엄청나게 애 먹었던 기억이 난다...
🍀 프런트패널 조건
- 시, 분, 초 : I32, 인디케이터
- 기록, 정지버튼 : 컨트롤
🍀 블록 다이어그램 조건
- VI를 실행시키면 표시된 숫자부터 1초 씩 증가해서 시, 분, 초에 표시
- 정지버튼을 누르면 실행 종료
- 기록버튼을 누르면 기록 표에 번호, 구간기록, 전체시간이 나타남
- 프로그래밍에 필요한 변수는 마음껏 생성가능하나, 프런트패널에 보이면 안됨
- 시간 계산부분을 subVI로 생성

구현한 프런트패널의 모습은 위의 사진과 같다.
블록 다이어그램 부분을 어떤식으로 만들어야될지 고민하다가 전반적인 구조를 생각해보았다.

우선, 시퀀스 구조를 사용하여 맨 처음 시퀀스에 초기화 과정을 진행해주어야겠다고 생각했고, 그 다음 시퀀스에 스톱워치 버튼이 눌림에 따라 동작하도록 만들어주어야겠다고 생각했다.
즉, 0번째 시퀀스에서는 초기화, 1번째 시퀀스 내에는 while 루프를 넣고, 그 안에 이벤트 구조를 넣어주어 기록버튼이 눌렸을 때와, 정지버튼이 눌렸을 때로 나누어주었다.
첫 번째 기록인 경우에는 구간기록과 전체 시간이 같으므로 같은 값을 테이블에 올려주었고, 그 외의 경우에는 내부에 시퀀스 구조를 하나 더 추가하여 계산한 후 테이블에 기록해주었다.
사진에 보면 시*25 + 분*5 + 초라고 되어있는데, 테스트 할 때에는 60초, 60분씩 기다리게 되면 너무 오래 걸려서 5초가 지나면 분이 +1되고, 5분이 지나면 시가 +1 되도록 하였다.

사용한 변수들은 위와 같다.

시간을 계산하는 부분은 따로 SubVI로 생성해주었다.
캡처본에는 5로 되어있지만, 최종적으로는 60으로 수정해주었다.

첫 번째 시퀀스에서는 위에서 말했던대로 초기화를 시켜주었다.
또한, 배열에 삽입 함수를 이용하여 배열을 만든 후 테이블을 만들어주었다.
이 밑으로는 두 번째 시퀀스 내부의 내용이다.

1초마다 전체 초에 +1이 되게 해주었으며, 위에서 설정한 시간계산부분 SubVI를 사용하여 프런트패널의 시, 분, 초에 나타나게 해주었으며, 문자열로 포맷 함수를 이용하여 시분초를 문자열로 나타나게 해주었다.

기록 버튼 값이 변경되었을 때, 첫 번째 기록일 때의 동작부분이다.
구간 기록과, 전체 시간이 동일하기 때문에 그대로 테이블에 나타나게 해주었다.


기록 버튼 값이 변경되었을 때, 첫 번째 기록이 아닌 그 외의 경우의 동작부분이다.

정지 버튼 값이 변경되었을 때의 동작 부분이다.
초를 1초 씩 올려주는 부분을 어떤 방법을 사용해야될지 고민이 많았었는데, 이벤트 구조의 타임아웃이라는게 있다는 걸 떠올리게 되었다. 이벤트를 기다리는 시간을 msec단위로 설정할 수 있는데 이를 이용하여 1초에 값을 1씩 올려주었다.
완전 처음에는 문자열로 포맷이라는 함수가 존재하는지 몰라서 숫자를 10진수 문자열로, 문자열 검색과 대체, 문자열 연결 함수를 사용하여 되게 이상하게 만들었었는데... 피드백을 받은 후 문자열로 포맷이라는 함수를 알게 되었고, 수정할 수 있었다.
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.