Генератор сигналов Agilent E4426B блокируется во время нескольких операций GPIB * SAV - PullRequest
3 голосов
/ 13 июня 2010

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

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

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

Отправить (0, 0x0017, "* SAV 6,2", 8 (0x8), NLend (0,0x01))
Идентификатор процесса: 0x00000520 Идентификатор потока: 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 мс было еще раньше. Я уже устранил неисправный кабель или инструмент как виновника. Этот же тип последовательности работает без ошибок на старшем генераторе сигналов, поэтому я испытываю желание объяснить это ошибкой в ​​прошивке прибора.

1 Ответ

1 голос
/ 31 июля 2011

Попробуйте добавить 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; 
}
...