2010-06-13 1 views
3

National Instrument Ethernet-GPIB 브리지를 통해 PC에 Agilent E4426B RF 신호 발생기가 연결된 테스트 픽스처가 있습니다. 소프트웨어가 미리 설정하고 표준 SCPI 명령 "* SAV x, y"를 통해 쓸 수있는 모든 메모리 위치에 현재 상태를 저장하여 장비의 위생을 시도합니다.Agilent E4426B 신호 발생기가 다중 GPIB * SAV 작동 중에 잠김

루프는 포인트에 작용하지만 결국 장비는 오류로 응답하고 전면 디스플레이에 "L"아이콘이 표시되고 하단에 "원격 프리셋"메시지가 계속 표시됩니다. 이 시점에서 더 이상 원격 명령에 응답하지 않으며 전원을 순환 시키거나 LOCAL을 누른 다음 PRESET을 눌러 프리셋을 마치는 데 약 3 분이 소요됩니다. 이 시점에서 "L"아이콘이 계속 나타나고 계측기로 전송 된 다음 GPIB 명령은 계측기 오류 대기열에 -113 오류 (정의되지 않은 헤더)를보고하게합니다.

무슨 일이 있었는지 확인하기 위해 NI 스파이를 조사한 결과 루프의 같은 지점에서 오류가 발생했음을 발견했습니다 (이 경우 "* SAV 6,2"). NI 스파이에서 :

보내기 (0, 0x0017, "* SAV 6,2 ', 8 (0x8이), NLend (0,0x01))
프로세스 ID : 0x00000520 스레드 ID : 0x00000518
경우 ibsta : 0xc168에서 iberr : 6 ibcntl : 2 (0x2로)

그리고 여기가 인스트루먼트 드라이버의 코드입니다 :

int CHP_E4426b::Erase() 
{ 
    if ((m_StatusCode = Initialize()) != GPIB_SUCCESS) // basically just sends "*RST" 
    return m_StatusCode; 

    m_SaveState = "*SAV %d, %d"; 

    for (int i=0; i < 10; i++) 
    for (int j=0; j < 100; j++) { 
     sprintf(m_CmdString, m_SaveState, j, i); 
     if ((m_StatusCode = Send(m_CmdString, strlen(m_CmdString))) != GPIB_SUCCESS) 
     return m_StatusCode; 
    } 

    return GPIB_SUCCESS; 
} 

내가 끝에서 작은 수면() 지연 (10 ~ 20 밀리 초) 퍼팅 시도 놀랍게도 내 루프의 오류가 나중에보다는 오히려 일찍 나타납니다. 10 ms로 루프가 44,1에서 오류를 일으키고 20 ms가 훨씬 빨랐습니다. 나는 결함이있는 케이블 또는 장비를 이미 범인으로 제거했습니다. 이 같은 유형의 시퀀스는 하이 엔드 신호 생성기에서 아무런 오류없이 작동하므로이 부분을 계측기 펌웨어의 버그까지 백묵하게 만들려고합니다.

+0

디버그 모드에서'Send()'줄을 실행하려 했습니까? 만약 그렇다면 첫 번째'Send()', 모든'Send()', 그 중 일부 또는 그 밖의 에러에서 에러를 볼 수 있습니다. – j4x

+0

150 번째 정도의'Send()'명령까지는 발생하지 않습니다. 나는 어느 쪽이 잠김을 일으키는 지 말해달라고 카운터를 넣은 다음, 나는 그것이 내가 처리 할 수있는 것보다 빠르게 악기를 치고 있다고 이론화했기 때문에 루프에 지연을 두었습니다. 이로 인해 지연이없는 것보다 _earlier_'Send()'에 잠겨있었습니다. 이 시점에서 우리는 종료 시퀀스에서'Erase()'호출을 제거하고 실제로 필요한 경우에만 손으로 ​​악기를 지 웁니다. – Andrew

+0

귀하의 목표가 계측기를 단지 "살균"하는 것이라면 Agilent는이를위한 절차를 가지고있을 것입니다. 나는 그들이 네트워크 분석기를 위해하는 것을 알고있다. – Mike

답변

1

OPC?;을 문자열에 추가 한 다음 읽기를 수행하여 OPC 명령이 완료 될 때까지 기다리십시오. 이렇게하면 프로그램이 계기에 "과부하"되지 않습니다.

int CHP_E4426b::Erase() 
{ 
    if ((m_StatusCode = Initialize()) != GPIB_SUCCESS) // basically just sends "*RST" 
    return m_StatusCode; 

    m_SaveState = "*SAV %d, %d;OPC?;"; 

    for (int i=0; i < 10; i++) 
    for (int j=0; j < 100; j++) { 
     sprintf(m_CmdString, m_SaveState, j, i); 
     if ((m_StatusCode = Send(m_CmdString, strlen(m_CmdString))) != GPIB_SUCCESS) 
     return m_StatusCode; 
     Receive(m_CmdString, sizeof(m_CmdString)); 
    } 

    return GPIB_SUCCESS; 
} 
관련 문제