ActiveX Control

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nzjules
User
Beiträge: 2
Registriert: Sonntag 9. September 2012, 22:33

Hallo Community,

ich habe die Aufgabe, eine Thorlabs-Traveling-Station über Python zu steuern. Ich habe den APT-User von Thorlabs bereits installiert und auch die ProgID vom ActiveX Control gefunden. Sie ist: "MGMOTOR.MGMotorCtrl.1"

Nun habe ich diverse site-packages installiert und mit pywin32, win32com versucht über den folgenden Befehle die ActiveX-Komponente steuern zu können:

Code: Alles auswählen

import win32com.client

h=win32com.client.Dispatch("MGMOTOR.MGMotorCtrl.1")
Im Handbuch von der Thorlabs Traveling-Stage steht, dass ich erst einmal einen ActiveX Server machen soll und die Komponente dann dort irgendwie öffnen soll... :K

Einen Server erstellen habe ich (meiner Meinung nach) hinbekommen, jedoch schaffe ich es nicht, die ActiveX Komponente in dem Server zu öffnen und zum Laufen zu bringen. Wie ist die Vorgehensweise bei so einer Aufgabe?

Ich nutze einen 64-Bit Windows 7 Rechner. Die Thorlabs-Programme funktionieren allerdings nur auf 32-Bit Versionen, deshalb habe ich Python 2.7 32-Bit Version installiert!

Lieben Gruß,
nzjules
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Code: Alles auswählen

import win32com.client
h=win32com.client.Dispatch("MGMOTOR.MGMotorCtrl.1")
Du solltest jetzt mit h auf die Funktionen zugreifen können die in der Doku genannt sind.

Also so etwas in der Art wie h.Connect(foo, bar) oder h.open(something). Ohne aber die API zu kennen kann man da nicht mehr sagen.

*edit*
Ich habe mich gerade auf der Homepage umgeschaut, coole sachen was sie da verkaufen, nur etwas über meinem Budget. Ich bin nur kurz über die LabView Anleitung und die (man mag es kaum glauben) Visual Basic 6 Beispiele geflogen. Es scheint bei dem ActiveX Element immer eine GUI zugeben?!?

Möglicherweise hast du dann das gleiche Problem wie ich mit einem ActiveX der Firma FLIR. Das Python jedesmal einfriert sobald man eine Funktion des ActiveXs aufruft, weil man dem ActiveX scheinbar keine Möglichkeit gibt seine GUI "auszuleben".
deets

@Sr4l

Das wird daran liegen, dass du keinen Event-loop aufrufst. Wie genau man das unter Windows macht - kA.

Aber auf FLIR-Kameras habe ich halbwegs erfolgreich mit VLC zugegriffen, der spricht die RTP/RTSP und was weiss ich noch fuer Protokolle da notwendig sind.

Doof war damals nur der fehlende Konfigurations-Support fuer die libvlc unter OSX, so dass ich leider immer 2 Sekunden Bufferung hatte.

Die Kamerakonfiguration selbst ging aber ueber telnet reibungslos.

So kam ich dann um den FLIR-ActiveX-Kram rum :)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

@deets auf die Idee bin ich damals nicht gekommen, und jetzt sieht gleich einer der ersten Google Treffer vielversprechende aus. Ich werde das Ende der Woche nochmal testen wenn ich die Zeit finde.

Mit VLC habe ich auch schon ähnliches unternommen. Interessant das hier noch jmd mit der Kamera rum gewerkelt hat. An etwas ähnliches wie die absoluten Temperaturdaten, welche das ActiveX Element liefert bist du aber unter Linux oder Mac nicht ran gekommen oder?
deets

Doch klar. Du kannst ja die aktiven Zonen mit Messpunkten/Zonen definieren, und via telnet periodisch auslesen.
nzjules
User
Beiträge: 2
Registriert: Sonntag 9. September 2012, 22:33

Sr4l hat geschrieben:
Also so etwas in der Art wie h.Connect(foo, bar) oder h.open(something). Ohne aber die API zu kennen kann man da nicht mehr sagen.
Ja, das habe ich auch gedacht. Habe dann aber unter PythonWin einmal geschaut, welche Methods alle zur Verfügung stehen, jedoch habe ich da nur so etwas wie z.b. die Folgenden gefunden:
_ApplyTypes_
_FlagAsMethod_
_NewEnum_
_AttrToID_
_call_
_oleobj_
...etc...... (das ist glaube ich die ActiveState list???)

Auf der Thorlabs-Seite wird aber gesagt, dass ich als Property die Seriennummer (Befehl="HWSerialNum") eingeben soll. Das wird mir ja aber gar nicht angezeigt...
Sr4l hat geschrieben:

*edit*
Ich habe mich gerade auf der Homepage umgeschaut, coole sachen was sie da verkaufen, nur etwas über meinem Budget. Ich bin nur kurz über die LabView Anleitung und die (man mag es kaum glauben) Visual Basic 6 Beispiele geflogen. Es scheint bei dem ActiveX Element immer eine GUI zugeben?!?

Möglicherweise hast du dann das gleiche Problem wie ich mit einem ActiveX der Firma FLIR. Das Python jedesmal einfriert sobald man eine Funktion des ActiveXs aufruft, weil man dem ActiveX scheinbar keine Möglichkeit gibt seine GUI "auszuleben".
Ja, das ActiveX Element hat immer eine GUI. Ist es dadurch jetzt einfacher oder schwieriger? :-D
Kann ich die GUI nicht einfach in einem Window bei Python öffnen? Wenn ja, wie würde ich das denn dann realisieren?

Danke für deine schnelle Antwort..


Lieben Gruß,
nzjules
deets

Ich denke mal das das Control ueber IDispatch verfuegt. Und dann kannst du trotzdem einfach object.HWSerialNum = "something" machen, weil win32com das dann entsprechend umsetzt auf die IDispatch-calls.

Steht auch alles hier:

http://oreilly.com/catalog/pythonwin32/ ... /ch12.html

Du kannst auch abfragen, welche properties es gibt, wenn du es nicht wissen solltest.

Und GUI macht's schwieriger. Du musst in Python eine GUI bauen, die das ActiveX-Control einbetten kann. Da findet man im Netz Beispiele zu wie das mit GTK oder wx-Python geht. Schoen ist das alles nicht, wenn du nicht musst, nimm vielleicht statt Python lieber VB.NET oder C#.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

Hallo,

ich habe auch ein Problem mit ActiveX Control in python bzw. dem Zugriff darüber auf eine FLIR Kamera. Mit Matlab habe ich den Zugriff bereits hinbekommen, allerdings möchte ist python für mich hinsichtlich der nicht notwendigen Lizenzabfrage sinnvoller.

Wie hier auch schon erwähnt habe ich folgendes ausgeführt:

Code: Alles auswählen

import win32com.client

CamCtrl = win32com.client.Dispatch("CAMCTRL.LVCamCtrl.4")
Das klappt auch soweit und ich bekomme auch die Funktionen des Software Development Kit (SDK) von FLIR angezeigt wenn ich mit "CamCtrl." weitermachen möchte.
Aber wenn ich dann einen Befehl ausführen möchte, kommt immer ein error:

Code: Alles auswählen

CamCtrl.Connect(13,0,9,6,'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\win32com\gen_py\07A923F2-CC74-43A8-ABD3-223236519706x0x1x0.py", line 39, in Connect
    , Port, Device, Interface, Server)
pywintypes.com_error: (-2147418113, 'Schwerwiegender Fehler', None, None)
An diesem Punkt komme ich nicht weiter und kann mit dem Fehler auch so recht nichts anfangen. Hat jemand eine Idee? Für Hilfe jeglicher Art wäre ich sehr dankbar.

Gruß
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SDUK: Da ist wohl irgendetwas nicht richtig initialisiert und es wird versucht auf Speicher zuzugreifen, wo es nicht sollte. Die genau API kenn ich nicht, aber am besten hältst Du Dich exakt an ein Beispiel, das funktioniert.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

Danke für die Antwort.

Mein Problem ist, dass ich kein Beispiel habe, das funktioniert. :shock:
Ich weiß wie gesagt, dass es mittels Matlab geht und dachte mir, dass es dann auch irgendwie über python möglich sein müsste (ist es sicherlich auch :wink: ).
Aber wie gesagt verstehe ich auch gar nicht, was der Fehler zu bedeuten hat.
Naja werde weiterhin mein Glück versuchen.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SDUK: wenn Du ein Matlab-Beispiel hast, das funktioniert, dann mußt Du es halt 1:1 nach Python umsetzen. Der Fehler sagt ja auch, dass er eigentlich nicht weiß, was schief läuft.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

Hey,

ja prinzipiell hast du recht Sirius3. Allerdings tue ich mich schwer damit einen entsprechenden Befehl bzw. Befehle für python zu finden. Kann natürlich daran liegen, dass ich python-Neuling bin.
In Matlab geht das ganze relativ einfach:

Code: Alles auswählen

CamCtrl = actxcontrol('CAMCTRL.LVCamCtrl.4',[0 0 186 252]); % Ueber [0 0 186 252] wird lediglich die Groesse eines Fensters vorgegeben, welches sich oeffnet
CamCtrl.Connect(13,0,9,6,''); %Verbinden mit der Kamera
Aufnahme = CamCtrl.GetImage(0); %Auslesen eines Bildes
In python habe ich es aber noch nicht hinbekommen, überhaupt mit der Kamera zu verbinden. Habe auch schon mit wxPython (wx.activex) rumprobiert, komme allerdings auch damit nicht weiter.
Vielleicht hat ja jemand Erfahrungen. Wie gesagt tut mir Leid, wenn es eine blöde Frage ist, aber ich bin python-Neuling.
Danke für die Hilfe.
BlackJack

@SDUK: Vorweg: Ich habe keine Ahnung von ActiveX-Controls und wie man die in Python einbindet.

Machst Du denn zwischen dem ``CamCtrl = win32com.client.Dispatch("CAMCTRL.LVCamCtrl.4")`` und dem `Connect()`-Aufruf in Python noch irgendetwas? Falls nicht, steckt in dem `actxcontrol()`-Aufruf bei Matlab ja vielleicht noch irgend etwas was man machen muss um so ein Control zu initialisieren was man unbedingt vor einem `Connect()` machen muss.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

Hey,
@BlackJack: Nein, zwischen den beiden Befehlen habe ich nichts weiteres ausgeführt. Und bzgl. Matlab habe ich versucht mir die Funktion anzuschauen, kann die aber nicht öffnen. Wie dem auch sei:

Ich bin einen Schritt weiter, was mein Problem angeht. Das möchte ich dem Forum natürlich nicht vorenthalten.
Ich muss dazu sagen, dass ich den Code und die ganzen Funktionen noch nicht durchdrungen habe.
Orientiert habe ich mich an dem "Tutorial" bzw. Codebeispiel: http://people.seas.harvard.edu/~krussel ... tiveX.html

Dabei wird das einzubindende Gerät als Unterklasse der Klasse "wx.lib.activex.ActiveXCtrl" eingebunden.
Ein Fenster für ActiveXControl wird außerdem mit wx.App erzeugt und letztlich die MainLoop gestartet.
Wie gesagt, werde mich noch genauer damit beschäftigen, um das ganze zu durchdringen.

In meinem konkreten Fall habe ich dann genau so ein Controlfenster, wie ich es auch unter Matlab habe und kann auch zur Kamera connecten, wenn ich diese an den Rechner angesschlossen haben. Mein einziges Problem besteht jetzt noch darin, dass ich die Funktionen der Kamera noch nicht nutzen kann, aber nicht weiß warum.
Habe mir zwar auch in meiner Klasse Funktionen definiert, die auf die Kamerafunktionen bzw. das SDK zurückgreifen, aber so recht funktioniert das ganze noch nicht.
Wenn ich das Problem dann vollständig gelöst habe, folgt hier natürlich weiteres.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SDUK: soweit bin ich jetzt inzwischen auch. Es gibt eine 'Dispatch'-Methode und eine 'DispatchWithEvents', wobei man zweitere braucht, wenn das ActiveX-Objekt nicht für sich läuft, sondern auch noch Events aus dem Windows Messaging-Loop verarbeiten muß. Das ist bei der Kamera wohl nötig, weil sie wahrscheinlich irgendwelche Bilder in ein Fenster zeichnen will.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

@Sirius3: Meinst du 'Dispatch' bzw. 'DispatchWithEvents' vom win32com-Paket? also win32com.client.DispatchWithEvents?
Ich als python-newbie frage mich dabei nur, wo ich dann diesen Aufruf durchführen muss.
Wenn ich bisher vor dem Starten der mainloop aber nach der Definition meiner Kameraklasse den Befehl ausführe, kommt ein TypeError, der besagt, dass die Initialisierung der Kameraklasse (__init__) zwei Argumente braucht, aber nur eins gegeben ist. Das verstehe ich allerdings nicht so recht, da zum einen per Klassendefinition nur ein Argument benötige und zum anderen ich ja auch nur die Klasse, aber keine Instanz übergebe.

Mal noch eine allgemeine Frage. Wenn ich mit wx.Python eine App erstelle und davon die MainLoop starte (vgl. Beispiel unter dem Link in meinem vorigen Post), kann ich dann denn noch direkt über die Console Befehle eingeben? Ich hatte den Eindruck, dass ich zwar Sachen eingeben konnte, aber die quasi nicht verarbeitet werden. (Nutze Spyder)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich habe mich (wie am Anfang dieses Thread geschrieben) vor zwei Jahren auch mit FLIR und dem dazugehörigen ActivX beschäftigt und es nie hinbekommen. Ich habe auch viele Sachen versucht die GUI in ein wx Fenster zu zeichen, schlussendlich ohne Erfolg. Was das ActivX Controll zeichen will konntest du bereits unter Matlab sehen. Es ist ein Video und Konfigurationsfenster.

Wir haben das Problem dadurch gelösst das wir die Kamera neu geflasht haben mit der Pleora Firmware für GigeE, dadurch kann man dann das Pleora eBus SDK verwenden und dann C++ nutzen, um dann auf die Kamera unter Windows und Linux zuzugreifen. Ich habe dann einen Python -> C -> C++ Extension geschrieben mit der für uns alles möglich war was wir wollten (temperatur 16bit raw werte, header parsen, raw werte zu temperatur in Kelvin Funktion, und TX/RX der seriellen Schnittstelle). Einziges Problem die Verbindung zwischen Kamera und PC muss gut (kurz / möglichst direkt, keine router/switches) sein weil ich keine saubere Fehlerbehandlung hinbekommen habe.
SDUK
User
Beiträge: 6
Registriert: Mittwoch 24. September 2014, 13:50

Hallo,

ich habe noch ein bisschen rumprobiert, komme aber zu keiner vernünftigen Lösung. Habe es jetzt alternativ einmal mit LabView probiert.... Es hat auf Anhieb geklappt.
Zwar wollte ich ursprünglich Python nutzen, da mir eine textbasierte Programmiersprache lieber gewesen wäre, aber da es so nunmal einfacher ist und ich damit lediglich meine Daten erfassen möchte, werde ich voraussichtlich LabView nutzen. Bleibt nur noch abzuwarten, ob ich meine anderen Messgeräte damit genauso einfach einbinden kann.
Antworten