首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Agilent E4426B信号发生器在多个GPIB *SAV操作中锁定

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

Stack Overflow用户
提问于 2010-06-13 03:56:11
回答 1查看 725关注 0票数 3

我有一个测试夹具与安捷伦E4426B射频信号发生器通过国家仪器以太网到GPIB桥连接到PC。我的软件试图通过预置仪器来净化仪器,然后通过标准的SCPI命令"*SAV,y“将当前状态保存到所有可写入的内存位置。

循环工作到一定程度,但最终仪器会出现一个错误,在前面的显示器上连续显示"L“图标,在底部显示”远程预置“信息。在这一点上,它将不会响应任何更多的远程命令,我必须循环供电或按本地,然后预置,在这一点上,它需要大约3分钟来完成预置。此时,"L“图标仍然存在,下一个GPIB命令发送给仪器将导致它在仪器错误队列中报告一个-113错误(未定义的标头)。

我点燃了NI间谍,看看发生了什么,并发现错误发生在循环的同一点- "*SAV 6,2“在这种情况下。来自NI间谍:

发送(0,0x0017,“*sav6,2”,8 (0x8),NLend (0,0x01))

进程ID: 0x00000520线程ID: 0x00000518

iberr: 6 ibcntl: 2(0x2)

这是仪器驱动程序的代码:

代码语言:javascript
运行
复制
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甚至更快。我已经把有毛病的电缆或仪器排除在外了。这种类型的序列在高端信号发生器上没有任何错误,所以我很想把它归因于仪器固件中的一个错误。

EN

回答 1

Stack Overflow用户

发布于 2011-07-30 21:10:26

尝试将OPC?;添加到字符串中,然后执行读以等待OPC命令的完成。这样你的程序就不会“超载”仪器了。

代码语言:javascript
运行
复制
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; 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3031012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档