我有一个测试夹具,安捷伦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毫秒甚至更快。我已经消除了错误的布线或仪器作为罪魁祸首。这种相同类型的序列在高端信号发生器上没有任何错误,因此我很想将其归结为仪器固件中的错误。
答案 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;
}