Externe DLL Funktion mit Rückgabe in double* Parameter
Verfasst: Samstag 9. Januar 2021, 10:57
Hallo zusammen,
ich bin neu hier, habe in alllen mögliche Sprachen schon was gemacht, in Python aber nicht wirklich der Freak. Im Moment stehe ich vor dem Problem, dass ich für die Ansteuerung spezieller Hardware eine vom Hersteller zur Verfügung stehende DLL einbinden möchte. Dafür gibt es dokumentierte Funktionen und prototypischen Code in C, VB und Delphi. Damit klappt das auch, aber ich möchte nun mal Python.
Die Funktionen sind alle so aufgebaut, dass sie bei Erfolg einen Rückgabewert >0 liefern. Alle Ergebnisse werden in Variablen by Reference zrückgegeben.
Ganz einfach gingen die ersten Schritte mit den Funktionen
Hier bekomme ich auch brav das Ergebnis:
Das Ergebnis sieht jetzt so aus:
Kann mich da jemand auf's Pferd heben?
Danke für jede Unterstützung!
Uli
ich bin neu hier, habe in alllen mögliche Sprachen schon was gemacht, in Python aber nicht wirklich der Freak. Im Moment stehe ich vor dem Problem, dass ich für die Ansteuerung spezieller Hardware eine vom Hersteller zur Verfügung stehende DLL einbinden möchte. Dafür gibt es dokumentierte Funktionen und prototypischen Code in C, VB und Delphi. Damit klappt das auch, aber ich möchte nun mal Python.
Die Funktionen sind alle so aufgebaut, dass sie bei Erfolg einen Rückgabewert >0 liefern. Alle Ergebnisse werden in Variablen by Reference zrückgegeben.
Ganz einfach gingen die ersten Schritte mit den Funktionen
undPrototyp: BOOL IK220Find (ULONG* pBuffer16);
pBuffer16: Zeiger auf 16 Langworte (16*4 Byte)
ULONG : unsigned 32 Bit
Prototyp: BOOL IK220Init (USHORT Axis);
Axis: Nummer der Achse (0 bis 15)
USHORT : unsigned 16 Bit
Code: Alles auswählen
from ctypes import windll,byref, c_ulong
ik220 = windll.LoadLibrary("C:\Windows\System32\IK220DLL.dll")
IKCard = c_ulong()
if ik220.IK220Find(byref(IKCard)) : print ("Cards found")
for Ax in range(0,3) :
if ik220.IK220Init(Ax):
if ik220.IK220Start(Ax):
print("Start channel {}: OK".format(Ax))
Und jetzt wird es schwierig. In der nächsten Funktion sollte ich einen Wert über einen Pointer zurückbekommen.Cards found
Start channel 0: OK
Start channel 1: OK
Start channel 2: OK
Start channel 3: OK
Dazu habe ich alles Mögliche probiert, aber vermutlich das Konzept hinter den ctypes nicht richtig verstanden.BOOL IK220Read48 (USHORT Axis,
USHORT Latch, double* pData);
double : Fließkomma 64 Bit
Code: Alles auswählen
from ctypes import windll,byref, c_ulong, c_double,c_int,pointer,POINTER
ik220 = windll.LoadLibrary("C:\Windows\System32\IK220DLL.dll")
IKCard = c_ulong()
if ik220.IK220Find(byref(IKCard)) : print ("Cards found")
for Ax in range(0,7) :
if ik220.IK220Init(Ax):
if ik220.IK220Start(Ax):
print("Start channel {}: OK".format(Ax))
count = c_double()
while True :
Ax = 1
if ik220.IK220Read48(Ax, 0, byref(count)):
print (count)
Der Wert in der Variablen ist wohl da, aber ich komme nicht dran.Cards found
Start channel 0: OK
Start channel 1: OK
Start channel 2: OK
Start channel 3: OK
c_double(-0.125)
c_double(0.218505859375)
c_double(-0.174072265625)
.
.
.
Kann mich da jemand auf's Pferd heben?
Danke für jede Unterstützung!
Uli