我有一个测试夹具,其中有一个通过National Instruments以太网到GPIB桥连接到PC的Agilent E4426B RF信号发生器。我的软件正在尝试通过预置仪器进行消毒,然后将当前状态保存到可通过标准SCPI命令“* SAV x,y”写入的所有存储位置。
循环进行到一定程度,但是最终仪器会以错误响应,并在前面板显示屏上连续显示“L”图标,并在底部连续显示“远程预设”消息。到那时,它将不再响应任何远程命令,我必须关闭电源或按LOCAL(本地),然后按PRESET(预设),此时大约需要3分钟才能完成预设。那时,“L”图标仍然存在,并且发送给仪器的下一个GPIB命令导致它在仪器错误队列中报告-113错误(未定义的 header )。
我启动了NI spy 以查看发生了什么,发现错误是在循环的同一点发生的,在这种情况下为“* SAV 6,2”。从NI Spy:
这是仪器驱动程序中的代码:
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 ms导致循环在44,1处出错,而20 ms更早。我已经消除了布线错误或仪器故障的根源。这种相同类型的序列在高端信号发生器上没有任何错误,因此很容易将其归因于仪器固件中的错误。
最佳答案
尝试将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;
}
关于c++ - 在多次GPIB * SAV操作期间,Agilent E4426B信号发生器会锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3031012/