Python工具驱动程序



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

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

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

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

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

我的第一个问题是一个相当技术性的问题:我到处都读到COM对象集成在.NET框架中,并且您可以在.NET中直接使用COM对象。在我的情况下,我可以通过导入comtypes模块来使用COM对象(请参阅http://code.activestate.com/recipes/578089-using-iviscope-instrument-driver-with-python/)以及来自pythondotnet的dotnetclr,但我根本不知道如何使用clr模块访问这些COM对象。有人能解释一下COM和.NET之间的联系吗?

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

第二个问题是,更普遍地说,难道没有一个模块可以以统一的方式为不同的工具收集更多的驱动程序吗?在我看来,我们一定有成千上万的人在处理同样的问题。

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

欢迎对相关信息来源发表任何评论或链接。

我不能回答你的第一个问题,但我一直在这里研究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.它甚至在树莓派上运行过。此外,PythonIVI可以使用PyVISA访问与National Instruments兼容的硬件。

我称之为解释,而不是实现,因为它不能仅仅因为是Python而完全遵循规范。我试着尽可能严格地遵循规范,但我也试着让它尽可能地像蟒蛇一样。不过,它还不到一年,我是目前唯一一个用我微薄的乐器制作它的人。如果有人想帮忙,我会非常乐意接受捐款。

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

我每天使用标准Python中的COM类型(而不是IronPython或pythondotnet)来控制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)

另一个选项是使用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

最新更新