我有一个带有 Agilent E4426B 射频信号发生器的测试夹具,它通过 National Instrument 以太网到 GPIB 桥接器连接到 PC。我的软件试图通过预设仪器来清理仪器,然后将当前状态保存到所有可通过标准 SCPI 命令“*SAV x,y”写入的内存位置。
循环工作到一定程度,但最终仪器以错误响应并在前显示屏上持续显示“L”图标,并在底部显示“远程预设”消息。那时它不会再响应任何远程命令,我必须循环电源或按 LOCAL,然后按 PRESET 大约需要 3 分钟才能完成预设。此时“L”图标仍然存在,并且发送到仪器的下一个 GPIB 命令会导致它在仪器错误队列中报告 -113 错误(未定义的标头)。
我启动了 NI spy 来查看发生了什么,发现错误发生在循环中的同一点——在这种情况下为“*SAV 6,2”。来自 NI 间谍:
发送 (0, 0x0017, "*SAV 6,2", 8 (0x8), NLend (0,0x01))
进程 ID: 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 毫秒),令我惊讶的是,它导致错误出现得更早而不是更晚。10 ms 导致循环在 44,1 处出错,而 20 ms 甚至更快。我已经消除了故障电缆或仪器作为罪魁祸首。这种相同类型的序列在高端信号发生器上没有任何错误,所以我很想把这归咎于仪器固件中的错误。