Pointer in Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Hallo,
mit dieser Funktion, die in einer .dll Datei liegt bekommt man einen Zeiger auf eine TransferArea mit der der Datenaustausch abgewickelt wird. Dieser Zeiger ist z.B. 22777136. Wie ruft man die Daten die hinter diesem Zeiger liegen dann auf? Die Daten sind einige 100 Bytes lang und enthalten Informationen über die Eingänge und Ausgänge eines Roboter-Interfaces. Meine Frage ist jetzt wie kann ich diese Daten komplett abrufen bzw. nur ein einzelnes Byte an einer bestimmten Stelle nach dem Zeiger. Mein Verdacht ist zwar, dass es dafür eine ctypes Funktion gibt, aber ich habe dort nichts gefunden, für eure Hilfe bin ich euch echt dankbar.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du wirst sehr wahrscheinlich diese `TransferArea` als `ctypes`-Klasse nachbauen müssen und müsstest diese dann als Return-Type für den Funktionsaufruf angeben. Wäre hilfreich, wenn du sagen könntest, um welche Bibliothek es sich handelt. Dann könnte man sich, sofern der Quelltext frei zugänglich ist, mal schlauer machen. Andernfalls musst du eben selber in den entsprechenden Header-Files nachschauen, wie eine `TranferArea` aufgebaut sein soll. Jedenfalls wird ein Helfen aus der Ferne, falls du keine großartige Erfahrung mit `ctypes` hast (und das vermute ich auch), wohl eher schwierig, solange niemand hier in den entsprechenden C-Quelltext gucken kann.
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Hallo,
es handelt sich um die KeLib von der Knobloch Electronic GmbH zur Ansteuerung des Fischertechnik Interfaces. Die KeLib kann man man hier herunterladen: http://www.fischertechnik.de/home/downl ... uting.aspx

Hier ist der Ausschnitt aus der Dokumentation (im Download enthalten), welcher sich mit der Transferarea befasst. Danach folgt der Aufbau dieser Transferarea.
5 Transferarea
Das Abfragen und Steuern der Ausgänge erfolgt durch eine "Transferarea"
(Kommunikationsspeicherbereich). Dieser Bereich wird nach dem Starten des
Kommunikationsthread (mittels StartFtTransferArea) alle 10ms mit dem Interface
abgeglichen. Dabei spielt es keine Rolle, ob das Interface über USB, seriell oder per Funk
an den PC angeschlossen ist. Auch spielt es keine Rolle, ob es sich um ein Intelligent-
Interface, Robo-Interface oder eine IO-Extension handelt. Über den Devicehandle erkennt
die Bibliothek, um welches Produkt es sich handelt und aktualisiert spätestens alle 10ms
die vorhandenen Eingänge / Ausgänge des jeweiligen Interfacetyps. Falls mehrere
Interface am Rechner angeschlossen sind, kann für jedes der angeschlossenen Produkte
ein eigener Thread gestartet werden. Den Aufbau der Transferarea findet man im
Anschluß an dieses Kapitel.
Hinweis:
Bei einem Intelligent Interface werden die Daten des Extension-Moduls auf den
Speicherplätzen des Extension-Moduls (Erweiterungsmodul) "1" gespeichert.
5.1 Aufbau des Speicherbereichs
Nachdem der Transferthread mittels StartFtTransferArea() gestartet wurde, kann die
Basisadresse für den Speicherbereich mit der Funktion GetFtTransferAreaAddress()
abgefragt werden.
Hier ist der Anfang vom Aufbau der Transferarea, es geht dann in dieser Art weiter:
5.1.1 Speicherlayout des Kommunikationsbereichs
Digitaleingänge des Grundmoduls
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Base+0x00: | E8 | E7 | E6 | E5 | E4 | E3 | E2 | E1 |
Digitaleingänge der Erweiterungsmodule 1-3
Base+0x01: | E16| E15| E14| E13| E12| E11| E10| E9 |
Base+0x02: | E24| E23| E22| E21| E20| E19| E18| E17|
Base+0x03: | E32| E31| E30| E29| E28| E27| E26| E25|
@snafu: Ich kenne mich mit ctypes wirklich nicht gut aus und es gibt auch keinen C-Quelltext.
BlackJack

@Lasse: In dem Archiv sind doch C++-Quelltexte enthalten und C-Header wo unter anderem ein ``struct`` für diesen Speicherbereich deklariert ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mit der Doku kommt man hier nicht wirklich weiter. Es geht in dem Fall ja nicht darum, *wie* etwas zu verwenden ist (so benutzerschnittstellenmäßig), sondern darum, wie etwas *implementiert* ist, damit man es halt nachbauen kann.

Glücklicherweise gibt es in dem entsprechenden Zip-File für die Bibliothek (KeLib_V1_78a.zip) aber durchaus mit der `/FtLib/Inc/FtLib.h` eine Header-Datei, deren Quelltext einsehbar ist und die offenbar auch den benötigten Datentypen definiert.

Ich habe hier mal die entsprechende Stelle im Code (relativ lang) extrahiert. Für alles weitere möge sich der Leser das Archiv selber runterladen. Auf jeden Fall wird dort ohne weitere "Zwischentypen" direkt auf den Basistypen von C gearbeitet, sodass eine entsprechende Wrapper-Klasse in Python eigentlich nur Fleißarbeit sein dürfte - entweder durch dich oder durch irgendwen nettes hier aus dem Forum. ;)
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Hallo,
eine Wrapper-Klasse wäre doch z.B. das: (aus der Python Doku)

Code: Alles auswählen

>>> class POINT(Structure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
Heißt ich bräuchte nur all die vorhandenen Dateitypen in der richtigen Reihenfolge abschreiben und ich hätte eine Wrapper Klasse?
Wie komme ich dann eigendlich an die Daten aus dem Speicher?

PS: Schon einmal danke für die schnelle Hilfe.
BlackJack

@Lasse: Du definierst den Rückgabetyp der Funktion als Pointer auf so eine `Structure`-Unterklasse.
Antworten