【问题标题】:What connection string do I use for pyvisa when my TCP device is connected via a USB to Ethernet Adapter?当我的 TCP 设备通过 USB 到以太网适配器连接时,我为 pyvisa 使用什么连接字符串?
【发布时间】:2020-09-02 22:05:30
【问题描述】:

我正在尝试与支持 SCPI 的 BraggMETER 询问器通信。

操作系统:Windows 10

连接硬件:j5create JUH470 USB 3.0 Multi-Adapter Gigabit Ethernet / 3-Port USB 3.0 HUB

我的部分困惑:我应该作为 USB 设备还是作为 TCPIP 设备访问?

当我通过 Telnet 连接时,一切顺利。 IP 地址和端口分别为 10.0.0.10 和 3500。

> telnet
> open 10.0.0.10 3500
:IDEN?
:ACK:HBM FiberSensing:FS22SI v3.0:08:046 840 200 898:20190116
:STAT?
:ACK:1

在 Python 中,我使用的是 pyvisa 库。

import easy_scpi as scpi
import pyvisa

DeviceAddress = '10.0.0.10'
DevicePort = '3500'
VISADevice = f'TCPIP0::{DeviceAddress}::{DevicePort}::SOCKET'
# Doesn't work either --> VISADevice = 'ASRL10::INSTR'

rm = pyvisa.ResourceManager()
print(rm.list_resources())

inst = rm.open_resource(VISADevice)
print(inst.query("*IDEN?"))
inst.close()

错误总是出现在rm.open_resource。我尝试了许多连接字符串。他们给出了不同的错误。以下是其中三个:

pyvisa.errors.VisaIOError: VI_ERROR_INTF_NUM_NCONFIG (-1073807195): The interface type is valid but the specified interface number is not configured.

pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.

pyvisa.errors.VisaIOError: VI_ERROR_RSRC_NFOUND (-1073807343): Insufficient location information or the requested device or resource is not present in the system.

更新 1

我下载了 National Instruments NI-Max 并使用了他们的 NI I/O trace。此连接字符串“有效”:

TCPIP::10.0.0.10::3500::SOCKET

但是,我仍然收到超时错误。尝试确保发送换行符终止字符并将超时时间提高到 5 秒(这确实生效,因为它延迟了超时错误的记录)。没有骰子。仍然给出超时错误。

更新 2

虽然设置不同,但其他人报告了使用 NI GPIB 转 USB 卡 (GPIB-USB-HS) 的问题。常见的线程是USB适配器...

https://community.keysight.com/thread/37567

【问题讨论】:

    标签: python visa pyvisa


    【解决方案1】:

    我无法发表评论,所以我在这里发表评论

    你试过用普通的socket吗?

    import socket
    
    DeviceAddress = '10.0.0.10'
    DevicePort = '3500'
    BUFSIZ = 1024
    ADDR = (DeviceAddress, DevicePort)
    cmd = "IDN?" # or "*IDEN?" as you've put?
    
    braggMeterSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    braggMeterSocket.connect(self.ADDR)
    braggMeterSocket.send(cmd + "\n") #maybe with new line depending on what the device terminator is.
    mesg = braggMeterSocket.recv(BUFSIZ)
    mesg = mesg.strip() # Remove \n at end of mesg
    print(mesg)
    

    【讨论】:

    • 这就是我接下来要尝试的。由于 Telnet 可以工作,但所有花哨的工具(包括 National Instruments NI-Max)都失败了,这可能是我唯一的选择。是的 - 我的设备使用 :IDEN?而不是 :IDN?出于某种原因。
    • 如果您能够让设备在 telnet 上工作,那么我认为它不是适配器。如果您向它发送命令,它会进行更改吗?如果是这种情况,并且它只是无法发回数据,那么我认为设备没有终止命令并且认为它还没有完成;因此超时,它正在等待发送更多命令。你有手册的链接吗?线路终止的说明是什么?
    • 我找到了原因 - 我的设备预期回车换行符作为命令分隔符,但 Python "\n" 只发送这两个字符之一。
    • 干得好。我只在旧设备上使用回车,有趣的是有些人仍在使用它。
    • NI-Max 只允许您指定可选的单个命令终止字符,通常是换行符或空字符。这让我错了,让我认为设备从来没有超过一个字符终止符。
    【解决方案2】:

    问题在于设备执行 CRLF(回车加换行)作为 SCPI 命令终止符。我只发送了这两个字符之一,“\n”。

    Python I/O 不像我使用的某些语言那样适应操作系统,在某些情况下会将“\n”解释为“\r\n”。

    同样,NI-Max 只发送了“\n”而省略了“\r”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2013-08-06
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多