LabVIEW
LabVIEW의 설치와 기본적인 프론트패널 및 백패널 구성에 대해서 알아보았으니
프론트패널 및 백패널에 있는 각 구성요소들에 대해서 설명을 해보려고 했었어요.
AI가 등장하기 전, LabVIEW 수업을 수강하였을 때는 알려준 내용 외의 것을 알아내려면
구글에 검색하거나, LabVIEW 내의 검색 도구를 써서 원하는 것이 맞는지 확인해야 했었거든요.
그런데 요즘은 AI가 있어서, 원하는 요소가 있다면 물어보면 다 알려주더라구요..?
엉성하지만 대략적인 구성도 보여주고요.
(물론 AI가 아직까지는 완벽하지 않아서 틀리는 경우도 많지만, 문제 해결 방안의 아이디어는 참 잘 찾아요)
그래서 어떤 내용으로 써볼까 고민을 좀 해봤어요.
그러다가 문득 떠오른 것이, 이전에 학교 기말프로젝트로 하다가 완성하지 못했던 파일이 하나 있거든요.
그 당시에는 AI도 없었고, 제가 코딩에 대해서 아예 몰랐던 시절이였는데
지금은 제가 파이썬 코딩을 아주 조금이나마 배우면서 대략적인 작동 원리도 예상할 수 있게 되었어요.
그래서 그때 만들어놨던 미완성 파일을 완성해보기로 했어요.

위 스크린샷에서도 볼 수 있듯이, 잘 작동하는 것을 볼 수 있어요.
이전 미완성본은 일부 기능이 동작하지 않았거든요.
사실 이 파일은 현재 글을 쓰고 있는 시점보다 몇달 전에 이미 완성은 되었어요.
그래서 이 파일에 관한 내용을 올리려고 했는데, 아는 후배가 자신도 이 프로젝트를 받았다고 하더라구요.
그렇다면 제가 이걸 그냥 공개해버리면, 기말프로젝트 정답지가 그대로 풀려버리는 셈이기 때문에
열심히 한 후배의 노력에 찬물을 끼얹지는 않을까 우려가 되었어요.
(물론 제 블로그가 유명한 블로그도 아니라서 큰 의미는 없어보이기는 하지만요)
그래서 공개를 미루다가 갑자기 생각나서 오늘 글을 쓰게 되었네요.
이번 글에서는 이 프로젝트가 대략 어떤 내용이고,
이 프로젝트를 받게 될 후배들이 마주하게 될 몇 가지 문제에 대한 해결책을
그대로 제시해보려고 해요.
프로젝트 해결 아이디어 설명
먼저, 이 과제의 주제는 "공기 저항을 받는 포물선 운동" 이에요.

과제에서 가장 중요한 부분인 프론트패널부터 먼저 살펴보도록 할게요.
좌측에는 조작부, 우측에는 디스플레이로 구성되어 있고, 조작에 따른 결과를 실시간으로 볼 수 있도록 구성하였어요.
상단의 Radio Buttons (선택하는 버튼)은 Movement, View Vector 라는 이름으로 만들었어요.
Movement 패널에서는 Reset 을 누를 경우 항상 초기 상태로 돌아가야 하고,
Show Movement 는 시뮬레이션이 작동해야 하며, Pause 는 시뮬레이션이 즉시 일시정지 되어야 해요.
View Vector 패널에서는 No Vector 를 선택할 시 벡터를 표현해주지 않지만, Velocity 를 선택할 경우 현재 속도를,
Acceleration 을 선택할 경우 현재 가속도를, Vx Vy |V| 를 선택할 경우 속도 벡터와 X 및 Y 성분을 보여주도록 해야 해요.
그리고 초기 높이를 설정할 수 있어야 하므로 Initial Height 부분을 추가하였고,
초기 속도도 설정할 수 있어야 하므로 Initial Velocity 부분을 추가하였고,
공기저항도 설정할 수 있어야 하므로 Resistance 부분을 추가하였고,
투사 각도를 설정할 수 있어야 하여 Projection Angle 부분을 추가했어요.
마지막으로 맨 밑의 Cal Ratio는 1로 설정할 경우 현실의 1초가 시뮬레이션의 1초와 같아요.
이제 이를 구성하기 위한 블록다이어그램을 올려드릴게요.

(삼중 While문이 있는 것을 보고 충격받으신 분이 있으실 수도 있지만..)
기본적인 블록다이어그램 구성은 다음과 같아요.
입력 -> 연산 -> 배열 -> 그래프
수정 전에는 위 연산들을 전부 연산자들로 처리했었는데, 가독성과 수정이 너무 어려워서
Formula Node 를 사용한 수식으로 변경했어요.

Formula Node 는 C언어 문법을 사용한다고 해요.
필요한 수식이 있다면 AI에게 C언어를 이용해서 표현해달라고 하면 잘 정리해줘요.
위 수식은 k=0일 때 0으로 나눌 수 없어 생기는 오류를 처리하기 위해 if 문을 통해 예외를 만들어 준 것이에요.

실시간으로 디스플레이에 결과를 표시하기 위한 방법으로
루프가 반복될때마다 그래프에 표시할 데이터를 갱신하는 방법을 쓰기로 했어요.
새로 계산된 데이터를 이전 데이터와 합치기 위해 피드백 루프를 만들어서 Array로 구성하였고
각각의 X, Y 성분을 Cluster로 묶어서 (X, Y) 점들로 구성된 데이터를 만들어서 그래프에 선 하나를 그려요.
그리고 이렇게 그려진 선들을 Cluster Array로 묶어서 XY 그래프에 전달하면
여러 선들이 하나의 그래프로 나타나게 되는 것이죠.

Radio Buttons 를 이용해서 선택에 따라 서로 다른 결과를 내기 위해서는 Case Structure 와 같이 사용하면 좋아요.
Radio Buttons 을 Case Structure 의 ? 부분에 연결하게 되면 연결이 되는데,

이때, Case Structure 의 테두리 부분을 마우스 오른쪽 버튼으로 클릭하여 메뉴를 열게 되면,
Add Case for Every Value 라는 부분을 찾을 수 있는데, 해당 버튼을 눌러주세요.
그러면 Case Structure 와 연결된 Radio Buttons 의 각 Case 들이 자동으로 등록되어서 편해요.

이 프로젝트는 포물선 운동하는 공이 바닥에 닿게 되면 자동으로 종료되어야 해요.
따라서, 공의 높이인 y 값이 0 혹은 그보다 작게 되면 종료되는 모습을 볼 수 있어요.
혹은, 아까 보셨던 Radio Buttons 의 Reset 부분의 신호가 와도 루프를 즉시 종료하게 되는데,
이는 초기 상태로 돌아가는 역할을 해요.

제일 바깥쪽에 위치한 While 루프는 안쪽 루프를 초기화하고 재시작하기 위해 존재해요.
안쪽 While 루프가 종료되자마자 바깥쪽 While 루프가 자동으로 안쪽 루프를 재시작 시키는 것이죠.
이것이 Reset 기능의 핵심이라고 할 수 있어요.
그런데 이걸 그냥 두면 안쪽 루프 내부의 값은 초기화 되지 않은 상태거든요.
따라서, 피드백 루프와 그래프 데이터들을 전부 지워줘야 해요.

Move Initializer One Loop Out 을 눌러주면 위에서 본 것과 같이
초기화 부분만 분리해서 루프 밖으로 빠져나가요.
이때, LabVIEW 내부에서 어떤 순서로 연산하는지 정확히는 모르겠지만
Initializer 를 왼쪽에 두지 않으면 뭔가 오류가 발생하더라구요.

그래프 데이터를 초기화하는 것은 별도의 선을 연결하거나 하면 귀찮아지기 때문에,
Local Variable 을 통해 그래프에 직접 초기값 데이터를 집어넣어버려서 해결할 수 있어요.

가장 안쪽의 While 루프는 오직 Pause 기능만을 위해 존재해요.
While 루프 안에 While 루프를 두면, 안쪽 루프가 끝나기 전 까지는 바깥쪽 루프가 작동하지 않는다는 것을 이용한 것이죠.
만약 Radio Buttons 에서 Pause 에 해당하는 값이 입력되면 해당 루프가 작동하기 시작해요.
그러면 바깥쪽 루프는 작동하지 않겠죠. 저 루프가 종료되기 전에는 말이죠..
물론 Pause 버튼이 있기는 하지만, 그걸 라디오 패널로 작동시킬 수는 없었거든요.
일시정지를 하고, 다시 풀 수가 없었어요.
(똑똑한 사람들은 어쩌면 해답을 찾으셨을지도 모르지만 저는 아니였어요..)
여기 적은 내용들은 제가 이 프로젝트를 하면서 가장 고생했던 부분들이에요.
혹여나 더 궁금하신 점이 있다면 댓글로 물어봐주시면 최대한 열심히 답변드릴 수 있도록 할게요.
(물론 제가 그렇게 글을 자주 확인하지는 않아요..)
마지막으로 제가 만들었던 .vi 파일 자체를 올려드릴게요.
보면서 참고가 되시기를 바래요.
이 글은 제가 스스로 공부하며 이해한 내용을 정리하기 위해 쓰여졌어요.
만약 이 글의 내용에 오류가 있다면, 저와 다른 사람을 위해 댓글로 지식을 나누어주세요!
'학습 > LabVIEW' 카테고리의 다른 글
| [LabVIEW] 백패널과 프론트패널 (0) | 2025.11.06 |
|---|---|
| [LabVIEW] LabVIEW 설치 (0) | 2025.09.27 |