랩뷰의 루프(Loop) 사용하기
- LabVIEW 랩뷰/Labview 랩뷰 강의
- 2021. 1. 10.
프로그램 자동화에서 빠질 수 없는 것이 반복 작업입니다. 저도 또한 반복 작업을 하기 싫어서 코딩을 하죠. 특정 작업을 반복하도록 해 주는 구조 중 하나가 루프(Loop)입니다. 루프는 비단 랩뷰 뿐만 아니라 다른 텍스트 기반의 프로그램 언어에서도 항상 초반에 언급되는 구조입니다.
1. 루프의 개념
예를 들어 '전압을 측정한다' 라는 행위를 프로그램으로 작성했다고 하면 알고리즘은 아래와 같습니다.
이제 '전압을 측정한다'라는 코드를 10번 반복하기 위해서 할 수 있는 것은 어떤 게 있을까요?
- 프로그램을 10번 실행한다.
- 코드를 10번 반복하게 만들고, 프로그램을 1번 실행한다.
이렇게 두 가지 방법이 있습니다. 하지만 첫 번째는 자동화라고 하기에는 모자란 부분이 있지요. 프로그램 사용자가 프로그램을 10번을 수동으로 실행시켜야 하니까요. 우리는 귀찮은 일을 반복하기 싫잖아요? 그러면 알고리즘을 어떻게 바꿔야 할까요? 프로그램에서 횟수를 세면서, 10번 반복하게 하면 됩니다.
위의 알고리즘에서 횟수=0 일때 전압을 측정한다는 행위를 1번 하고, 횟수=1일때 2번, ... , 횟수=9일때 10번을 하게 됩니다. 이렇게 특정 조건을 만족할때까지 행위를 반복하게 하는 구조를 루프라고 합니다.
2. While 루프 : 특정 조건까지 반복
While Loop(와일 루프)는 프로그래머가 지정한 조건까지 루프를 반복하도록 합니다. [알고리즘 2]에서 [(횟수 > 8)인가?] 를 만족하는지 묻는 조건이 루프를 끝낼 것인지, 루프를 반복할 것인지를 결정하는 조건입니다. 만약 아래처럼 결정 조건을 [(횟수 < 0)인가?]로 알고리즘을 작성하면 어떻게 될까요?
횟수는 전압을 측정할 때마다 0이거나 0보다 크게 되므로 횟수는 영원히 0보다 작을 수 없습니다. 따라서 [알고리즘 3]은 영원히 NO 를 통해 전압을 측정하고, 종료되지 않습니다.
이렇게 While 루프는 위에서 알아본 루프의 반복 횟수 뿐만 아니라 '루프의 종료 조건'을 프로그래머가 결정하여 루프를 계속 하게 할 수도 있고, 종료할 수도 있습니다. 루프가 끝나지 않으면 안되는 것 아니야? 라고 생각하실 수도 있지만 루프가 끝나지 않도록 하는 무한 루프를 일부러 사용하는 경우도 있습니다(임베디드 시스템의 프로그램 같은 경우).
랩뷰에서는 블록 다이어그램 함수 팔레트에서 Structures - While Loop 를 클릭하여 루프를 생성할 수 있습니다.
생성된 While 루프에서 보이는 부분에 대해서 알아보도록 하겠습니다. 왼쪽 아래에 i 라고 나타난 터미널은 랩뷰의 While 루프에서 기본적으로 제공하는 루프의 반복 횟수를 카운트해주는 터미널입니다. 오른쪽 빨간색 조건 터미널은 루프의 반복 여부를 결정합니다. 조건 터미널에 불리언(참/거짓)을 연결하여 루프를 종료할 것인지 계속 할 것인지를 결정합니다. [알고리즘 2]에서는 [(횟수 > 8)인가?] 라는 조건의 결과가 참/거짓(YES/NO)으로 나타나므로 이 조건의 결과를 조건 터미널에 연결하면 됩니다.
[알고리즘 2]를 랩뷰에서 만들어 보면 아래와 같습니다. 전압을 측정하는 VI는 Agilent사의 E34401(Digital Multimeter) 제품의 Single Point 측정 함수를 사용했습니다. 이 함수는 랩뷰에서 기본적으로 설치되는 VI이고 블록 다이어그램 함수 팔레트의 Instrument I/O - Instr Drivers - Agilent 34401 - Data - Read.vi 입니다. 해당 함수를 사용하는 방법은 나중에 계측기 측정하는 방법을 다루는 강의에서 설명하겠습니다.
i 를 8과 비교하기 위해서 블록 다이어그램 함수 팔레트에서 Comparison - Greater? 함수를 사용했습니다. Greater? 함수는 아래와 같이 입력 터미널 두 개를 비교하여 x가 y보다 큰지를 판정하고, 출력 터미널에서 불리언(참 또는 거짓)을 출력합니다.
하지만, 위 프로그램은 [알고리즘 2]와 정확히 동일하지 않습니다. 왜냐하면 [알고리즘 2]는 '전압을 측정한 후에 -> 횟수를 더하고 -> 횟수를 비교' 하는 순서가 있습니다. [강의 8. 경합 조건]에서도 설명했듯이 위처럼 프로그램을 작성하면 전압을 측정하는 행위와 i>8 을 비교하는 행위는 경합 조건이며, 어떤 것이 먼저 실행되는지 알 수 없습니다.
따라서 [알고리즘 2]와 같이 순서를 반드시 지켜야 하는 알고리즘이라면, 아래와 같이 코드를 작성해야 경합 조건이 없어지고 순서대로 실행하게 됩니다. 처음에는 전압을 측정하고, 플랫 시퀀스 구조로 들어가 횟수에 +1을 한 후, 8과 비교합니다. 여기서 더한 횟수를 저장하고 있다가, 다음 루프가 반복하여 시작할 때 그 값을 돌려주는 루프의 기능이 시프트 레지스터(Shift Register)입니다.
- 시프트 레지스터(Shift Register)란?
시프트 레지스터는 랩뷰의 반복 구조에서 루프의 반복 간에 데이터를 전달하는 방법입니다. 루프 구조를 사용하면서 많이 사용하게 되는 기능이며, 일종의 메모리라고 생각하면 쉽겠습니다. 시프트 레지스터를 만들면 한 쌍(왼쪽의 아래 화살표, 오른쪽의 위 화살표)이 만들어집니다. 왼쪽 터미널은 시프트 레지스터의 출력, 오른쪽 터미널에서는 시프트 레지스터에 값을 저장합니다.
시프트 레지스터는 루프의 경계선을 오른쪽 클릭하여 Add Shift Register를 클릭하면 만들 수 있습니다.
시프트 레지스터는 아래와 같은 기능이 있습니다.
- 시프트 레지스터 초기화 : 메모리를 초기화한다.
- 시프트 레지스터 출력 : 메모리에 저장된 값을 출력한다.
- 시프트 레지스터 저장 : 메모리에 값을 저장한다.
만약 루프 밖에서 시프트 레지스터를 초기화하지 않으면 메모리에 저장되어 있던 값이 다음 프로그램을 실행할 때 출력됩니다.
추가적으로 다층 시프트 레지스터로 이전에 저장된 값을 순차적으로 볼 수 있는 기능을 제공하는데, 시프트 레지스터의 왼쪽 출력 터미널을 아래로 드래그하면 다층 시프트 레지스터를 만들 수 있습니다. 다층 시프트 레지스터는 루프가 반복될 때 저장하는 메모리를 여러 개 사용하여 과거의 저장 값을 확인할 수 있습니다. 저는 자주 쓰는 기능은 아닙니다.
3. For 루프 : 특정 횟수를 반복
For 루프는 While 루프의 일종으로 루프의 종료 조건을 '반복 횟수'로 제한하는 것입니다. 따라서 For 루프를 만들 때에는 반드시 루프의 반복 횟수를 정해줘야 합니다. For Loop를 생성하면 왼쪽 위에 [N]이 나타나는데, 이것이 카운트 터미널로 루프의 반복 횟수를 지정해 주어야 합니다.
아래처럼 카운트 터미널에 5를 연결해 두면 For 루프는 총 5회 실행되어, Numeric 인디케이터는 최종적으로 5가 됩니다.
(2023-01-09 수정)
'LabVIEW 랩뷰 > Labview 랩뷰 강의' 카테고리의 다른 글
루프와 함께 배열 다루기 (2) | 2021.01.13 |
---|---|
랩뷰 배열 다루기 (0) | 2021.01.11 |
경합조건 : 랩뷰의 코드 실행 순서 (0) | 2021.01.08 |
랩뷰 데이터 구조 알아보기 (0) | 2021.01.08 |
컨트롤, 인디케이터란 무엇인가? (0) | 2021.01.07 |