====================================================== Common SCPI Errors
-440 Query unterminated [query received after query for indefinite response]
-410 Query interrupted [query followed by DAB or GET before response complete]
发送一个查询命令后,该命令并没有数据返回(如命令出错),此时去读取数据,就会报"Query UNTERMINATED",查询没有结束的意思?
发送一个查询命令后,该命令有数据返回,但是还没有读取,或者没有读取完毕, 此时,后面,又发送了一个查询命令,则报“Query INTERRUPTED”,查询被中断的意思。 ======================================================= 如命令本身写错了,或参数范围错误等等,如何判断SCPI命令是否成功呢?
(1)发送命令后,再使用“SYST:ERR?”,可以查询错误信息。 如成功时,返回“+0,"No error"” 命令错误时,返回“-113,"Undefined header"”
在设置命令后,接“SYST:ERR?”并没有问题。 在查询命令后,如果查询命令出错了,也没有问题。 如果查询命令正常,会有数据返回,此时接“SYST:ERR?”,会报“Query INTERRUPTED”。
所以,在“SYST:ERR?”之前,应该判断一下,是否有错误发生。
(2)发现了viReadSTB方法,它返回设备的status register。 开始以为它是一个简单的成功与否的标志, if(status!=0){ ...发送syst:err? ...显示错误信息 } 后来发现,有时候不正确。
然后看了这个文章: Using Instrument Status Registers and Service Requests in LabVIEW http://www.ni.com/white-paper/2927/en 才发现,这个status register还真是复杂啊~~~
它由Standard Event Status Register和两个 enable registers组成。 简单来说,status register由8个bit组成 00001110 前四位是保留字节,第5位为1,表示返回数据可用了,第6位为1,表示有事件发生了,第7位为1,有点晕,具体看文章吧~~~
那只要status的第6位为1,就说明可能有错误发生了 if ((status.getValue() & 0x0004) == 0x0004){ ...发送syst:err? ...显示错误信息 }
该status register取得后,会自动置空,不会影响下次结果。
(3)连接设备后,一般会使用"*RST"命令,该命令并没有置空status register, 所以还需要使用*CLS命令才行。
(4)status register的另一个作用,是轮询状态, 如发送查询命令后,在一个循环里,不停的轮询返回数据是否可用, 直到可用时,才读取数据。 上面,我们只是想知道命令是否出错,所以不需要轮询, 命令发出后,命令是否错误,马上就知道了。
|