Python仪器驱动程序

时间:2012-12-12 13:34:57

标签: python .net com driver visa

我是一名实验物理学家,是Python的忠实拥护者。

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

到目前为止,我一直在使用多种策略直接与我的IPython会话进行交互:

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

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

我的第一个问题是技术问题: 我到处都读到COM对象集成在.NET框架中,并且可以在.NET中直接使用COM对象。在我的例子中,我可以通过从pythondotnet导入comtypes模块(参见http://code.activestate.com/recipes/578089-using-iviscope-instrument-driver-with-python/)和dotnetclr来使用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建议,这将是一个很好的起点。

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

3 个答案:

答案 0 :(得分:3)

我无法谈论你的第一个问题,但我一直在研究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或。它可以在Windows,Linux和Mac OS X上运行。它甚至可以在Raspberry Pi上运行。此外,Python IVI可以使用PyVISA访问National Instruments兼容硬件。

我称之为解释而不是实现,因为它不能仅仅因为它是Python而遵循规范。我试图尽可能地遵循规范,但我也试图尽可能保持pythonic。不过,这还不到一年,而且我目前是唯一一个使用各种各样的仪器工作的人。如果有人想帮忙,我会非常乐意接受捐款。

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

答案 1 :(得分: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)

答案 2 :(得分: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