이벤트 구조와 함께 E3631A 를 GPIB로 제어하기

    반응형

    안녕하세요. 지지비입니다.

    이번 포스팅에서는 이벤트 구조와 함께 E3631A를 GPIB 통신을 통해서 제어하는 방법에 대해서 알아보도록 하겠습니다. NI에서 제공하는 E3631A의 드라이버를 사용하지 않고 직접 SubVI를 만들어서 전압을 변경하는 프로그램을 만들어보도록 하겠습니다.

    1. 프론트 패널

    프로그램 프론트 패널

    프론트 패널은 다음과 같이 만들어 보려고 합니다. 이 프로그램은 다음과 같은 기능이 있어야 할 것 같네요.

    [기능]

    1. 전압/전류 모니터링 기능 : 현재의 전압과 전류를 특정 시간 간격으로 읽어옵니다. 이벤트 구조의 timeout을 사용하면 되겠네요.
    2. 채널 선택 기능 : E3631A의 +6V, +25V, -25V 중 사용 할 채널을 선택할 수 있어야 합니다.
    3. 전압 설정 기능

    이 기능은 곧 제가 만들어야 할 E3631A의 SubVI를 나타내기도 합니다.

    2. Project

    프로젝트

    프로그램을 작성하기 전에 프로젝트를 먼저 생성해 두었습니다. 메인 프로그램은 Main_E3631A Control with event structure.vi 입니다. 그리고 SubVI 폴더 안에 E3631A를 컨트롤하기 위한 SubVI를 만들어서 넣을 예정입니다.

    현재 시점에서 블록 다이어그램은 하나도 만들어져 있지 않은 상태입니다.

    프론트 패널과 블록 다이어그램

     

    3. E3631A SubVI 만들기

    SubVI 는 지난 강의처럼 매뉴얼을 하나하나 찾아보면서 만들어 보도록 하겠습니다. 제일 먼저, 전압과 전류를 모니터링 하기 위해서 전압과 전류값을 읽어오는 커맨드를 찾아야 합니다.

    3-1. 전압과 전류 읽어오기

    전압과 전류 측정 커맨드

    E3631A의 커맨드는 굉장히 직관적이어서, 커맨드를 알아보기가 쉽습니다. 일단 전류를 읽어오는 커맨드부터 살펴보도록 하겠습니다.

    MEASure:CURRent[:DC]? [{P6V|P25V|N25V}]

    이 커맨드에서 대괄호는 생략 가능한 옵션입니다. 마지막에 있는 [{P6V|P25V|N25V}] 는 특정 채널의 전류를 읽어오기 위해서 옵션으로 넣는 커맨드입니다. 이 커맨드를 생략하면 현재 디스플레이 되고 있거나 현재 선택되어 있는 채널의 전류를 읽어올 것입니다. 또한, 소문자도 생략이 가능합니다. 저는 기존에 선택된 채널의 전류를 읽어올 것이므로 뒤에 있는 채널 선택 커맨드도 생략할 것입니다.

    MEAS:CURR?

    따라서 위와 같이 줄여서 사용할 수 있습니다.

     

    두번째로 전압을 읽어오는 커맨드를 살펴보도록 하겠습니다.

    MEASure:[VOLTage][:DC]? [{P6V|P25V|N25V}]

    전압을 읽어오는 커맨드는 [VOLTage]도 생략이 가능하네요.

    MEAS?

    이렇게 줄여서 사용할 수 있습니다. 

     

    하지만, 이렇게 줄여서 사용하면 나중에 디버깅을 하거나 이 코드를 재사용할 때 곤란할 경우가 생기기 때문에 왠만하면 코드를 줄여서 사용하지 않고 사용할 것입니다. 예를 들어 MEAS? 라는 커맨드를 지금은 '전압을 읽어오는 커맨드가 생략된 것이네' 라고 생각할 수 있을지 모르지만 나중에 이 코드를 보면 '이게 전압을 읽는다는 거야? 전류를 읽는다는 거야?'라고 생각하게 될 지도 모르기 때문입니다.

    최종적으로 사용할 커맨드는 아래와 같습니다.

    MEASure:[VOLTage][:DC]? // 전압 읽기
    MEASure:[CURRent][:DC]? // 전류 읽기

     

    전압을 읽어오기 위해서 아래와 같이 블록 다이어그램을 작성해 주었습니다. 

    Read Voltage Block Diagram

     

    프론트 패널은 아래와 같이 만들었고, 각 터미널은 화살표처럼 연결했습니다. 왼쪽은 입력부분, 오른쪽은 출력부분입니다. SubVI의 아이콘도 사용했을 때 바로 알아볼 수 있도록 READ VOLT 같이 문자를 입력해 주는 것이 좋습니다.

    Read Voltage Front Panel

     

    전류를 읽어오는 SubVI도 동일한 방식으로 만들어 주겠습니다. 이 때에는 위에서 만들어 두었던 E3631A_Read_Voltage.vi를 활용하는 게 좋겠습니다. E3631A_Read_Voltage.vi에서 다른이름으로 저장(File-Save As...)를 클릭합니다.

    Save As...

     

    여기서 Open additional copy를 체크합니다. 우리는 새로운 vi를 만들것이기 때문에, 기존에 있던 E3631A_Read_Voltage.vi는 바뀌면 안됩니다.

    Open additional copy

     

    파일 이름을 변경하여 저장해 주겠습니다.

     

    저장하면 아래와 같이 새로 만든 E3631A_Read_Current.vi(파란색 박스) 와 기존에 있었던 E3631A_Read_Voltage.vi가 각각 열립니다. 새로 만든 vi에서 바꾸어야 할 부분은 빨간색 박스와 같습니다.

    1. SubVI 아이콘 변경 (READ VOLT -> READ CURR)
    2. 입력 커맨드 변경
    3. 출력 인디케이터 변경(Voltage [V] -> Current [A])

    아래처럼 변경해 주고 저장합니다.

     

    이제 전압과 전류를 읽어오는 SubVI를 만드는 것은 끝났습니다. 다음은 채널을 설정하는 SubVI를 만들어 보겠습니다.

     

    3-2. 채널 설정하기

    E3631A 매뉴얼을 찾아보니 출력 채널을 설정하는 커맨드는 아래와 같았습니다.

    INSTrument[:SELect] {P6V|P25V|N25V}

    동일한 방법으로 SubVI를 만드는데, 이번에는 세 개의 채널 중에서 선택해야 하므로 채널을 선택하여 입력하는 부분이 필요하겠습니다.

    세 개의 채널 선택 부분을 만들기 위해서 열거형 컨트롤(Enum)을 사용하겠습니다. 프론트 패널에서 Ring & Enum - Enum을 선택합니다.

     

    Enum 컨트롤의 이름을 Channel로 변경해 주고, 오른쪽 클릭하여 Properties - Edit Items 탭으로 들어갑니다.

     

    여기에서 선택할 채널을 입력해 주겠습니다. Insert를 눌러서 채널을 입력합니다.

     

    여기에서 Items와 Values는 1:1로 대응됩니다. Items에서 +6V 를 선택하는 것은 곧 숫자 0 을 선택하는 것과 같습니다. 이제 확인을 누르고 Enum 컨트롤을 클릭해 보면 아래처럼 각 채널이 입력된 것을 알 수 있습니다.

     

    아래와 같이 터미널을 연결하는 것으로 프론트 패널의 설정은 끝납니다.

     

    이제는 Channel 컨트롤의 입력에 따라서 명령어가 바뀌어야 하는 부분을 작성해 보도록 하겠습니다. 케이스 구조를 이용하는 것이 좋겠습니다. 케이스 구조를 만들고 Channel 컨트롤을 케이스 선택자에 연결하고, 케이스 구조를 오른쪽 클릭하여 Add Case for Every Value 를 클릭하면 모든 채널 값에 대해서 케이스 구조가 생성됩니다.

     

    아래처럼 각 채널값에 대해서 +6V -> P6V, +25V -> P25V, -25V -> N25V 의 값이 출력되도록 케이스 구조를 설정해 주시고, 문자열 연결(Concatenate String)함수를 사용하여 문자열을 합쳐줍니다(중간에 공백이 들어가야 하는 것을 잊지 마세요). 이렇게 하면 채널 선택을 위한 SubVI가 완성되었습니다.

     

    3-3. 전압 설정하기

    이번에는 전압을 설정하는 SubVI를 만들어 보도록 하겠습니다. 기본적인 구조는 채널 선택을 위한 SubVI와 별반 다를 게 없습니다. 간단하게 만들어진 블록 다이어그램만 보도록 하겠습니다. 커맨드는 아래와 같습니다.

    VOLT <numeric>

     

    이렇게 SubVI를 모두 만들었습니다. 이제 Main.vi에서 이벤트 구조를 사용해서 원하는 기능을 구현해 보도록 하겠습니다.

     

    4. 이벤트 구조 구현하기

    이벤트 구조에 대한 사용법과 설명은 이전 글 [이벤트 구조란 무엇인가?] 를 확인해 주시기 바랍니다. 다시 설명드리면 이벤트 구조는 일반적으로 혼자 사용되지 않고 while loop와 함께 사용합니다. 

    아래처럼 while loop와 이벤트 구조를 만들어 주겠습니다.

     

    4-1. timeout을 이용하여 전압/전류를 읽어오기

    특정 시간이 지날 때마다 이벤트를 발생시켜 전압과 전류를 읽어오는 부분을 구현하기 위해서는 이벤트 구조의 timeout을 활용하면 됩니다. timeout은 특정 시간이 지나면 해당 이벤트가 발생하도록 합니다. 우리는 3초에 한 번씩 전압과 전류를 읽어오도록 하겠습니다. 이벤트 구조의 왼쪽 위에 있는 모래시계 부분에 3000을 입력합니다. timeout의 기본 단위는 ms(milisecond)이기 때문에, 3초를 입력하기 위해서는 3000 ms 를 입력해 주어야 합니다.

     

    전압과 전류를 읽어오는 SubVI를 넣어보도록 하겠습니다. 몇 가지 방법이 있겠지만 제가 가장 많이 사용하는 방법은 Quick Drop을 이용하는 방법입니다. Quick Drop은 프로젝트 내에 있는 vi들을 빠르게 넣어줄 수 있는 방법입니다.

    1. 블록 다이어그램에서 Ctrl + Space 를 눌러 Quick Drop을 열고
    2. 넣어 줄 SubVI 이름을 검색합니다. 우리는 Voltage 또는 Current를 입력합니다.
    3. 해당하는 SubVI를 선택(또는 엔터)하여 삽입합니다.

    Quick Drop을 이용한 SubVI 삽입하기

     

    SubVI를 추가하고 적당히 연결해 주면, 3초에 한 번씩 전류와 전압을 읽어오는 부분은 완료됩니다.

     

    4-2. 채널 선택하기

    채널을 선택할 때에는 Channel 열거형(Enum) 컨트롤의 값이 변경되었을 때를 감지해야 합니다. 아래와 같은 방법으로 이벤트 구조에서 Channel 컨트롤의 값이 변경되는 것을 감지할 수 있습니다. Add Event Case를 선택합니다.

     

    아래와 같이 이벤트 케이스를 추가해 줍니다.

     

    추가된 이벤트 케이스에 채널을 선택하는 SubVI를 추가합니다.

     

    4-3. 전압 설정하기

    전압을 설정하는 이벤트 구조도 대동소이합니다. 아래와 같이 이벤트 구조를 만들어 줍니다. 이 때, 컨트롤 Voltage set 버튼을 이벤트 구조에 넣어주어야 하는 것을 잊지 마세요. 마지막으로 계측기의 GPIB 번호는 상수로 입력하거나 컨트롤로 입력하도록 해 주면 되겠습니다.

     

    글이 엄청 길어졌습니다. 여기까지 오느라 수고 많으셨습니다.

    댓글

    Designed by JB FACTORY