У меня есть тестовое крепление с генератором сигналов 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 мс даже раньше. Я уже устранял неисправную проводку или инструмент в качестве виновника. Этот же тип последовательности работает без какой-либо ошибки в генераторе более высокого конца сигнала, поэтому я соблазняюсь помечать это до ошибки в прошивке инструмента.
Вы пытались запустить режим отладки 'Send()' в режиме отладки? Если да, вы можете увидеть ошибку, возникающую в самом первом «Send()», при каждом 'Send()', в некоторых из них или что еще? – j4x
Это не произойдет до 150-й или около того команды 'Send()'. Я поставил счетчик, чтобы сообщить мне, какой из них вызвал блокировку, затем положил задержку в цикле, потому что я предположил, что я нажимаю инструмент быстрее, чем мог бы справиться. Это заставило его заблокировать более-менее '' Send() ', чем без задержки. В этот момент мы просто удалили вызов 'Erase()' из нашей последовательности выключения и вручную удалили инструмент вручную, что на самом деле необходимо. – Andrew
Если ваша цель - просто «дезинфицировать» инструмент, у Agilent, вероятно, есть процедура для этого. Я знаю, что они делают для Network Analyzers. – Mike