Thema:
Kann die EPOS4, der IDX oder die EPOS2 auch mittels Python kommandiert werden?
Grundlagen:
maxon stellt keine Dokumentation, spezifische Libraries, Beispielcode oder Support für die Kommandierung von EPOS Steuerungen via Python zur Verfügung. Es ist jedoch möglich die "EPOS Command library" auch mit Python zu nutzen um eine EPOS4, EPOS2 oder den IDX zu kommandieren und Daten auszutauschen.
Basierend auf dem Feedback vieler Python- und EPOS4-Anwender empfehlen wir die Verwendung von "ctypes" für die Python-Anwendungsprogrammierung auf Basis der "EPOS Command Library".
Lösung: "ctypes" Library
Das einzige, was benötigt wird, um die EPOS4, EPOS2 oder den IDX mit Python zu kommandieren, ist die "ctypes" Bibliothek und die "EPOS Command library".
1.) ctypes
ctypes ist eine Funktionsbibliothek, die C-kompatible Datentypen zur Verfügung stellt und den Aufruf von Funktionen in DLLs (wie maxon's "EPOS Command library") ermöglicht. Sie wird als Teil der meisten Python-Programmierumgebungen sowohl auf Windows und Linux Systemumgebungen standardmäßig installiert.
Eine ausführliche Dokumentation über die Verwendung der "ctypes"-Bibliothek findet sich im Internet, z.B. ...
- https://docs.python.org/3/library/ctypes.html
- https://pgi-jcns.fz-juelich.de/portal/pages/using-c-from-python.html
Die angehängten zwei Beispielprogramme (für den RaspberryPi 3) zeigen sehr gut wie die ctypes Library importiert und verwendet werden muss. Die wichtigsten Punkte hierbei sind:
- ctypes einbinden:
- from ctypes import *
- from ctypes import *
- Die "EPOS Command library" in die Python Systemumgebung kopieren und den Zugriffspfad korrekt konfigurieren, z.B.
- path='/home/alg_sys/python/libEposCmd.so.6.6.1.0'
- path='/home/alg_sys/python/libEposCmd.so.6.6.1.0'
- Die "EPOS Command Library" laden:
- cdll.LoadLibrary(path)
epos=CDLL(path)
- cdll.LoadLibrary(path)
- Die Variable NodeID entsprechend der Konfiguration der EPOS4 definieren, z.B.
- NodeID = 1
- NodeID = 1
- Achtung: Datentyp-Umwandlung -> Stolperfalle!
Die Variablen-Typen von Übergabewerten, Rückgabewerten und Rückgabe-Pointern der 'C'-basierenden "EPOS Command Library" Funktionen muss korrekt auf die entsprechenden Python und ctypes und Datentypen umgesetzt werden, d.h. die entsprechend passenden ctypes Datendeklarationen verwendet werden, z.B. ...
- pNbOfBytesRead=c_uint()
pData=c_uint()
pPositionIs=c_long()
pErrorCode=c_uint() - Die "ctypes" Dokumentation zu den Datentypen findet sich hier:
- pNbOfBytesRead=c_uint()
- ctypes "byref" für Rückgabe-Pointer von "EPOS Command Library" Funktionen verwenden, z.B.
- keyhandle=epos.VCS_OpenDevice('EPOS4', 'MAXON SERIAL V2', 'USB', 'USB0', byref(pErrorCode) )
- ret=epos.VCS_GetPositionIs(keyhandle, NodeID, byref(pPositionIs), byref(pErrorCode))
- ret=epos.VCS_MoveToPosition(keyhandle, NodeID, 20000, 0, 0, byref(pErrorCode))
- Die "cytpes" Dokumentation zu "byref" findet sich hier:
2.) EPOS Command Library
Die "EPOS Command Library" wird als Bestandteil des "EPOS Setup" Pakets automatisch auf dem lokalen Laufwerk installiert. Standardmässig findet sich die Library inklusive der Dokumentation "EPOS Command Library.pdf" in den folgenden Verzeichnissen:
- C:\Program Files (x86)\maxon motor ag\EPOS IDX\EPOS4\04 Programming\Linux Library
- C:\Program Files (x86)\maxon motor ag\EPOS IDX\EPOS4\04 Programming\Windows DLL
Wichtige ergänzende Hinweise:
Kompatibilitätsprobleme zwischen Python 2 und Python 3
Bitte beachten Sie, dass Python 2.x und Python 3.x leider nicht mehr 100% kompatibel sind. Einige Befehle wurden bei Python 3.x hinzugefügt. Andere sind nicht mehr oder nicht mehr identisch bei Python 3.x vorhanden. Im Internet finden sich weitere Hinweise zu der Kompatibilität von Python 3 und Python 2, z.B. hier: Porting Python 2 Code to Python 3 — Python 3.9.2 documentation
Beispiel:
- Die Parameter zum Öffnen der Schnittstelle für die EPOS4 mussten mit Python 2.x wie folgt übergeben werden:
keyhandle=epos.VCS_OpenDevice('EPOS4', 'MAXON SERIAL V2', 'USB', 'USB0', byref(pErrorCode) ) - Der identische Aufruf muss bei Python 3.x wie folgt ausgeführt werden:
keyhandle=epos.VCS_OpenDevice(b'EPOS4', b'MAXON SERIAL V2', b'USB', b'USB0', byref(pErrorCode) )
Bitte beachten Sie bei den Dateinamen der angehängten Beispielprogramme. Aus dem Dateiname ist ersichtlich mit welcher Python Version diese getestet wurden.
Konfiguration des Library-Pfads:
Bitte beachten Sie, dass der Pfad, in welchem sich die maxon "EPOS Command Library" befindet, korrekt konfiguriert ist. Für die aktuellste Library Version z.B.
path='/home/pi/src/python/libEposCmd.so.6.7.1.0'
Windows + ctypes + EPOS Command Library
- DLL Version 32 Bit / 64 Bit:
Bitte beachten Sie bei Windows 64 Bit Betriebssystem-Versionen die EposCmd64.dll zur verwenden. Andernfalls tritt bei Python ein Win32 Fehlermeldung auf. -
Dokumentation & Beispielprogramm:
Nachfolgend finden Sie den Link zu einer sehr professionellen Information, Dokumentation und Beispielcode von einem maxon-Anwender und Software-Ingenieur, der Python und die "EPOS Command Library" erfolgreich auf einem Windows-System eingesetzt hat:
-> Interfacing and Controlling Maxon Motors Using Python | by M Khorasani | May, 2021 | Medium
-> https://github.com/mkhorasani/maxon_python_windows_64
Vielen Dank an Mohammad Khorasani.
Hinweis:
- Bitte beachten Sie, dass maxon keinen Support oder Schulung für Python, ctypes oder anwendungsspezifische Anpassungen der Beispiel-Programme bieten kann.
- Der Programmcode kann frei und ohne Einschränkungen weitergegeben, geändert, erweitert und für eigene Anwendungen genutzt werden.
- maxon lehnt jedoch jede Haftung und Gewährleistung auf Basis der Nutzung dieser Beispiele ab.
- Wir sind an Ihrer Meinung interessiert, ob die hier zur Verfügung gestellte Information zur Kommandierung der EPOS4 (oder EPOS2) mit Python hilfreich war?
- Bei Fragen nutzen Sie bitte unser Formular für den technischen Support.
Kommentare
0 Kommentare
Zu diesem Beitrag können keine Kommentare hinterlassen werden.