2010-06-13 3 views
3

У меня есть тестовое крепление с генератором сигналов RF Agilent E4426B, подключенным к ПК через мост National Instrument Ethernet-to-GPIB. Мое программное обеспечение пытается дезинфицировать инструмент, предварительно настроив его, а затем сохраняя текущее состояние во всех местах памяти, записываемых через стандартную команду SCPI «* SAV x, y».Генератор сигналов Agilent E4426B блокируется во время нескольких операций GPIB * SAV

Петля работает с точкой, но в конце концов прибор реагирует на ошибку и непрерывно отображает значок «L» на переднем дисплее и сообщение «Удаленная предустановка» внизу. В этот момент он не будет реагировать на какие-либо более отдаленные команды, и мне нужно либо задействовать питание, либо нажать LOCAL, а затем PRESET, в этот момент для завершения предварительной настройки требуется около 3 минут. В этот момент значок «L» все еще присутствует, и следующая команда GPIB, отправленная на инструмент, заставляет его сообщать об ошибке -113 (неопределенный заголовок) в очереди ошибок прибора.

Я выстрелил в шпионаж NI, чтобы узнать, что происходит, и обнаружил, что ошибка происходит в одной точке цикла - «* SAV 6,2» в этом случае. С NI Spy:

Отправить (0, 0x0017, "* SAV 6,2", 8 (0x8), NLend (0,0x01))
Process ID: 0x00000520 Thread 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; 
} 

Я попытался положить небольшой Sleep() задержка (10-20 мс) в конце внутреннего цикла, и, к моему удивлению, это вызвало ошибка появится раньше, а не позже. 10 мс вызвали ошибку цикла при 44,1 и 20 мс даже раньше. Я уже устранял неисправную проводку или инструмент в качестве виновника. Этот же тип последовательности работает без какой-либо ошибки в генераторе более высокого конца сигнала, поэтому я соблазняюсь помечать это до ошибки в прошивке инструмента.

+0

Вы пытались запустить режим отладки 'Send()' в режиме отладки? Если да, вы можете увидеть ошибку, возникающую в самом первом «Send()», при каждом 'Send()', в некоторых из них или что еще? – j4x

+0

Это не произойдет до 150-й или около того команды 'Send()'. Я поставил счетчик, чтобы сообщить мне, какой из них вызвал блокировку, затем положил задержку в цикле, потому что я предположил, что я нажимаю инструмент быстрее, чем мог бы справиться. Это заставило его заблокировать более-менее '' Send() ', чем без задержки. В этот момент мы просто удалили вызов 'Erase()' из нашей последовательности выключения и вручную удалили инструмент вручную, что на самом деле необходимо. – Andrew

+0

Если ваша цель - просто «дезинфицировать» инструмент, у Agilent, вероятно, есть процедура для этого. Я знаю, что они делают для Network Analyzers. – 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; 
}