我有一个测试夹具与安捷伦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)
这是仪器驱动程序的代码:
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甚至更快。我已经把有毛病的电缆或仪器排除在外了。这种类型的序列在高端信号发生器上没有任何错误,所以我很想把它归因于仪器固件中的一个错误。
发布于 2011-07-30 21:10:26
尝试将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;
}
https://stackoverflow.com/questions/3031012
复制相似问题