GPIB를 사용한 PC 간 통신

업데이트 됨 Jan 2, 2019

해당 제품

Driver

  • NI-488.2

문의사항

두 대의 PC를 GPIB를 통해 서로 통신하도록 설정하려면 어떻게 해야합니까?

해결책

아래는 PC 간 통신을 위한 지침으로 사용할 수 있는 일련의 과정입니다. GPIB를 사용하여 PC간 통신을 하려면 다음 단계를 완료하십시오.
  1. 두 PC를 기본 GPIB 설정으로 둡니다. 하나의 PC를 컨트롤러로 정의하고 다른 PC는 컨트롤러로 정의 하겠습니다. 설정을 변경할 필요는 없습니다.
  2. 컨트롤러(위에서 설명한대로) PC에서 주요 주소가 1인 인스트루먼트에 대한 세션을 열어야 합니다. IBIC에서 인스트루먼트 세션을 열려면 다음 단계를 완료하십시오.
    1. ibfind GPIB0 명령을 사용하여 GPIB 보드에 대한 세션을 엽니다.
    2. 버스에 인터페이스 클리어 메시지를 보내려면 ibsic 을 사용하십시오.
    3. 인스트루먼트 주소를 지정할 때마다 ibsre 1 을 사용하여 Remote Enable 행을 지정하십시오.
    4. ibdev 0 1 0 13 1 0 을 사용하여 비컨트롤러와의 세션을 여십시오. 첫 번째 매개 변수는 액세스 보드의 인덱스입니다. 두 번째는 장치의 기본 GPIB 주소입니다. 세 번째는 GPIB 장치의 보조 주소(일반적으로 0)입니다. 네 번째는 I/O 타임아웃 값입니다. 다섯 번째는 장치의 EOI 모드입니다. 여섯 번째는 장치의 EOS 문자 모드입니다. 이러한 모든 설정은 특정 GPIB 디바이스의 NI-MAX에서 찾을 수 있습니다.
    5. ibwrt "HELLO" 를 사용하여 데이터 문자열을 보내십시오. 이 경우 HELLO라는 단어는 비컨트롤러에게 보냅니다.
  3. 대화식 제어 (IBIC)를 사용하여 명령을 테스트 하십시오. 이후에 이 단계를 프로그램으로 구현할 수 있습니다. 비컨트롤러에서 다음 단계를 완료하십시오.
    1. ibfind GPIB0 명령을 사용하여 GPIB 보드에 대한 세션을 엽니다.
    2. 시스템 제어를 해제하려면 ibrsc 0 명령을 사용하십시오. PC를 비컨트롤러로 만드는 명령입니다.
    3. 비컨트롤러의 주요 GPIB 주소를 0에서 1 로 변경하려면 ibpad 1 명령을 사용하십시오.
    4. ATN 회선의 연결이 해제되어 있고 PC가 리스너(listener)로 지정되어 있는지 확인하십시오. LACS 라인은 PC가 리스너의 주소일 때 상태 워드에서 하이(High)로 나타납니다. 이 과정을 지속적으로 확인할 수 있는 루프를 만들 수 있습니다.
    5. ibrd #을 사용하여 컨트롤러에서 보낸 명령을 읽습니다. 여기서 #은 수신 할 것으로 예상되는 바이트 수입니다. 예를들어, HELLO 문자를 보낸다면 5 바이트를 읽을 것입니다.
컨트롤러 단계의 경우, 리어드레스된 비컨트롤러가 매번 듣게 하려면 리어드레싱(readdressing)을 활성화 해야합니다. 그렇지 않으면, 리스너가 없음을 의미하는 ENOL 오류가 발생 합니다. 리어드레스하려면 ibconfig ibcreaddr 1; 명령을 사용합니다. 이 명령은 컨트롤러에서만 사용합니다. 루프에서 실행되도록 상위 코드를 수정하려면 이 단계가 필요합니다.

컨트롤러 단계가 아닌 경우, 비컨트롤러가 어드레스드 될 때까지 루프에서 4 단계를 수행합니다. 컨트롤러에서 데이터 메시지를 전송한 다음 5 단계를 수행하고 메시지를 읽을 때 발생합니다. 쓰기에서 비슷한 접근 방식을 사용하겠지만, 듣기를 기다리는 대신 TACS 라인이 상태 단어에서 올라갈 때 어떤 일이 일어날지 말하기를 기다릴 것입니다.

프로그래밍 방식으로 제어하려면 C로 작성된 이 샘플 소스 코드를 따르십시오.

static int noncontroller;
static char buffer[100];
static int panelHandle;

int main ()
{
   // Open a session to the GPIB board
   noncontroller = ibfind ("gpib0");  

   // Release system control
   ibrsc (noncontroller, 0);   

   // Change primary address from 0 to 1
   ibpad (noncontroller, 1);   

   while (1) 
   {
      // Update Status variable
      ibwait (noncontroller, 0);   

      // Wait until non-controller is listener and ATN line is dropped. 
      if ((ibsta&LACS)&&(!(ibsta&ATN)))   
      {
         ibrd (noncontroller, buffer, 100);   // Read data bytes
         buffer[ibcnt] = '\n';   // Add linefeed and 0 to string.
         buffer[ibcnt + 1] = 0;
         printf ("%s",buffer); print buffer
         return 0;
      }   // first if

      // If addressed to talk, send the response "I am a talker"
      if ((ibsta&TACS)&&(!(ibsta&ATN)))   
      {    
         // Send data across the bus.
         ibwrt (noncontroller, "I am a talker", strlen("I am a talker"));   
         return 0;
      }   // second if
   }   // while
}   // main


이 코드를 실행하려면 다음 단계를 완료해야합니다.
  1. windows.h 헤더 파일을 포함하십시오.
  2. ni488.h 헤더 파일을 포함하십시오.
  3. 적절한 언어 인터페이스 파일로 응용 프로그램을 링크하십시오.
    1. Microsoft C / C ++의 경우 gpib-32.obj 와 링크 하십시오 .
    2. Borland C / C ++의 경우 borlandc_gpib-32.obj 와 링크 하십시오 .
GPIB 기능 및 상태 워드에 대한 자세한 내용은 관련 링크 섹션을 참조하십시오.

이 글이 도움이 되셨습니까?

도움 안됨