VI_ERROR_TMO 当计算机对函数发生器进行查询时

VI_ERROR_TMO when a computer does a query to a function generator

我正在使用 peaktech 4046:160MHz Function/arbitrary 波形发生器。我在 pyton 上开发,我正在使用 pyvisa 库。 连接建立良好,生成器应用查询。但是它会生成以下错误并停止程序(错误后它不会执行任何操作)。

这是代码:

import pyvisa
rm = pyvisa.ResourceManager()
inst = rm.open_resource('TCPIP0::130.79.192.123::5025::SOCKET')
print(inst.session)
print(inst.io_protocol)

inst.query("source1:function squ")

这是我终端中的内容:

2
IOProtocol.normal
Traceback (most recent call last):
  File "c:\Users\Labo préclinique\Desktop\ProjetPython\importation de librairies\Forum.py", line 7, in <module>
    inst.query("source1:function squ ")
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\resources\messagebased.py", line 644, in query
    return self.read()
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\resources\messagebased.py", line 486, in read
    message = self._read_raw().decode(enco)
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\resources\messagebased.py", line 442, in _read_raw
    chunk, status = self.visalib.read(self.session, size)
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\ctwrapper\functions.py", line 2337, in read
    ret = library.viRead(session, buffer, count, byref(return_count))
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\ctwrapper\highlevel.py", line 222, in _return_handler
    return self.handle_return_value(session, ret_value)  # type: ignore
  File "C:\Users\Labo préclinique\AppData\Local\Programs\Python\Python39\lib\site-packages\pyvisa\highlevel.py", line 251, in handle_return_value
    raise errors.VisaIOError(rv)
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.

我试过了(没用): - 将 SOCKET 更改为 INSTR -使用超时时间更长(inst.timeout = 10000) - 添加结束词(尝试过 \n 和 \r):inst.read_termination = '\n'

所以我不知道该怎么办了...我需要给出不止一个命令,所以程序不能停得那么快。我怀疑我的函数发生器没有发回任何东西,但我不知道如何确保是这种情况。

我想知道的是:为什么在连接正常并且在设备上执行请求时会出现超时错误?如何以正确的方式进行请求?

提前致谢!!

PS : 我知道如何捕获错误(使用 try except),但我宁愿得到一个 Ok 的答案,也不愿得到一个 KO 的答案。

尝试通过

获取资源列表
rm.list_resources()

并检查您的资源 TCPIP0::130.79.192.123::5025::SOCKET 在其中。

然后检查对资源的标准请求来自tutorial:

inst.query("*IDN?")

query 是写操作的缩写形式,先发送一条消息,然后再读。所以你可以通过两个动作来指定错误(读取或写入错误?):

inst.write('"source1:function squ"')
print(inst.read())

请检查查询 source1:function squ 的名称,因为我在 documentation 中没有看到它。也许您应该使用 "source1:am:interanal:function square(文档第 57 页)或更改 squ -> square?

因此 documentation,您可以尝试通过

为您的请求设置无限超时
del inst.timeout

Also,您可以添加 read_termination/write_termination 选项来指定您将在

之前完成 reading/writing 的时间
inst = rm.open_resource('TCPIP0::130.79.192.123::5025::SOCKET', read_termination='\r')

最后的机会是更改选项 query_delay and send_end