9

我是一名实验物理学家,也是Python的狂热爱好者。

我发现它非常适合数据分析和脚本编写,实际上我还使用它来连接实验室仪器(网络分析仪、示波器、信号分析仪和信号发生器......)。如果存在一个包含仪器驱动程序的好库,我认为 Python 将是我所在领域的MATLAB的一个非常重要的竞争对手。

到目前为止,我一直在使用几种策略来直接从我的IPython会话中连接它们:

  • 使用库 pyVisa,这很好,适用于大多数设备,但有点低级,并且需要额外的编程层来向用户公开有用的功能。

  • 我最近能够使用 pythondotnet 使用 IVI-COM 或 .NET 驱动程序(不是IronPython,它缺少NumPy / Matplotlib ...库)。这个方案显然是最令人满意的一个,因为IVI驱动程序已经相当高级,而且它们通常由供应商提供,并且来自不同供应商的仪器可以互换。

我的第一个问题是一个相当技术性的问题:我到处读到COM对象集成在 .NET 框架中,并且您可以在 .NET 中直接使用 COM 对象。就我而言,我可以通过导入 comtypes 模块(参见http://code.activestate.com/recipes/578089-using-iviscope-indotnet ​​strument-driver- with -python/ )和clr来自 pythondotnet来使用 COM 对象,但我根本不明白如何使用clr模块访问那些 COM 对象。有人可以解释 COM 和 .NET 之间的联系吗?

另外,我总是有点困惑,我怎么知道,当我有一个 DLL 文件时,它是否包含一个 .NET 模块,以及我是否可以用 .NET 4.0 版打开它(我是一个完整的这些框架问题的初学者和正确文档的链接会很好)?

第二个问题,更笼统地说,是不是已经有一个模块可以统一地为不同的仪器收集大量的驱动程序?在我看来,我们必须有成千上万的人在同一个问题上工作。

我最近迷上了模块 lantz http://lantz.glugcen.dc.uba.ar/。不幸的是,这是在 Python 3.0 中,而我仍在使用 Python 2.7(带有适用于 Windows 的 pythonxy 发行版)。此外,我有点害怕这个项目没有尝试实施 IVI 建议,这将是一个很好的起点。

任何评论或相关信息来源的链接都将受到欢迎。

4

3 回答 3

4

我不能回答你的第一个问题,但我一直在这里对 IVI 标准进行 Python 解释:https ://github.com/python-ivi/python-ivi 。不幸的是,它也是 Python 3,但它是纯 Python(不导入外部 DLL 文件、COM 或 .NET 对象),因此它可能不是您正在寻找的。但是,优点是这意味着它是跨平台的,应该可以在 Windows 和 Linux 中运行。

Python IVI(以及仪器接口 python-vxi11 和 python-usbtmc)已更新为无缝支持 Python 2 和 Python 3。它仍然是纯 Python,因此没有外部二进制依赖项(DLL 文件、COM 或 .NET 对象)它可以在 Windows、Linux 和 Mac OS X 上运行。它甚至可以在Raspberry Pi上运行。此外,Python IVI 可以使用 PyVISA 访问National Instruments兼容的硬件。

我称之为解释而不是实现,因为它不能仅仅因为它是 Python 就完全遵循规范。我试图尽可能地遵循规范,但我也尽可能地保持它像 Python 一样。不过,它还不到一年的历史,而我目前是唯一一个在研究它的人,我的乐器种类很少。如果有人愿意提供帮助,我会非常乐意接受捐款。

开箱即用,python-ivi 通过 python-vxi11 模块支持 LAN 上的 VXI-11 协议(我相信与大多数 LXI 仪器兼容)(python-vxi11 也是纯 Python,因此跨平台兼容),串行pySerial(跨平台)的仪器支持,以及 linux-gpib(仅限 Linux)的 GPIB 支持。我还计划包装 PyVISA,以便 python-ivi 能够使用 PyVISA 支持的所有接口。

于 2012-12-24T02:26:00.950 回答
3

我每天使用标准 Python(不是IronPython或 pythondotnet)中的 COM 类型来控制 IVI 驱动程序。我从来不需要任何额外的 .NET 绑定。我通常会做这样的事情:

from comtypes import client
dmm = client.CreateObject('VTEXDmm.VTEXDmm')
dmm.Initialize('TCPIP::10.20.30.40::INSTR', True, True)
dmm.Measurement.Read(1000)
于 2013-02-11T21:34:47.703 回答
1

另一种选择是使用 Tektronix 的 TekVisa。

import clr  clr.AddReferenceToFileAndPath('C:\Windows\\assembly\\GAC_32\\TekVISANet\\1.1.1.0__7f19bb2a5a9ae6e8\\TekVISANet.dll')

import TekVISANet
v = TekVISANet.VISA()
v.Open("GPIB0::6::INSTR")
id =v.Write("*IDN?",50)
s = v.Read(50)
print s
于 2016-01-06T23:59:13.830 回答