Agilent E4426B信号发生器在多个GPIB * SAV操作期间锁定

时间:2010-06-13 03:56:11

标签: c++ instruments instrumentation gpib

我有一个测试夹具,安捷伦E4426B射频信号发生器通过National Instrument Ethernet-to-GPIB桥连接到PC。我的软件试图通过预设仪器来消毒仪器,然后将当前状态保存到可通过标准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线程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 ms),令我惊讶的是它导致错误显示在早期而不是之后。 10毫秒导致循环错误在44和20毫秒甚至更快。我已经消除了错误的布线或仪器作为罪魁祸首。这种相同类型的序列在高端信号发生器上没有任何错误,因此我很想将其归结为仪器固件中的错误。

1 个答案:

答案 0 :(得分: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; 
}