2012-12-12 13 views
8

Jestem fizykiem eksperymentalnym i jestem wielkim entuzjastą Python.Sterowniki instrumentów Python

Uważam, że świetnie nadaje się do analizy danych i skryptów, a ja używam go również do interfejsu instrumentów laboratoryjnych (analizator sieci, zakresy, analizatory sygnałów i generatory sygnałów ...). Myślę, że Python byłby bardzo poważnym konkurentem dla MATLAB w moim polu, gdyby istniała ładna biblioteka zawierająca sterowniki instrumentów.

Do tej pory używam kilka strategii ich interfejs bezpośrednio z mojego sesji IPython:

  • Korzystanie z biblioteki pyVisa, co jest miłe, pracując dla większości urządzeń, ale trochę bit niskopoziomowy i wymaga dodatkowej warstwy programowania, aby odsłonić użyteczne funkcje dla użytkownika.

  • udało mi niedawno w użyciu sterowników IVI-COM lub .NET przy użyciu pythondotnet (nie IronPython, których brakuje NumPy/Matplotlib ... biblioteki). To rozwiązanie jest oczywiście najbardziej satysfakcjonujące, ponieważ sterowniki IVI są już na dość wysokim poziomie i zazwyczaj są dostarczane przez sprzedawców, a instrumenty pochodzące od różnych dostawców są wtedy zamienne.

Moje pierwsze pytanie jest raczej techniczny jedno: czytam wszędzie że COM obiekty są zintegrowane w ramach .NET i że można użyć objets COM diretly w .NET. W moim przypadku mogę używać obiektów COM, importując moduł comtypes (zobacz http://code.activestate.com/recipes/578089-using-iviscope-instrument-driver-with-python/) i dotnet z clr z pythondotnet, ale po prostu nie rozumiem, jak uzyskać dostęp do tych obiektów COM za pomocą modułu clr. Czy ktoś może wyjaśnić związek między COM i .NET?

Ponadto, zawsze jestem trochę zdezorientowany, skąd mam wiedzieć, kiedy mam plik DLL, jeśli zawiera on moduł .NET lub nie, i czy mogę go otworzyć z wersją 4.0 programu .NET (Jestem kompletnie początkującym w tych kwestiach ramowych, a link do odpowiedniej dokumentacji byłby całkowicie w porządku)?

Drugim pytaniem jest, bardziej ogólnie, czy nie istnieje moduł, który zgromadziłby większą liczbę sterowników dla różnych instrumentów w jednolity sposób? Wydaje mi się, że musimy być tysiącami ludzi pracujących nad tymi samymi problemami.

Niedawno wpadłem na moduł lantz http://lantz.glugcen.dc.uba.ar/. Niestety, jest to w Pythonie 3.0, a ja wciąż używam Pythona 2.7 (z dystrybucją pythonxy dla Windowsa). Co więcej, trochę się boję, ponieważ ten projekt nie próbuje wdrożyć zaleceń IVI, co byłoby dobrym punktem wyjścia.

Wszelkie komentarze lub linki do odpowiednich źródeł informacji byłyby mile widziane.

+0

IronPython posiada wsparcie dla NumPy/scipy: https://www.enthought.com/repo/.iron/ – jhexp

+0

@Samuel: Jako jeden z autorów Lantz, mogę powiedzieć, że jest na wspieranie IVI mapa drogowa. Plan ma zapewnić klasy mixin implementujące zestawy poleceń, które można łączyć. Prawdopodobnie nie będzie to możliwe przy użyciu tego samego interfejsu API. Konwencje nazewnictwa IVI i Python są niezgodne. Ale jesteśmy otwarci na dyskusję, zachęcamy do dołączenia do listy mailingowej lub otwarcia problemu, aby zobaczyć alternatywne rozwiązania. – Hernan

+0

Być może nie będziesz mógł rzucić okiem na [slave] (https://slave.readthedocs.org/en/develop/) utworzoną przeze mnie warstwę abstrakcji. Używamy go do kontrolowania naszego sprzętu laboratoryjnego. – P3trus

Odpowiedz

3

Nie mogę porozmawiać z pierwszym pytaniem, ale pracuję nad interpretacją Pythona standardu IVI tutaj: https://github.com/python-ivi/python-ivi. Niestety, jest to również Python 3, ale jest to czysty Python (bez importowania zewnętrznych plików DLL, obiektów COM lub .NET), więc może nie być dokładnie tym, czego szukasz. Jednak zaletą jest to, że jest to platforma wieloplatformowa i powinna działać zarówno w systemie Windows, jak i Linux.

Python IVI (i interfejsy instrumentalne python-vxi11 i python-usbtmc) został zaktualizowany, aby płynnie obsługiwać zarówno Python 2, jak i Python 3. Jest to nadal czysty Python, więc nie ma zewnętrznych zależności binarnych (pliki DLL, COM lub obiekty .NET) i działa na systemach Windows, Linux i Mac   OS   X. Został nawet uruchomiony na Raspberry Pi. Ponadto Python IVI może używać PyVISA do uzyskania dostępu do kompatybilnego sprzętu National Instruments.

Nazywam to interpretacją, a nie implementacją, ponieważ nie może podążać za specyfikacją listu tylko dlatego, że jest to Python. Starałem się śledzić specyfikację tak ściśle, jak to tylko możliwe, ale starałem się również zachować ją w jak najbardziej pythonic. Mają jednak mniej niż rok, a ja obecnie pracuję nad tym tylko z moim skromnym asortymentem instrumentów. Byłbym bardziej niż szczęśliwy mogąc przyjąć składki, jeśli są ludzie, którzy chcą pomóc.

Po wyjęciu z pudełka, python-ivi obsługuje protokół VXI-11 przez LAN (zgodny, jak sądzę, z większością instrumentów LXI) za pośrednictwem modułu python-vxi11 (python-vxi11 jest również czystym językiem Pythona, a tym samym wieloplatformowym kompatybilny), wsparcie dla urządzeń szeregowych z pySerial (międzyplatformowe) i wsparcie GPIB z linux-gpib (tylko Linux). Planuję również pakowanie PyVISA, aby Python-ivi mógł korzystać ze wszystkich interfejsów obsługiwanych przez PyVISA.

3

Używam typów COM w standardowym języku Python (nie IronPython lub pythondotnet) do codziennego kontrolowania sterowników IVI. Nigdy nie potrzebowałem żadnych dodatkowych powiązań .NET. Zwykle robię takie rzeczy:

from comtypes import client 
dmm = client.CreateObject('VTEXDmm.VTEXDmm') 
dmm.Initialize('TCPIP::10.20.30.40::INSTR', True, True) 
dmm.Measurement.Read(1000) 
+0

Czy "VTEXDmm" dotyczy konkretnego instrumentu lub instrumentu? To znaczy, czy "Dmm" oznacza "multimetr cyfrowy"? (może nawet wirtualny multimetr cyfrowy Texas Instruments?) A [multimetr laboratoryjny] (https://en.wikipedia.org/wiki/Multimeter#Digital_multimeters_.28DMM_or_DVOM.29) od firmy Texas Instruments? –

+0

Lub "TEX" dla Textronix? –

+0

VTEXDmm to nazwa klasy COM sterownika instrumentu - w tym przypadku sterownika Digital MultiMeter firmy VTI Instruments. Powinien to być jakikolwiek konkretny sterownik twojego instrumentu. – Jorenko

1

Inną opcją jest użycie TekVisa z Tektronix.

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