资源代表一种仪器,如测量设备。从资源衍生出多个类,代表不同的可用资源类型(如 GPIB、串行)。每个类都包含底层设备可用的特定属性和方法集。
这些对象不是直接创建的,而是通过 ResourceManager 的 open_resource()方法返回的。一般来说,从 Resource 派生的主要有两类:基于消息的资源(MessageBasedResource)和基于注册的资源(RegisterBasedResource)。
要使用的资源 Python 类会根据资源名称自动选择。不过,您也可以强制使用资源 Python 类:
>>> from pyvisa.resources import MessageBasedResource
>>> inst = rm.open('ASRL1::INSTR', resource_pyclass=MessageBasedResource)
下文将探讨资源和基于消息(串行、GPIB 等)的最常见属性,这些属性是会经常遇到的。更多信息,请看 API。
仪器的每个通信通道都有一个唯一的会话句柄。可以获取该值:
>>> my_device.session
10442240
如果资源已关闭,则会出现异常:
>>> inst.close()
>>> inst.session
Traceback (most recent call last):
...
pyvisa.errors.InvalidSession: Invalid session handle. The resource might be closed.
大多数 VISA I/O 操作都可以设置超时。如果设置了超时,则每次操作时间超过超时后都会中止,并引发异常。每个仪器的超时时间以毫秒为单位。
对于所有 PyVISA 对象,超时时间被设置:
my_device.timeout = 25000
在这里,my_device 可以是一个设备、一个接口或其他任何东西,其超时时间被设置为 25 秒。要设置无限超时,可将其设置为 None 或 float('+inf') 或:
del my_device.timeout
现在,资源的每次操作都需要尽可能长的时间,甚至如果需要的话可以无限期地进行。 要将其设置为立即,请将其设置为 0 或负值。 (实际上,任何小于1的值都被认为是立即)
如果从设备读取数据,就必须将其存储在某个地方。不幸的是,PyVISA 必须在开始读取之前为数据预留空间,这意味着它必须知道设备将发送多少数据。然而,它并不能事先知道。
因此,PyVISA 以块为单位从设备读取数据。默认情况下,每块长度为 20 千字节。如果仍有数据需要读取,PyVISA 会重复该过程,并最终将结果连接起来返回给你。这 20 千字节足够大,所以大部分情况下一个读取周期就足够了。
整个过程都是自动完成的。通常情况下,无需担心。不过,有些设备不喜欢以块为单位发送数据。因此,如果在使用某些设备时遇到困难,并希望数据长度大于默认的分块长度,就应该增加其值,例如:
my_instrument.chunk_size = 102400
本例将其设置为 100 千字节。
计算机必须以某种方式检测设备何时完成信息发送。根据总线系统的不同,检测方法也不同。在大多数情况下,不需要担心终止字符,因为默认值非常好。但是,如果遇到困难,可以使用 PyVISA 来影响终止字符。
终止字符可以是一个字符,也可以是一串字符。只要输入流中出现该字符或字符序列,读取操作就会终止,并将读取信息发送给调用应用程序。下一次读取操作将紧接着上一次终止序列之后的输入流继续进行。在 PyVISA 中,终止字符会在信息提供之前被去掉。
可以为每个仪器设置终止字符,例如
my_instrument.read_termination = '\r'
(r'是回车符,通常在手册中以 CR 出现)。或者,也可以在创建仪器对象时输入:
my_instrument = rm.open_resource("GPIB::10", read_termination='\r')
默认值取决于总线系统。一般情况下,该序列为空,尤其是对于 GPIB。对于 RS232,则为\r。可以使用 write_termination 属性指定要添加到每条外发信息中的字符。
还有两个与信息终止有关的选项,即 send_end 和 query_delay。
send_end 是一个布尔值。如果为 True(默认值),每次写入操作后都会断言 EOI 线路,表示操作结束。EOI 是 GPIB 特有的,但其他接口也会执行类似操作。
参数 query_delay 是执行查询时每次写入操作后等待的时间(以秒为单位)。因此可以写
my_instrument = rm.open_resource("GPIB::10", send_end=False, delay=1.2)
这将把延迟设置为 1.2 秒,并省略 EOI 行。顺便说一句,不建议省略 EOI,所以如果还是省略了,应该知道自己在做什么。
除上述属性外,还可以通过属性访问VISA标准中定义的大部分 VISA 资源属性。这些属性将负责把 Python 值转换为 VISA 值,从而简化操作。如下图所示,其中一些属性还有更轻便的别名,使它们更容易访问:
from pyvisa import constants, ResourceManager
rm = ResourceManager()
instr = rm.open_resource('TCPIP0::1.2.3.4::56789::SOCKET')
instr.io_protocol = constants.VI_PROT_4882_STRS
# is equivalent to
instr.VI_ATTR_IO_PROT = constants.VI_PROT_4882_STRS
要了解资源上可用属性的完整列表,可以查看 visa_attributes_classes,如果使用的是 pyvisa-shell,则只需使用 attr 命令即可。
还可以使用 get_visa_attribute 和 set_visa_attribute 操作 VISA 属性。不过,必须使用适当的值(在 pyvisa.constants 中定义)来访问属性和指定值。
from pyvisa import constants, ResourceManager
rm = ResourceManager()
instr = rm.open_resource('TCPIP0::1.2.3.4::56789::SOCKET')
instr.set_visa_attribute(constants.VI_ATTR_SUPPRESS_END_EN, constants.VI_TRUE)
如果使用 open_resource() 方法,则必须告诉该函数要连接的仪器的 VISA 资源名称。一般以总线类型开头,然后是双冒号"::",接着是总线内的编号。例如
GPIB::10
表示数字为 10 的 GPIB 设备。如果有两块 GPIB 板,且仪器连接到 1 号板,则必须写入:
GPIB1::10
至于总线,可以使用 "GPIB"、"USB"、"ASRL"(用于串行/并行接口)等名称。因此,在 COM2 连接仪器时,资源名称为:
ASRL2
由于一个串行接口只能连接一台仪器,因此没有双冒号参数)。不过,大多数 VISA 系统都允许使用别名,如 "COM2 "或 "LPT1"。您也可以添加自己的别名。
资源名称不区分大小写。不管你说的是 "ASRL2 "还是 "asrl2",都没有关系。如需了解更多信息,请参阅 http://www.ni.com/pdf/manuals/370423a.pdf 等全面的 VISA 说明。
VISA 资源语法和示例
(改编自 VISA 手册)下表列出了地址字符串的语法。可选的字符串段显示在方括号([ ])中。
详情见https://pyvisa.readthedocs.io/en/latest/introduction/names.html
使用 GPIB 关键字与 GPIB 资源建立通信。使用 VXI 关键字,通过嵌入式、MXIbus 或 1394 控制器获取 VXI 资源。使用 ASRL 关键字与异步串行(如 RS-232 或 RS-485)设备建立通信。对 PXI 和 PCI 资源使用 PXI 关键字。使用 TCPIP 关键字进行以太网通信。