Tuesday, September 27, 2011

Labview 공부잘하는 법

 

1단계. LabVIEW 책을 끝까지 본다.
하다가 이해가 안가도 끝까지 보고 "LabVIEW의 여러가지 함수 및 이러이러한 기능이 있다 "
라는 것을 알면 일단 1단계 돌파.
2단계. 쉬운 예제 직접 작성
여기서 중요한 Point... 책은 덮을것. 예제는 가져다 쓰지 말것. 플로우를 작성할 것.
플로우를 모른다면 자신이 뭐를 해야 하는지를 모르는 것 이므로 프로그래머로서의 자질이
없는것이므로 그냥 취미로 공부하는 셈 칠것. %%% 프로그래머로서의 길은 포기
플로우를 작성 했다면 다음 프로그램 코딩.
코딩을 못한다면 자신이 뭐를 모르는지 자각하게 되므로 모르는 부분을 책 및 예제를 다시 봐가면서 공부.
다시 책을 덮고 예제를 덮고 코딩하여 성공하면 또 다른 예제를 작성해 봐서 잘 되면 2단계 돌파.
3단계. 조금 복잡한 예제 작성
3단계의 중요 Point... Flow 개념 파악 : 쉬운 예제는 보통 하나의 Loop 로 끝나는 경우가 많은데 복잡한 프로그램은 각각의 프로그램과 연관을 맺어야 하는데 코딩과정에서 어느부분이 먼저 실행되고 어느 부분이 동시에 실행되는지 정확한 Flow의 개념을 파악해 내야 코딩이 가능.
쉽게말해 여러개의 멀티 Loop라던지 이런 예제를 직접 작성해 보고 흐름을 이해하고 각 루프간의 연관성을 인식하였다면 3단계 돌파.

4단계. Inside LabVIEW

기초적인 부분인데 실제적으로는 간과하는 부분이 많이 있습니다.

4.1 Data Type 공부 (예. Integer -> I8, I16, I32, I64, float 등)

4.2 각종 Element(String, Array, Cluster)들의 Memory Allocation 구조

4.4 각종 Data 변환

이런 것들을 공부해야만 File Access, TypeCast, Flatten String, 통신 등을 활용할 수 있습니다.

4.1 모든 전산 책들을 보면 기초적으로 Data Type, 진법, Logic 등을 처음 파트에 놓습니다.

프로그램을 작성하려면 기본적으로 알아야 하는 상식이죠. 그런데 LabVIEW 공부하는 분들은 이것을 무시합니다.

그러므로 생각치 않은 오류를 범하기도 합니다.

예) uInt8 Type의 변수에 1000의 값을 입력. (uInt8 의 Data 범위는 0 ~ 255)

4.2 통신 함수들은 주로 String Type으로만 이루어 집니다.

그럼 String이 어떤 구조로 Memory에 배치가 되는지 일 예로 알아보죠.

typedef struct {

int32 cnt; /* number of bytes that follow */

uChar str[1]; /* cnt bytes */

} LStr, *LStrPtr, **LStrHandle;

LabVIEW에서는 Large Pascal String type을 사용합니다.

즉 스트링의 갯수 정보를 포함한 Type입니다. 몰라도 프로그램 가능하다는 분도 있을지 모르겠지만 메모리에

어떻게 저장되는지 알아야 Binary File 저장 및 통신등을 자유자재로 활용이 가능합니다.

또한 Using External Language in LabVIEW 에서는 필수로 알아야 하죠.

4.3 각종 데이타 변환은 Numeric Type을 String으로 변환, string 을 숫자로 또는 어레이로 변환 등을 말하는

겁니다.

이런것들은 Binary File 및 Binary 통신에서 주로 사용됩니다. 통신은 VISA, TCP/IP, GPIB, CAN 등등..

5단계. H/W Interface 익히기

Simulation Device 를 지원함으로 비싼 Card가 없이도 공부가 가능합니다. (MAX에서 Simulation Device 생성 가

능)

비록 Analog Input 같은 경우에는 Noise가 약간 낀 sin파가 들어 옵니다만 공부하는데 지장은 없습니다.

Training Kit 가 있는분은 kit에서 공부해도 됩니다.

모든 자원은 OS에서 관리됩니다. (예전 DOS 제외)

그래서 OS에 사용 신청, 사용, 반납 과정을 거쳐야 하죠. 이 기초를 가지고 각종 해당 수집 및 시물레이션에 관

한 부분을 공부해야 합니다.

VISA 통신 (일예 RS-232C) 같은 것도 빈번하게 필요하게 됩니다. 연습은 컴퓨터 2대로 해도 되겠죠.

간단한 ASCII 통신에서부터 Binary 통신 등을 프로그램 하는데 있어서 가장 기본이 되는것은 Protocol 입니다.

계측기, PLC등의 Protocol 은 쉽게 Internet에서 구할 수 있습니다. 그래서 여러가지의 Protocol 을 보고 익히

는게 중요합니다. 이 Protocol은 회사마다 달라서 되도록이면 여러 Protocol을 경험해야 어떤 프로토콜을 사용할

지 선택 내지 만들 수 있는 겁니다.

TCP/IP 통신도 컴퓨터 2대를 가지고 연습하면 되겠죠. 굳이 비싼 H/W 없이 공부 가능합니다.

6단계. Resource 관리

멀티 Tasking 프로그램 작성시 어느 부분은 빠르게 돌아야 하고 어느 부분은 적게 돌아도 되는지 프로그래머가

판단에 의해 지정할 수 있어야 합니다.

그리고 프로그램 실행시 CPU의 사용량을 감시하여 프로그램 내에서 불필요하게 자원을 낭비하는 부분이 있는지

봐야 합니다.

일예로 Graph 를 그리는데 있어서 10mS 마다 실행되는 Loop에 Graph를 Display 하게 되었을때 1초에 100번 뿌려

지게 되겠죠. 그런데 사람이 이것을 인식할 수 있느냐....슈퍼맨만 인식 가능합니다. 즉 불필요한 자원 낭비가

이 경우 입니다.

간단한 프로그램 같은 경우 자원 관리의 중요도는 떨어지나 복잡한 프로그램에서의 자원관리는 프로젝트 성공 /

실패의 요인이 됩니다. 더군다나 아예 처음부터 다시 짜야되는 경우도 생기죠.

7단계. 각종 Property 활용

Labview의 Control 및 Indicator 및 Application 등의 Property 활용을 잘 할때 쯤 이제 웬만한건 짜는 수준으로 올라선 것입니다. Invoke Node 및 Property Node, Reference 등을 자세히 봐야 하겠습니다.
그러나 책에는 이런 것들이 있다는 간략한 소개만으로 끝나는 경우가 많은데 각각의 프로퍼티의 용도를 스스로 공부해야 합니다.

....자료가 없으니 어렵다.... 핑게일 뿐이죠. 간단히 프로퍼티 생성하고 인디케이터에 연결하면 아...이게 뭐다 하는것을 어렴풋이 아는것들이 태반입니다. 자료없다는 변명 말고 인디케이터라던지 스스로 실행해 가면서 익혀야 하겠습니다.

8단계. 테크닉 익히기

산의 정상을 정복하기 위해서는 많은 길들이 존재하겠죠. 프로그래머에 따라 지름길로 가는 사람이 있는가 하면 뺑뺑 돌아서 가는 사람도 있습니다. 어떤분은 가다가 낭떠러지를 만나서 다시 내려와 올라가거나 포기합니다.

하나의 과제에 대해 그 흐름을 어떤식으로 구현하는거에 따라 지름길일 수도 있고 뺑뺑 돌아가는 길이 될 수도 있습니다. 이런 테크닉을 어떻게 익히냐가 관건인데.... 다른사람이 구현한 것과 자신 스스로 구현하는 것과의 비교로 익혀 나가는 방법밖에는 없습니다. 멘토가 있으면 아주 좋겠죠. LabVIEW의 Q&A를 활용하는것도 일종의 방법입니다. 나는 이런식으로 짜는데 다른사람은 다르게 짜더라. 왜 저렇게 작성 했을까? 하는 의문을 가지고 분석을 해 나가다 보변 어떤방식으로 짜는게 좋더라 라는 스스로의 깨우침에 이르게 될 듯 합니다.

9단계. External Language in LabVIEW

LabVIEW의 소스는 Text Compiler에 비해 무겁습니다. 그것은 C++ 매크로이기 때문입니다. 군더더기가 많이 묻어 있는것 또한 사실입니다. LabVIEW의 한계에 의해 구현하고자 하는 기능을 많이 제한하는 경우가 많이 있습니다.

그래서 타 언어로 혼합언어로 작성 가능하게 하는것이 있습니다. DLL 이나 CIN Node(%2010버젼부터는 함수에서는 안보이나 자체적으로는 지원합니다.) 같은 것들을 말하죠.

복잡한 분석 같은것들은 Text 언어로 작성하는것이 좋습니다. LabVIEW에서 지원하는 Mathscript도 있으나 멀티태스킹 환경에서는 DLL이나 CIN 같은것을 사용하는게 더 낳습니다. 그 node 안에서의 변수들은 Global과 같은 기능을 합니다.

LabVIEW의 한계에 대해 말하자면 멀티 태스킹 환경에서 Local이나 Global 사용시 데이타가 깨지는 것을 말합니다. 그래서 어떤 유져는 멀티 태스킹 하면 버그만 나온다고 안쓰는 분도 있더군요. 벌레 무서워 장 못담근다는 속담이 있지요. 벌레는 못 다루기 때문에 발생하는 겁니다. 이 부분의 해결이.....LabVIEW의 가장 큰 고민이죠. 모르는 사람이 태반입니다. 나중에 기회가 닿으면(좀 게을러서) 이 부분을 보여드리죠.

이 한계를 극복하기 위한게 DLL Node 및 CIN Node입니다.

10단계. 이제는 나도 프로그래머라 불러주세요.

이 정도 되야 LabVIEW를 사용하여 프로그램 할 수 있는 경지에 다다른 것입니다.

그 이전까지는 학습 단계겠죠. 간단한 예제 작성 할 줄 안다고 프로그래머가 아닙니다. 코더죠.

여기서 소개 안된 많은 부분이 존재합니다만 공부하시는 분들에게 조그마한 도움이 되었으면 하는 바램입니다.

-The End-

Sunday, September 25, 2011

Labview 단축키

 

개발 효율 극대화 – LabVIEW의 단축키 최대활용!


최고의 인기를 누리는 게임인 Starcraft의 경우, 실력자와 초보자를 구분할 수 있는 지표가 바로 단축키를 얼마나 잘 활용하느냐입니다. 게임뿐 아니라, 모든 프로그램에는 그 프로그램의 숙련도를 증가시킬 수 있는 단축키를 제공합니다. 그래픽 기반의 프로그래밍 언어인 LabVIEW 역시 이러한 단축키를 제공합니다. 일반적으로 대부분의 프로그램에서 공통으로 사용되는 단축키에서 부터, LabVIEW의 특성을 살릴 수 있는 다양한 단축키를 제공하므로, 이를 숙지하고 프로그램 개발시에 활용한다면, 프로그램 개발 효율을 향상시킬 수 있을 뿐 아니라, 한 단계 높은 프로그램 개발자가 될 수 있을 것입니다.

>> LaVIEW 단축키 map_종합편 다운로드 하기

1. 파일 관련 단축키

Ctrl + N : 새 VI 열기
LabVIEW 환경 어디에서나 이 단축키를 누를 경우, 새로운 프런트패널과 블록다이어그램이 열리게 되며, 프로젝트 탐색기 상에서 누를 경우, 해당 프로젝트 새로운 창이 열리는 동시에 프로젝트에 새로 열린 창이 자동적으로 추가가 됩니다. 추가된 새 파일은 새로운 이름으로 저장하시면 됩니다.


그림 1. Ctrl + N : 새 VI 열기

Ctrl + S : 저장하기
일반적인 저장의 단축키로 파일을 저장하는 단축키입니다. 프런트패널 또는 블록다이어그램에서 누르게되면, 해당하는 VI가 저장되며, 프로젝트 탐색기 상에서 누를 경우, 해당되는 프로젝트를 저장하게 됩니다. 또한, 파일명을 입력하지 않았을 경우, 파일 이름을 입력하는 창이 팝업이 되지만, 파일명을 이미 가지고 있을 경우, 변경된 내용만 자동 저장되며, 별도의 창이 팝업되지 않습니다.

그림 2. Ctrl + S : 저장하기

Ctrl + O : 불러오기
사용자가 원하는 파일을 호출하기 위한 단축키로, 일반적인 불러오기 단축키와 동일합니다. LabVIEW와 관련된 모든 파일들을 호출할 수 있습니다.

Ctrl + P : 인쇄하기
LabVIEW에서 무슨 인쇄가 필요할까 생각하시는 분들도 계시겠지만, LabVIEW의 프런트패널, 블록다이어그램을 출력하시고자 할 경우 사용하시면 됩니다. 프런트 패널을 인쇄하실지, 또는 블록다이어그램을 인쇄하실지를 잘 판단하시어, 해당하는 창에서 실행하시면 됩니다.

Ctrl + Q : 종료하기
일반적으로 편집중인 VI를 종료해도, LabVIEW는 종료되지 않습니다. 하지만, LabVIEW 전체를 종료하고자 할 때, 이 단축키를 입력하시면 됩니다. 그렇게 되면 LabVIEW 프로그램을 완전히 종료시키실 수 있습니다. 이 단축키를 누르실 경우, 메모리상에 있는 모든 저장되지 않은 VI 및 프로젝트 파일에 대한 저장여부를 확인하므로, 항상 주의하여 사용하시기 바랍니다.

그림 3. Ctrl + Q : 종료하기

다음은 LabVIEW를 실제 프로그래밍할 경우 자주 사용하게 되는 단축키들을 알아보도록 하겠습니다.
맨위로

2. 편집 관련

Ctrl + C : 복사하기
프런트패널 또는 블록다이어그램에서 복사하고자 하는 객체가 있을 경우, 해당 객체를 선택하여, 단축키를 누를 경우, 해당하는 객체가 LabVIEW 메모리 상으로 복사가 됩니다. 그 이후, 복사하고자 하는 위치에서 붙여넣기(Ctrl + V)를 하게 되면 객체의 복사가 이루어집니다.

Tip : 단축키 보다 더 간단하게 복사하는 방법은 마우스를 이용하는 방법입니다. 컨트롤키를 누르신 후 해당하는 객체를 선택한 후(이때, 마우스 커서 옆에 + 표시로 확인 가능), 마우스를 드래그 & 드롭을 하시면, 더욱 편리하게 복사를 하실수 있습니다.

그림 4. Ctrl + C : 복사하기

Ctrl + X : 잘라내기
복사하기와 마찬가지로 프런트패널 또는 블록다이어그램에서 잘라내고자 하는 객체가 있을 경우, 해당 객체를 선택하여, 단축키를 누를 경우, 해당하는 객체가 잘라내어져 LabVIEW 메모리 상으로 이동됩니다. 그 이후, 복사하고자 하는 위치에서 붙여넣기(Ctrl + V)를 하게 되면 객체의 잘라내기가 이루어집니다.

Ctrl + V : 붙여넣기
복사하기 또는 잘라내기를 한 이후, 해당 객체를 높고 싶은 위치에서 해당 단축키를 누르면 LabVIEW 메모리 상에 있던 객체가 복사 혹은 잘라내기 되어 나타납니다. 연속으로 누를 경우 메모리에 존재하는 동일한 객체가 계속해서 생성됩니다.

Ctrl + F : 객체 찾기
LabVIEW 메모리상에 존재하는 텍스트 혹은 객체, 함수 등을 빠르게 찾기 위해서 사용하는 단축키로서, 해당 기능을 사용할 경우 객체 찾기 창이 뜨며, 찾고자 하는 텍스트 또는 객체, 검색 영역, 찾고자 하는 객체 등을 설정한 후 찾기를 하면, 원하는 텍스트 또는 객체를 빠르게 검색할 수가 있습니다.


그림 5. Ctrl + F : 객체 찾기

Ctrl + A : 모든 객체 선택
프런트패널 또는 블록다이어그램 상에 존재하는 모든 객체를 선택하고자 할 경우 사용하시면 됩니다. 또한, 특정한 객체들을 선택하고자 할 경우에는 컨트롤을 누르시고, 선택하고자 하는 객체들을 차례대로 마우스로 클릭하시면 됩니다.

Ctrl + Z : 실행취소
방금 수행한 동작들을 취소하거나, 이전 상태로 돌아가고자 할 경우, 가장 필요한 단축키입니다. 특히 프로그래밍시, 원치 않게 와이어링 하였거나, 잘못된 위치로 이동하였을 경우, 편리하게 사용할 수 있습니다.
Tip : VI를 저장한 이후에는 저장 이전 상태로 실행취소를 하는 것이 불가능 하므로 주의하시기 바랍니다.

Ctrl + + : 글자크기 확대하기
특정한 라벨, 또는 객체 안의 글자의 크기를 확대하고자 할 경우, 원하는 라벨 또는 객체를 선택하고 단축키를 누르면 편리하게 글자크기를 확대할 수 있습니다.

그림 6. 라벨의 크기만을 확대(좌), 라벨과 객체의 크기 모두 확대(우)

Ctrl + - : 글자크기 축소하기
글자크기 확대하기와 반대로 축소하는 기능입니다. 동일한 방법으로 사용하면 됩니다.

Ctrl + U : 블록다이어그램 정리
LabVIEW는 그래픽 기반의 프로그래밍이므로, 직관적이고 편리하게 프로그래밍 할 수 있지만, 반면에, 블록다이어그램을 깔끔하게 정리하지 않으면, 사용자가 보기에 복잡하고 이해하기 어렵게 될 수 있습니다. 이러한 부분을 보완해 주는 기능이 바로 블록다이어그램 정리 기능입니다. 지금 바로 이 단축키를 눌러보십시오. 바로 모든 블록다이어그램의 객체들과 와이어들이 깔끔하게 정리되는 것을 확인하실 수 있습니다. 단, 자동정리 기능은 정리를 깔끔하게 하기는 하지만, 사용자가 원하는대로 정리되는 것은 아닙니다. 사용자가 원하는대로 정리를 하시고자 하는 경우, 객체를 원하는 곳에 위치시키시고, 각각의 와이어들을 선택하셔서 마우스 오른쪽 버튼 메뉴의 와이어정리 기능을 이용하시면 편리합니다.


그림 7. 블록다이어그램 정리

Tip : 블록다이어그램 정리 기능은 단축키를 누르게 되면 블록다이어그램의 모든 객체들을 정리합니다. 때때로, 구조문의 경우 구조문 내부는 정리하고 싶지 않다 하실 경우, 정리 단축키를 누르기 전에 해당 루프를 선택하시고 마우스 오른쪽 버튼 메뉴에서 다이어그램정리에서 제외 를 선택하신 후 블록다이어그램 정리 단축키를 누르시면, 루프내부를 제외하고 블록다이어그램이 정리된 것을 확인하실 수 있습니다.

그림 8. 구조문 내부 정리를 하지 않을 경우

Ctrl + B : 깨진와이어 제거
LabVIEW의 블록다이어그램에서 와이어는 데이터의 흐름을 의미하므로 굉장히 중요한 요소입니다. 프로그래밍을 하는 중에 연결을 잘못할 경우에 와이어는 깨지게 되는데, 이 때, 이 와이어를 하나씩 제거한다는 것은 굉장히 번거로운 작업일 것입니다. 그래서 이와 같은 경우, 이 단축키를 활용하시면, 모든 깨진 와이어를 한번에 제거할 수 있어 굉장히 편리합니다.

그림 9. Ctrl + B : 깨진와이어 제거

Tip : 간혹 연결을 잘못하신 경우, 기존에 제대로 연결된 와이어도 함께 깨지게 되는데, 이럴 경우 이 단축키를 사용하시면 기존의 제대로 연결된 와이어도 함께 제거됩니다. 그러므로 이럴 경우에는 실행취소(Ctrl+Z)를 활용하시는 것이 보다 효과적입니다.

Ctrl + 빈공간 클릭 & 이동 : 공간 확대
프로그램을 작성시, 특정한 객체를 어떤 공간에 위치시키고자 할 때, 모든 객체들을 하나씩 이동한 후, 객체를 해당위치에 추가해 본 경험이 있을 것입니다. 이럴 때 매우 유용한 기능으로, 컨트롤 키를 누른 후, 공간을 확보하고자 하는 위치에서 마우스 커서를 누른채로 마우스 왼쪽버튼을 클릭한 후, 빈공간을 추가시키고 싶은 영역까지 드래그 하고 커서를 떼면, 그 만큼의 빈공간이 확장됩니다. 블록다이어그램에서 프로그램 할 때와 프런트패널에서 객체를 추가할 때 매우 유용한 기능이니 꼭 기억하시기 바랍니다.

그림 10. Ctrl + 빈공간 클릭 & 이동 : 공간 확대

Ctrl + L : 에러리스트 보기
현재 VI가 가지고 있는 에러리스트를 확인하는 단축기입니다. 보통 에러의 존재 유무는 툴바의 실행 버튼이 깨져있는 경우에 에러가 존재한다는 것을 확인할 수 있습니다.

그림 11. Ctrl + L : 에러리스트 보기
맨위로

상세한 리스트의 경우 이 단축키를 활용하면 확인하실 수 있으며, 해당하는 에러리스트를 더블 클릭하면 해당 에러위치로 이동하게 됩니다.
프로그램에 에러가 존재하는 경우에 프로그램을 실행하게 되면, 에러리스트가 자동으로 발생이 되므로 이 경우에는 VI 실행 단축키와 동일한 기능을 합니다.


그림 12. 에러리스트 자동 발생

Ctrl + M : 실행모드로 보기(디버깅 툴들 안보이게 하기)
이 단축키는 VI 프로그래밍시 실제 실행화면과 동일하게 보이도록 전환하는 단축키입니다. 일반적으로 프로그램을 완료하고, 실제 실행화면을 어떻게 보이게 할 것인지 수정하고 확인할 때 사용됩니다.

그림 13. Ctrl + M : 편집 모드에서 실행 모드로 전환

Ctrl + Y : 개정히스토리 입력
프로그램 개발시 수정사항에 대한 내용들을 파일내에 기록하여, 공동 개발자 또는 개발자 본인이 수정 내용에 대한 히스토리를 확인할 수 있도록 하는 기능의 단축키입니다. 일반적으로 사용자 분들께서 잘 사용하지 않는 기능이나, 대형 프로젝트를 할 때 상당히 유용한 기능입니다


그림 14. Ctrl + Y : 개정히스토리 입력

Ctrl + I : VI 프로퍼티
VI 전체에 대한 속성을 변경할 수 있는 VI 프로퍼티의 단축키 입니다. 그림에서 보시는 바와 같이 VI 프로퍼티에서는 다양한 내용들의 VI 속성을 변경할 수 있으므로, 단축키 뿐 만 아니라, 해당하는 기능들에 대해서도 숙지하실 필요가 있습니다.


그림 15. Ctrl + I : VI 프로퍼티

Ctrl + Shift + N : 탐색윈도우
블록다이어그램 혹은 프런트패널의 내용이 많아져서, 스크린을 벗어난 경우 스크롤을 이용해서 원하는 곳으로 이동해야 했습니다. 하지만, 이러한 불편을 일부 해결하기 위해서 원하는 곳을 편리하게 찾아갈 수 있는 탐색 윈도우란 기능이 존재합니다.
이 기능은 작은 창으로 전체 화면을 보며, 원하는 위치를 클릭하면 해당 위치로 빠르게 이동시켜주는 유용한 툴입니다.


그림 16. 이동하기 원하는 곳을 클릭하면 빠르게 이동할 수 있습니다.

Ctrl + H : 기본 도움말
많은 분들이 가장 많이 사용하는 단축키 입니다. LabVIEW는 그래픽 기반의 프로그래밍 언어이므로, 모든 함수 라이브러리들이 아이콘화 되어 있습니다. 이 때 함수의 기능과 연결 위치 등의 확인이 필요할 경우 사용하시면 매우 편리합니다. 프로그래밍 할 때 항상 띄워놓고 사용하시면 화면을 차지하여 불편하실 수 있으므로, 단축키를 효과적으로 사용하시기 바랍니다.

Ctrl + Shift + ? : LabVIEW 도움말
이전에 보셨던 기본 도움말과 달리 이 단축키의 경우 LabVIEW의 상세도움말 파일을 실행시킵니다. 필요에 따라 효과적으로 사용하시면 되고, 기본 도움말에서도 특정 함수에 관해서는 상세 도움말 보기 부분이 있어 클릭하시면, 해당 상세 도움말로 이동 가능합니다.


그림 17. LabVIEW 도움말 창으로 상세한 도움말들을 확인할 수 있습니다.


그림 18. 기본 도움말에서 상세 도움말을 확인할 수 있습니다.
맨위로

3. LabVIEW 창 관련 단축키

Ctrl + E : 창전환
아시다시피, LabVIEW의 창은 크게 프런트패널과 블록다이어그램으로 나뉩니다. 프로그램을 개발하면서 사용자 인터페이스인 프런트패널과 실제 코드개발 환경인 블록다이어그램을 자주 상호 이동하게 됩니다. 이 때 마우스를 클릭해서 선택하거나, 혹은 윈도우 작업바에 있는 것을 클릭하여 이동할 경우, 여러 개의 VI가 로드 되어 있는 경우, 선택하는데 실수하는 번거로움이 발생할 수 있다. 이때, 이 단축키를 사용하면, 상호 이동을 편리하게 할 수 있다.
프런트패널만 메모리에 존재 시, 블록다이어그램을 보기 원할 때도 이 단축키를 누르면 블록다이어그램이 나타나게 됩니다.

Ctrl + T : 창 나누기(수직 또는 수평)
개발시 프런트패널과 블록다이어그램을 동시에 보고 싶을 때 사용하는 단축키 입니다. 이 단축키를 누르면, 기본적으로 화면 전체에 좌측에는 프런트패널, 우측에는 블록다이어그램이 배치됩니다.
프런트패널과 블록다이어그램 두개의 창을 동시에 보는데 있어서 편리한 단축키입니다.


그림 19. 좌우로 정렬


그림 20. 위 아래로 정렬

LabVIEW는 그래픽 코드환경이므로, 개발 시 화면을 어떻게 보느냐에 따라서 사용자의 개발 효율이 달라질 수 있다. 간혹, 수평으로 VI를 구성하였는데, 화면이 작을 경우 계속 화면을 스크롤을 해야 하는 번거로움이 요구된다. 그러므로 프로그램 구성에 맞게 보는 프런트패널과 블록다이어그램을 좌우로 볼 것인지, 상하로 볼 것인지를 선택하여, 개발에 능률을 올릴 수 있을 것이다.

그림 21. 원하는 정렬방식을 선택하고 단축키를 누르면 선택한 설정으로 화면을 볼 수 있다.

Ctrl + / : 창 최대화
지금 선택한 VI 창을 최대화 할 때 사용하는 단축키 입니다. 프런트패널 및 블록다이어그램 창 모두에서 사용할 수 있습니다.

Ctrl + W : 창닫기
현재 창을 닫는 단축키 입니다. 블록다이어그램의 경우에는 창이 닫혀도 프런트패널이 항상 메모리에 존재하므로 아무런 메시지 없이 종료되지만, 프런트패널의 경우, 종료되면 메모리상에서 해당 VI가 사라지게 되므로, 저장이 되어 있지 않을 경우 저장 할지의 유무를 묻는 대화창이 뜨게 됩니다. 이 때 무심코 ‘아니오’를 누를 경우 오랜시간 작업한 프로그래밍 작업을 날려버릴 수가 있으니, 주의하시기 바랍니다.

맨위로

4. 실행 관련 단축키

Ctrl + R : VI 실행
아마도 이 단축키는 LabVIEW 사용자 분들의 대부분이 이미 알고 있는 단축키라고 생각이 됩니다. 프로그램을 실행을 하는 단축키로써 툴바의 실행버튼 아이콘을 누르거나 단축키를 누르시거나 하시면 됩니다.
앞서 에러리스트 단축키에서도 말씀 드렸듯이, VI에 에러가 존재하지 않을 경우에는 프로그램이 실행되지만, 에러가 존재할 경우에는 에러리스트 단축키와 동일하게 에러리스트 창을 출력하게 됩니다.

그림 22. VI 실행 단축키는 실행 버튼을 누르는 것과 동일하다.

Ctrl + . : 실행 중 강제종료
LabVIEW 어플리케이션을 개발하여 실행하였을 때, 프로그램이 무한루프, 메모리 문제, 혹은 오동작으로 인해 멈추지 않을 경우, 일반적으로 강제종료 버튼을 누르게 되면, 프로그램이 종료됩니다. 이 강제종료 버튼에 해당하는 단축키가 바로 이 단축키 입니다.
될 수 있으면, 이 버튼을 사용하지 않도록 프로그램 하시는 것이 좋으나, 필요할 경우 유용하게 사용하시기 바랍니다.


그림 23. 강제 종료버튼의 동일한 기능을 합니다.

5. 팔레트 관련 단축키

Shift + 마우스 오른쪽 버튼 : 도구 팔레트 호출
이 단축키를 설명하기에 앞서서, 먼저 도구 팔레트를 모르시는 분들을 위해 먼저 설명을 드리도록 하겠습니다.
LabVIEW 의 모든 라이브러리를 가진 공간이 바로 팔레트입니다. 이 팔레트에는 컨트롤 팔레트, 함수 팔레트, 도구 팔레트 세가지 팔레트가 존재합니다. 컨트롤 팔레트는 프런트패널에 존재하여 사용자 인터페이스에 필요한 다양한 객체들을 제공하고, 함수팔레트는 블록다이어그램에 존재하여, 다양한 함수 라이브러리를 제공합니다. 마지막으로 도구 팔레트는 프런트패널 및 블록다이어그램 모두에서 호출하여 각종 객체의 선택, 이동, 동작, 와이어 연결, 글자입력, 색상 변경 등 다양한 기능을 수행할 수 도구를 제공하는 팔레트 입니다.


그림 24. 컨트롤 팔레트(프런트패널)와 함수 팔레트(블록다이어그램)


그림 25. 도구 팔레트(프런트패널, 블록다이어그램)

컨트롤 팔레트와 함수 팔레트의 경우 각각의 환경에서 마우스 오른쪽 버튼을 누르면 편리하게 호출할 수 가 있습니다. 하지만, 도구 팔레트의 경우에는 시프트키를 누르고 마우스 오른쪽 버튼을 눌러야만 호출할 수가 있습니다. 메뉴에서는 아래 그림과 같이 보기 메뉴에서 선택하시면 됩니다.


그림 26. 메뉴에서 도구 팔레트의 선택

Tap(블럭자동선택 기능 해제후): 마우스 4가지 기능 순환변경
LabVIEW에서 마우스커서는 특정한 위치에 가면 자동적으로 그 위치에 해당하는 기능의 아이콘 모양으로 변경되는 것을 아실 것입니다. 예를 들면, 블록다이어그램에서 특정한 터미널에 아이콘을 위치시키면, 와이어연결 아이콘으로 변경되고, 프런트패널에서 컨트롤 변경 버튼에 위치하면, 동작시키는 버튼으로 변경됩니다. 이 자동 변경 기능은 특별한 변경 없이 마우스로 프로그래밍 할 수 있도록 LabVIEW 7(한글판) 버전 이후로 지원되어 왔습니다.
하지만, 전문적인 프로그래머들에게는 이 기능이 가끔은 불편할 수가 있습니다. 선택하려고 하는데, 기능의 변경이 안되어 다른 동작이 되는 경우를 경험해 본 적이 있으실 것입니다. 이럴 경우에는 수동으로 변경하며 사용하기도 하는데, 이렇게 할 때는 도구 팔레트에서 해당하는 기능을 그 때마다 선택해주어야 하는 번거로움이 발생하게 됩니다. 이럴 경우 사용하는 것이 바로 Tap 버튼입니다. 이 단축키는 도구 팔레트가 활성화 되어 있고, 자동변환 기능이 꺼져있을 때만 사용가능한 단축키입니다. 이 키를 누르게 되면, 자주 변경하는 4가지의 기능이 순차적으로 변하게 되어 프로그래밍 시 편리하게 사용할 수 있습니다.


그림 27. 마우스 4가지 기능 순환변경

Ctrl + Space Bar : 빠른 탐색
빠른 탐색 기능은 LabVIEW 8.6(한글판)에서 새롭게 추가된 기능으로 함수를 이름으로 빠르게 탐색할 수 있는 기능입니다. 함수의 이름을 대략적으로 알고 있다면 편리하게 함수 검색이 가능합니다.


그림 28. Ctrl + Space Bar : 빠른 탐색

5. 빠른 탐색 시 관련 단축키

여기서 말씀드리는 단축키는 LabVIEW 2009(한글판)에서부터 지원되는 단축키로, 위에서 설명드린빠른탐색 창을 띄운 후(Ctrl+Space Bar) 해당 단축키를 누르시면 됩니다.

CTRL+D -> 연결되지 않은 입력/출력에 대한 모든 컨트롤/인디케이터 생성
이 기능은 함수에 연결되지 않은 모든 연결되지 않은 입/출력에 대해서 자동으로 컨트롤/인디케이터를 생성해주는 단축키입니다. 모두 생성되고 나면, 복잡하게 보일 수 있으므로, 자동정렬을 눌러주시면 좋습니다.
Tip : 사용순서, 해당 기능을 적용하고 싶은 VI 선택 -> Ctrl + Space bar -> Ctrl +D 의 순서로 눌러주시면 됩니다.


그림 29. 첫번째 함수를 적용한 경우 : 연결되지 않은 모든 입출력에 컨트롤/인디케이터가 자동으로 연결되었습니다.

CTRL+SHIFT+D -> 와이어로 연결되지 않은 입력에 대한 상수 생성
이 기능은 위의 기능과 유사한 기능으로, 모든 연결되지 않는 입력 터미널에 상수를 연결해주는 기능의 단축키입니다.


그림 30. 첫번째와 달리 컨트롤과 인디케이터가 아닌 상수가 연결되었습니다.

CTRL+R -> 선택한 객체 제거 후 와이어 연결
데이터 수집, 파일 저장과 같은 경우는 task 라인, 참조번호, 또는 에러입/출력 등의 라인을 연속적으로 연결해주어야 합니다. 이 때 프로그램을 수정하기 위해 중간에 위치한 함수를 제거할 경우, 와이어 연결을 다시 해주어야 하는 번거로움이 있습니다. 이런 번거로움을 해결하기 위해 이 단축키가 제공됩니다.
Tip : 사용순서, 제거하고자 하는 VI 선택 -> Ctrl + Space bar -> Ctrl +R


그림 31. 선택한 VI가 제거되고 자동으로 와이어링 됩니다.

CTRL+T -> 선택한 컨트롤의 라벨을 왼쪽으로 인디케이터는 오른쪽으로 정렬
이 기능은 선택한 VI에 연결된 모든 객체의 라벨을 컨트롤은 왼쪽으로, 인디케이터는 오른쪽으로 정렬해주는 단축키입니다.


그림 32. 라벨의 위치를 자동으로 정렬해 줍니다.

위에서 소개한 다양한 단축키들 중에 본인이 자주 사용하시는 기능의 단축키 몇 가지를 기억하여 개발시에 적용하셔서, 프로그램 개발 효율을 높이시고, 한단계 성장한 LabVIEW 개발자가 되시는데 많은 도움이 되시길 바랍니다.

>> LaVIEW 단축키 map_종합편 다운로드

예제 파일 및 소프트웨어 다운로드

본 Tech-Tip을 통해 생성된 LabVIEW 소스 코드(220 KB) 다운로드
Vision Development Module 30일 평가판 다운로드
NI-IMAQ for USB Cameras 드라이버 다운로드(무료)

Labview Parallel While Loop

 

Parallel execution

An interesting effect of the LabVIEW data flow model is that of parallel execution. In most text-based languages, the structure of a program's source code completely defines the sequence of instruction execution. For instance, if a call to function A is placed directly above a call to function B, then function A is guaranteed to be called by that code segment before function B. This programming model of "sequence from code structure" is common in programming languages and is usually taken to be a rule-of-thumb by programmers.

LabVIEW, among a few other languages, does not explicitly fit this model. The sequence of instruction execution in LabVIEW cannot be entirely defined by the structure of the iconic code placed on the block diagram for two simple reasons--elements can be placed anywhere on the block diagram and can remain disconnected from each other. As an example, consider the placement of two while-loops next to one another with indicators showing their current iteration values as the program runs. It is indeterminate how these values will change as the program executes because the order of program execution cannot be determined by the structure of the block diagram. The second while-loop could run a thousand times before the first while-loop even runs once.

Figure 1

Figure 1:Indeterminate parallel execution. The order in which the two while-loops are executed cannot be determined from the block diagram. For instance, it is unclear if the loops will alternate from one to the other evenly, if they will alternate unevenly, or even if one loop always executes while the other waits indefinitely.

The property of parallel execution can be beneficial in many instances. If, for example, a program must control some external hardware such as a motor while logging data from a sensor such as a load cell, parallel execution assists by allowing the program to be structured in a way that separates the motor control from the data collection process. Such a separation not only keeps the code clean, but also allows for the parallel execution of the two tasks.

In other cases, parallel execution is undesired. Sometimes it is necessary to determine the execution sequence by the code structure. Consider a trivial LabVIEW program that needs to write its data to a file before reading it back in again. If these two VIs are independently placed on the block diagram, their order of execution is indeterminate meaning that the program could try to read the file before actually writing it. While one would probably never write a program that performs these operations, it demonstrates an instance in which parallel execution causes problems.

Figure 2

Figure 2: Parallel execution with unintended results. The value from the file path control flows down the wires to the save spreadsheet VI and the load spreadsheet VI. Which VI executes first, the load or the save, cannot be determined. In this case, parallel execution proves to be problematic if the program is trying to write the data to a file first and then read it in again.

Although LabVIEW inherently executes instructions in parallel, this behavior is not often seen because the structure of the program is more often than not defined by the connections between data sources and sinks. Block diagram elements only execute in parallel when they are disconnected from each other. When elements are wired together in some manner, then their order of execution becomes defined. For example, consider a LabVIEW program with a number of arithmetic operations in its block diagram. Since the data in the program always flows from source to sink, the order of operations can be defined by how the VIs are wired together.

Figure 3

Figure 3: Large scale sequential execution with small scale parallelism. The order of operation here is (addend1 + addend2) / divisor. The program cannot execute the divide operation until the add operation has completed because one of the inputs of the divide VI depends on the result of the add operation. Therefore, the addition is guaranteed to occur before the division. However, the order in which the values are read from the addend and divisor controls is still indeterminate--the divisor value could be read and passed to the divide VI before the addends are read and passed to the add VI.

The understanding of parallel execution, namely when to use it, when to avoid it, and how to control it, is essential in LabVIEW programming. Without a doubt, this concept is the most important of any of the others in these tutorials.

Wednesday, September 21, 2011

발생율과 유병율 (Incidence & Prevalence)

 

Health condition statistics are typically expressed in terms of incidence and prevalence in a particular population within a specific period of time.

Incidence is a measure of the number of new cases of a medical condition that occur in the population during a measured amount of time, usually one year.

Prevalence is defined as the total number of existing cases of a disease in a specific population at a stated point in time. In any one day, at a certain time, there are a specific number of people with a certain disorder.

통계에서 사용되는 용어이므로 , 사전에서 찾은 의미로는 이해하기가 힘들다.

Sunday, September 18, 2011

운동 신경계 평가 (Motor System Evaluation)

 

1. 관찰 : physical 한 치수

근위축 ( muscle atrophy), 근비대 (muscle hypertrophy), 가성비대 (pseudo hypertrophy)

불수의 운동 (Involuntary Movement) : 경직 (rigidity), 진전(tremor), 무정의 운동증(athetosis: 뇌성마비환자에게서 볼수 있는증상), 무도증(chorea: 빠르게 불규칙적으로흔드는것), 발리즘 (Ballism : 근위부(proximal<->distal)를 움직여서 갑작스럽게 집어 던지듯하는 운동), 근긴장이상증(dystonia), 경련(spasm)

2. 촉진및 타진 : 근육의 긴장이 일정하게 유지되는지 알아본다.

근육 긴장증 (myotonia)

3. 근육의 세기

4. 조작에 대한 수동적 저항 (passive resistance to manipulation)

5. 보행

6. 협조 운동 ( coordination)

7. 심부건 반사 ( deep tendon reflex ), 표재성 반사 (superficial reflex) 및 병적 반사 (pathologic reflexes)

Friday, September 16, 2011

Reflex Evaluation (반사평가)

 

반사 검사는 신경학적 평가에 있어서 매우 중요하여, 때로는 신경계의 미세한 병변을 조기에 진단할 수 있는 유일한 방법이 되기도 하며, 의식이 없거나 검사에 협조가 잘 되지 않는 환자의  진단에 있어서 가장 객관적이고 믿을 수 있는 진단 방법이 되기도 한다.

반사는 크게 심부건반사( deep tendon reflex ), 표재성 반사, 병적반사 (pathologic reflex) 로 분류된다.

 

1) 심부건 반사 (deep tendon reflex)

근육의 대부분은 힘을 내는 골격근을 구성하고 있는 방추외근섬유 (extrafusal fiber) 이며 여기에 평행하게 붙어 있어 근육의 길이나 길이의 변화에 대한 정보를 신경계로 전달하는 근방추 (muscle spindle) 로 구성되어 잇는데, 근방추 하나는 중간부분이 팽창된 1~3개의 핵낭섬유 (nuclear bag fiber) 와 이보다 짧고 가는 3~9개의 핵사슬 섬유 (nuclear chain fiber) 로 구성되어 있다.

두 종류의 근섬유 중간 부분을 지배하고 있는 감각 섬유를 일차 종말 (primary ending, Ia OR annulospiral) 이라하며, 이는 급격한 길이 변화에 대해 자극을 받아 신호를 전달하며, 이차 종말 (secondary ending, II OR flower spray ending ) 이라고 하는 감각 섬유는 핵사슬 섬유만을 지배하여 완만한 길이 변화에 반응한다. 해머로 건을 가격하면, 순간저그로 방추외근섬유가 늘어나고 여기에 평행하게 붙어 있는 근방추도 늘어나는데 이때 핵낭부에 있는 일차종말이 자극을 받아 후근 (dorsal root)* 을 통하여 척수로 들어가 시납스를 이룬 전근 (ventral root) 을 통하여 방추외근섬유를 수축시키는 반응이 심부건 반사이다.

image

*해부학의 관점에서 볼 때 sinus는 '한 종류의 뼈 속에 있는 공간'으로 cavity보다는 작은 공간을 뜻하고, cavity는 '두 종류 이상의 서로 다른 뼈로 둘러싸여 형성된 공간'으로 sinus보다는 큰 공간을 뜻한다고 생각되네요 ^^ 단순히 크기의 차이일 수 있지만 한 종류의 뼈로 생긴 공간인가 여러종류의 뼈가 이루는 공간인가를 따져보세요!

Wednesday, September 14, 2011

Matlab Tip #1(test)

case 1
    disp('1');
case 2
    disp('2');
otherwise
    disp('other');

 

*** 복소수 전치
a=[1+i, 2+2i; 3+3i, 4+4i]

a` = 1.0000-1.0000i  3.0000-3.0000i
      2.0000-2.0000i  4.0000-4.0000i

a.` = 1.0000+1.0000i  3.0000+3.0000i
       2.0000+2.0000i  4.0000+4.0000i

 


***데이터 저장과 불러오기
% %e, %f, %g 있음, 유효소수점 별로 신경쓰기 싫다면 g가
a=1;
b=0.3;
fprintf('print test : %f  %g\n',a,b);
%fprintf('myfile', '%g', x)

%fopen, fread, fwrite, fseek 등
A=[1 2 3; 4 5 6];
save myData.txt A -ascii  %-ascii 대신 -tabs 옵션 가능
load myData.txt
A=load('myData.txt')

 

***변수에 데이터 입력 받기
a = input('enter a value:');

 

***OS 명령어 실행하기
%명령어 앞에 ! 를 붙여 OS 명령어를 바로 실행시킬 수 있음
!dir
!time

 

***각종 함수들

%절대값
abs(x)
%올림
ceil(x)
%0을 향하여 가장 가까운 정수로 반올림
fix(x)
%내림
floor(x)
%x에 가장 가까운 정수로 반올림
round(x)
%시간과 날짜
t=clock
fprintf(' %02.0f:%02.0f:%02.0f\n', t(4), t(5), t(6) );
%벡터의 누적합
comsum(1:4)
%dd-mmm-yyyy 형태의 날짜 표시
date
%벡터 x의 원소의 개수
length(x)
%벡터x에서 가장 큰 원소, 작은 원소
max(x)
min(x)
%벡터x 원소들의 평균값
mean(x)
%2^x
pow2(x)
%벡터 x원소들의 곱
prod(x)
%0~1 사이의 랜덤한 난수
rand
%사용자 컴퓨터에서 가장 큰 양의 실수, 가장 작은 양의 실수
realmax
realmin
%x를 y로 나누었을 때의 몫, 나머지값
fix(x/y)
rem(x,y)
%x의 부호, -1,0,1이 나옴
sign(x)
%행렬 a의 행과 열의 수
size(a)
%오름차순으로 벡터x의 원소를 정렬
sort(x)
%n차 파스칼 행렬 생성
pascal(n)
%마정방 사각형 생성
magic(10)
%행렬 관련
A'  %A의 전치행렬(transpose)
det  %행렬식(determinant)
eig  %고유값
expm  %행렬 지수,  e^A
inv  %역행렬
svd  %특이치 분해
diag  %대각행렬을 생성하거나 추출
fliplr  %왼쪽에서 오른쪽으로 열을 뒤집음
flipup  %위에서 아래로 행을 뒤집음
rot90  %반시계방향으로 회전시킨다
tril  %삼각형 형태의 아래 부분을 뽑아낸다
triup  %삼각형 형태의 윗부분 뽑아낸다

 


*** 0으로 나눠지는 것 피하기, 무한대로 가는 것 피하기
x=x+(x==0)*eps;   %x=x+(~x)*eps;
y=sin(x)./x;  %x가 0일 때 문제 생김

y=tan(x);
y=y.*(abs(y) < 1e10);

 

*** 연산자 우선순위

1    ()
2    ^ .^ ' .'(pure transpose
3    +(unary plus) -(unary minus) ~(NOT)
4    * / \ .* ./ .\
5    +(addition) -(subtraction)
6    :
7    > < >= <= == ~=
8    &(AND)
9    |(OR)

 

***논리 벡터, 함수
%벡터에서 특정 원소 모두 제거하기
a=a(a>0)  %0보다 큰 원소만 남기고 모두 제거한다
%만약 x의 어떤 원소라도 0이 아니면(참이면) 스칼라 값 1(참)을 내보냄
any(x) 
%만약 x의 모든 원소가 0이 아니면 스칼라 값 1(참)을 내보낸다
all(x) 
%a가 작업공간 상의 변수 명이라면 1을 내보냄
exist('a') 
%벡터 x의 0이 아닌 원소의 첨자를 포함하는 벡터로 돌려줌
find(x) 
a=a(find(a))  %a에서 0인 원소를 모두 제거
find(x>=max(x))  %가장 큰 원소가 하나 이상일 때 그 첨자를 찾는다
%x가 빈 배열(0x0 크기)이면 1, 아니면 0
isempty(x)
%x의 원소가 +Inf, -Inf가 있으면 1, 아니면 0
isinf(x)
%x의 원소 중에서 NaN이 있으면 1, 아니면 0
isnan(x)
x(isnan(x))=[]  %x에서 NaN 제거하기

 

*** menu, GUI
k=0;

while k~=3
    k=menu('click on your option', 'do this', 'do that', 'quit');
    if k==1
        disp('do this...press any key')
        pause
    elseif k==2
        disp('do that... press any key')
        pause
    end
end;

 

*** 보간법 (interpolation)
%interp1은 2차원 데이터의 1차원 보간을, interp2는 3차원 데이터의 2차원 보간을 수행
interp1(x,y,x_new)
interp1(x,y,x_new,'linear')
interp1(x,y,x_new,'spline')

polyfit(x,y,n)