2017-01-16 6 views
1

Ich versuche, einige C DLL (FANUC FOCAS-Bibliothek - für CNC) Code über Python mit Ctypes zu portieren, also schrieb ich Portierungscode. (wie unten), aber ein sehr seltsames Ergebnis beim Laden der DLL und Aufruf der Funktion. In meinem Fall verstehe ich die Verwendung von Handler in Python nicht.Handler Probleme Anwenden von cdll in Python

Ich möchte den folgenden c-Code in Python anwenden.

Declaration (für c)

#include "fwlib64.h" 
FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr,unsigned short port, 
long timeout, unsigned short *FlibHndl); 

Beispiel-Code (in focas Bibliothek Handbuch c)

#include "fwlib64.h" 
void example(void) 
{ 
unsigned short h;    
short ret;       
ODBST buf;       
ret = cnc_allclibhndl3("192.168.0.100", 8193, 1, &h) ; 
// 
if (!ret) { 
     cnc_statinfo(h, &buf) ;  
     cnc_freelibhndl(h) ;  
} else { 
     printf("ERROR!(%d)\n", ret) ; 
} 
} 

Testfocas.py

from ctypes import * 
mylib = cdll.LoadLibrary('./Fwlib64.dll') 
class ODBSYS(Structure): 
    pass 
_fields_ =[ 
    ("dummy", c_ushort), 
    ("max_axis", c_char*2), 
    ("cnc_type", c_char*2), 
    ("mt_type",c_char*2), 
    ("series",c_char*4), 
    ("version",c_char*4), 
    ("axes",c_char*2),] 

h=c_ushort() 
pt=pointer(h) 
ret=c_short() 
buf=ODBSYS() 

ret=mylib.cnc_allclibhndl3('192.168.0.100',8193,1,pt) 
mylib.cnc_statinfo(h,buf) 
mylib.cnc_freelibhndl(h) 

Ich möchte die Funktion 0 oder -16 zurückzukehren, aber in meinem Fall die Funktion Rückkehr ist

cnc_allclibhndl3 = 65520 (i guess open port)

cnc_statinfo = -8

cnc_freelibhndl -8

Return Status von Datenfenster Funktionen

EW_OK(0) Normal termination 
EW_SOCKET(-16) Socket communication error Check the power supply of CNC, Ethernet I/F board, Ethernet connection cable. 
EW_HANDLE(-8) Allocation of handle number is failed. 

Ich weiß nicht, was ich falsch mit.

Antwort

1

CDLL ist für __cdecl Aufrufkonvention. cdll wird nicht zur Verwendung empfohlen, da es sich um eine gemeinsam genutzte Instanz in Modulen handelt.

WINAPI als __stdcall definiert, so verwenden WinDLL:

mylib = WinDLL.LoadLibrary('./Fwlib64.dll') 

Als nächstes definieren argtypes und restype für Ihr Argument und Ergebnistypen für Ihre Funktion:

mylib.cnc_allclibhndl3.argtypes = c_char_p,c_ushort,c_long,POINTER(c_ushort) 
mylib.cnc_allclibhndl3.restype = c_short 

schließlich den Ausgangsparameter übergeben durch Bezugnahme. Es ist effizienter, als die Schaffung eines pointer:

h = c_ushort() 
ret = mylib.cnc_allclibhndl3('192.168.0.100',8193,1,byref(h)) 

Prototypen für cnc_statinfo und cnc_freelibhndl nicht zur Verfügung gestellt wurden. Definieren Sie auch argtypes und restype für sie.

+0

Vielen Dank für Ihre Hilfe. Nach dem Ändern des obigen Quellcodes tritt der folgende Fehler auf. ret = mylib.cnc_allclibhndl3 ('192.168.0.100', 8193,1, byref (h)) ctypes.ArgumentError: Argument 1: : Falscher Typ – Dogdripnet

+0

Sie sind wahrscheinlich auf Python 3. Pass eine Byte-Zeichenfolge als erster Parameter 'b'192.168.0.100''. Unicode-Zeichenfolgen entsprechen "c_wchar_t". –

+0

Sie haben Recht. Meine Entwicklungsumgebung ist 'Python3'. Danke für Ihre Hilfe! – Dogdripnet

Verwandte Themen