PyVISA - 无法让 GPIB 仪器以编程方式进入远程模式

Posted

技术标签:

【中文标题】PyVISA - 无法让 GPIB 仪器以编程方式进入远程模式【英文标题】:PyVISA - Can't get GPIB instrument to go into REMOTE mode programmatically 【发布时间】:2019-06-11 12:05:16 【问题描述】:

我在 PyCharm Community Edition 2016.1.4 上运行 Python 3.5.1 和 pyvisa 1.8。

“python -m visa info”的结果如下。

我在尝试使用 Keysight 34420A 纳伏表进行测量时遇到了一个奇怪的问题。

我正在使用 National Instruments GPIB-US-HS+ 电缆与 34420A 通信。 34420A 是 GPIB 地址 22,我已经从前面板验证过。

我得到的错误是: pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): 操作完成前超时。

读取 34420 的内部错误寄存器,我发现: 错误 1:550 错误 2:-420

这是唯一保存的两个错误。

根据 34420A 手册:

错误 550 是“命令不允许在本地 仪表收到 READ?命令,而在本地模式下进行 RS-232 操作。在通过接口发送其他命令之前,您应该始终执行 SYSTem:REMote 命令。"

错误 -420 是“查询未终止 仪表被寻址为通话(即通过接口发送数据),但尚未收到将数据发送到输出缓冲区的命令。例如,您可能执行了 CONFigure 命令(不生成数据),然后尝试使用 ENTER 语句从远程接口读取数据"

编辑:当我尝试发送 ERROR 550 消息中提到的 SYSTem:REMote 命令时,我得到: ERROR 514 "Command allowed only with RS-232: 有三个命令只允许使用 RS-232 接口: SYSTem:LOCal、SYSTem:REMote 和 SYSTem:RWLock” 如标题所述,我使用的是 GPIB。另外,正如本文后面提到的,当我查询接口类型时,它返回字符串“HPIB”,这是 GPIB 的原始名称。我不知道为什么在使用 GPIB 时会出现 RS-232 错误,但如果我不得不猜测,错误消息的日期可能是 RS-232 是唯一的方法与仪器通信,并且在引入 HPIB/GPIB 后错误消息从未更新。

错误 550 和错误 -420 的根本原因似乎是 34420A 需要处于远程模式才能进行测量。我的问题是我不知道如何以编程方式将 34420A 置于 REMOTE 模式。

根据我对 PyVISA 文档的阅读,我认为我需要使用 control_ren() 方法,但我不知道如何使其工作。

编辑:我已阅读 Stack Overflow 帖子 pyVISA: Return instrument to local mode programmatically。那是我最初指向 control_ren() 的指针。但是,正如我所提到的,我不知道如何让它工作。

我目前或多或少偶然发现的解决方法是启动 NI-MAX,选择 34420A,然后打开 VISA 测试面板。当我这样做时,34420A 上的 REMOTE 指示灯亮起,我可以进行测量。请注意,我不必向 34420A 发送命令。我只需要打开 NI-MAX 的 VISA 测试面板。

这是“python -m visa info”的结果:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

H:\>python -m visa info
Machine Details:
   Platform ID:    Windows-7-6.1.7601-SP1
   Processor:      AMD64 Family 21 Model 48 Stepping 1, AuthenticAMD

Python:
   Implementation: CPython
   Executable:     C:\Anaconda3\python.exe
   Version:        3.5.1
   Compiler:       MSC v.1900 64 bit (AMD64)
   Bits:           64bit
   Build:          Feb 16 2016 09:49:46 (#default)
   Unicode:        UCS4

PyVISA Version: 1.8

Backends:
   ni:
      Version: 1.8 (bundled with PyVISA)
      #1: C:\Windows\system32\visa32.dll:
         found by: auto
         bitness: 64
         Vendor: Agilent Technologies
         Impl. Version: 1345598497
         Spec. Version: 5243136
      #2: C:\Windows\system32\visa32.dll:
         found by: auto
         bitness: 64
         Vendor: Agilent Technologies
         Impl. Version: 1345598497
         Spec. Version: 5243136

不管怎样,在我打开 VISA 测试面板后,“python -m visa info”的结果似乎没有改变。

这是一个演示问题的示例程序,我改编自 Keysight 网站上的演示程序。请注意,我可以与 34420A 通信。除此之外,我可以读取 34420A 的 ID 字符串并确定接口类型(它是 HPIB,BTW - HPIB 是 GPIB 的原始名称);我就是无法让仪器进入 REMOTE 模式。

# -*- coding: utf-8 -*-
# Python for Test and Measurement

# Example programs avaialable at 'ftp://ftp.keysight.com/callpub6/callpub6/MISC/Keysight_Python'
#
# Requires VISA installed on Control PC
# 'http://www.agilent.com/find/visa'
# Requires PyVISA to use VISA in Python
# 'http://pyvisa.sourceforge.net/pyvisa/'

# Keysight IO Libraries 17.1.19xxx 
# Anaconda Python 2.7.7 32 bit
# pyvisa 1.6.3 

##"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
## Copyright © 2015 Agilent Technologies Inc. All rights reserved.
##
## You have a royalty-free right to use, modify, reproduce and distribute this
## example files (and/or any modified version) in any way you find useful, provided
## that you agree that Agilent has no warranty, obligations or liability for any
## Sample Application Files.
##
##"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

# Example Description:  
#    Basic Example which connects to instrument and queries instrument ID.

# Required Instrument Setup to Execute Example: 
#    Any instrument connected via GPIB/USB/LAN

# Additional Information:

# import python modules
import visa
import pyvisa
import pyvisa.resources
import pyvisa.constants


try:
    # Open Connection

    # Try two different ways of opening a resource manager, to see if either works.
    # rm = visa.ResourceManager('C:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\agvisa\\agbin\\visa32.dll')
    rm = pyvisa.ResourceManager()

    # Connect to VISA Address
    # LAN - VXI-11 Connection:  'TCPIP0::xxx.xxx.xxx.xxx::inst0::INSTR'
    # LAN - HiSLIP Connection:  'TCPIP0::xxx.xxx.xxx.xxx::hislip0::INSTR'
    # USB Connection: 'USB0::xxxxxx::xxxxxx::xxxxxxxxxx::0::INSTR'
    # GPIB Connection:  'GPIP0::xx::INSTR'
    # myinst = rm.open_resource("TCPIP0::K-E4990A-00892::inst0::INSTR")
    myinst = rm.open_resource("GPIB0::22::INSTR")  # Keysight 34420A Nanovoltmeter

    # Set Timeout - 5 seconds
    myinst.timeout = 5000

    # *IDN? - Query Instrumnet ID
    myinst.write("*CLS")
    myinst.write("*IDN?")
    print(myinst.read())

    myinst.write("SYStem:INTerface?")
    print(myinst.read())

    # myinst.write("SYStem:REMote")  # This is an RS232-only command

    # From: https://pyvisa.readthedocs.io/en/stable/_modules/pyvisa/constants.html
    gpib_ren_assert = pyvisa.constants.VI_GPIB_REN_ASSERT
    gpib_ren_assert_address = pyvisa.constants.VI_GPIB_REN_ASSERT_ADDRESS
    gpib_ren_assert_llo = pyvisa.constants.VI_GPIB_REN_ASSERT_LLO
    gpib_ren_assert_address_llo = pyvisa.constants.VI_GPIB_REN_ASSERT_ADDRESS_LLO

    # Per https://pyvisa.readthedocs.io/en/stable/api/resources.html#pyvisa.resources.GPIBInstrument.control_ren
    # "Controls the state of the GPIB Remote Enable (REN) interface line, and optionally the remote/local state
    # of the device."
    control_ren_return = myinst.control_ren(gpib_ren_assert_address)
    print("The value returned from myinst.control_ren(gpib_ren_assert_address) is: %s" % control_ren_return)

    control_ren_return = myinst.control_ren(gpib_ren_assert_address_llo)
    print("The value returned from myinst.control_ren(gpib_ren_assert_address_llo) is: %s" % control_ren_return)

    control_ren_return = myinst.control_ren(gpib_ren_assert)
    print("The value returned from myinst.control_ren(gpib_ren_assert) is: %s" % control_ren_return)

    control_ren_return = myinst.control_ren(gpib_ren_assert_llo)
    print("The value returned from myinst.control_ren(gpib_ren_assert_llo) is: %s" % control_ren_return)

    # https://pyvisa.readthedocs.io/en/latest/api/resources.html#pyvisa.resources.GPIBInstrument says:
    # "Do not instantiate directly, use pyvisa.highlevel.ResourceManager.open_resource()."
    # gpib_control_ren_return = pyvisa.resources.GPIBInstrument.control_ren(1)
    # print("The value returned from pyvisa.resources.GPIBInstrument.control_ren(1) is %s" % gpib_control_ren_return)

    # =======================================================================================================
    # Uncommenting the next line causes the error:
    # pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
    # apparently because the instrument is not in REMOTE mode first.
    # =======================================================================================================
    # myinst.write("MEAS:VOLT:DC?")
    # print(myinst.read())

    # Close Connection
    myinst.close()
    print('close instrument connection')

except Exception as err:
    print('Exception: ' + str(err.message))

finally:
    # perform clean up operations
    print('complete')

正如我所提到的,我认为我需要使用“control_ren()”方法,但我不知道如何。

编辑:如果我的 GPIB 仪器处于远程模式(通过使用我的 NI-MAX / VISA 测试面板组件),那么我可以发送“control_ren(2)”或“control_ren(6)”将仪器置于本地模式。那么为什么我不能使用 control_ren() 将仪器置于 REMOTE 模式?

使用“control_ren(6)”将仪器置于本地模式的基本思想来自pyVISA: Return instrument to local mode programmatically 值2对应pyvisa.constants.VI_GPIB_REN_DEASSERT_GTL 值6对应pyvisa.constants.VI_GPIB_REN_ADDRESS_GTL GTL = 转到本地

【问题讨论】:

你读过这个***.com/q/43592317/11476836 吗? @Marcos G. - 是的,这是我尝试 control_ren() 的最初提示。我将编辑我的帖子以说明这一点。 您是否尝试按照错误消息的建议发送命令SYSTem:REMote?我的经验是通过串行操作不同的设备,但总是通过发送命令来实现将系统切换到远程模式。 另外,如果您使用 NI-Visa 作为 pyvisa 的后端,它带有一个有用的类似于 shell 的接口,用于向设备发送命令。我发现它对调试此类问题非常有帮助。 @ChrisMueller - 当我尝试发送 SYStem:REMote 命令时,我得到: ERROR 514 "Command allowed only with RS-232: 有三个命令只允许使用 RS-232 接口: SYSTem:LOCal、SYSTem:REMote 和 SYSTem:RWLock”。如前所述,我使用的是 GPIB,而不是 RS-232。 【参考方案1】:

回答我自己的问题可能有点糟糕,但我想发布我找到的解决方案,以防其他人在尝试解决他们自己的类似问题时偶然发现这个问题。

长话短说,根本原因似乎是 National Instruments GPIB-USB-HS+ 电缆的连接问题。 34420A 在 GPIB 接口的一侧缺少螺丝适配器,因此我们只能在另一侧拧紧 GPIB 连接器。当我从另一台仪器拆下一个螺丝适配器并将其插入 34420A 时,我们可以将 GPIB 连接器的两侧拧紧,问题就消失了。

我们认为将 GPIB 连接器压紧并在一侧拧紧就足够了。显然,我们错了。

【讨论】:

以上是关于PyVISA - 无法让 GPIB 仪器以编程方式进入远程模式的主要内容,如果未能解决你的问题,请参考以下文章

Anritsu PyVISA 问题

Kivy & pyvisa - 如何在 GPIB 连接后将 ObjectProperty 设置为 None?

用EXCEL内嵌的Visual Basic for Application 编程,通过 USB-GPIB 控制器来驱动仪器34401A,并从34401A读取数据

PyVISA RS232 超时错误(安捷伦电源)

python visa/gpib模块中的等效函数ibwrtfW和ibwrtfA

GPIB:永远不会被淘汰 (转载)