DLL einbinden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
RoterMilan
User
Beiträge: 5
Registriert: Mittwoch 5. Oktober 2011, 16:28

Hallo,

habe ein Script geschrieben um eine Siemens SPS mittels der libnodave Bibliothek auszulesen.
Das Script funktioniert auf einem Linux PC einwandfrei.
Hier verwende ich die libnodave.so.

Auf einem Windows PC unter Verwendung der libnodave.dll
erhalte ich folgenden Fehler:
---
self.ph = self.dave.openSocket(self.port, self.ip)
ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention
---

Hier der Programmcode:

Code: Alles auswählen

import ctypes
import os
import string


class Logo:
    
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.ph = 0         # Porthandle
        self.di = 0         # Dave Interface Handle
        self.dc = 0
        self.res = 1
        self.rack = 1       
        self.slot = 0
        self.mpi = 2
        self.dave = ""
        self.daveDB = 132
        #Pfad zur DLL
        Dateipfad = os.getcwd() 
        #DLL_LOC = Dateipfad + '/' + ('libnodave.so')
              
        if os.name == 'nt':
            DLL_LOC = Dateipfad + '/' + ('libnodave.dll')
            self.dave = ctypes.cdll.LoadLibrary(DLL_LOC)
        if os.name == 'posix':
            DLL_LOC = Dateipfad + '/' + ('libnodave.so')
            self.dave = ctypes.cdll.LoadLibrary(DLL_LOC)
        print
        print "******************************************************************"
        print "  Betriebssystem: ",os.name
        print "  Pfad zur DLL:   ",DLL_LOC
        print "******************************************************************"
            
    
    def connect(self):        
        # Open connection
        print 
        print "- Try open connection"
        self.ph = self.dave.openSocket(self.port, self.ip)
        if self.ph > 0:
            print "- Port Handle O.K."
        else:
            print "- Port Handle N.O.K."
            
        # Dave Interface handle
        self.di = self.dave.daveNewInterface(self.ph, self.ph, 'IF1', 0,  122 , 2)
        print "- Dave Interface Handle :", self.di
        
        # Init Adapter
        self.res = self.dave.daveInitAdapter(self.di)
        if self.res == 0:
            print "- Init Adapter O.K."
        else:
            print "- Init Adapter N.O.K."
            
        # dave Connection
        self.dc = self.dave.daveNewConnection(self.di, self.mpi, self.rack, self.slot )       # daveNewConnection(di, MPI, rack, slot)
        print "- Dave Connection: ", self.dc
        
        self.res = self.dave.daveConnectPLC(self.dc)
        self.dave.daveSetTimeout(self.di, 5000000)
        print "- res: ", self.res
        
        
    def readbytes(self, db, start, len):
        print "- read"
        print
        #daveReadBytes(daveConnection, int area, int DB, int start, int len, void * buffer);
        if self.res == 0:
            rd = self.dave.daveReadBytes(self.dc, self.daveDB ,db,start,len, 0)
            
            print "ReadBytes: ",len #+ str(self.res)
            for z in range(len):                
                a=self.dave.daveGetU16(self.dc)
                print z," ", a
            
        else:
            print "Bitte erst Verbindung Ueber C O N N E C T  aufbauen"
            
    def writebytes(self, db, wort, wert):
        print "- write"
        print
        u=self.dave.daveSwapIed_16(wert) 
        buffer = ctypes.c_int(int(u))
        buffer_p =  ctypes.pointer(buffer)
        #a.write_bytes(132, 1, wort, 2, buffer_p)
        a = self.dave.daveWriteManyBytes(self.dc, self.daveDB, db, wort,2, buffer_p)
        #a.write_bytes(132, 1, wort, 3, buffer_p)
    
    def disconnect(self):
        self.dave.daveDisconnectPLC(self.dc);
        self.dave.closePort(self.ph)
        print
        print "- Verbindung zur SPS beendet"







def main():
    plc = Logo('172.21.30.46', 102)
    plc.connect()

    plc.readbytes(1,0,10)
    #plc.writebytes(1,10,4040)
    plc.disconnect()
	
	

if __name__ == '__main__':
	main()
Ich kann mir den Fehler leider nicht erklären,
habe gegoogelt, komme aber nicht weiter.
Das Script bricht beim "connect zur SPS" mit einer Fehlermeldung ab.

wie schon erwähnt funktioniert das Programm auf einem Linux PC einwandfrei.
kann mir jemand helfen ?
deets

Es gibt CDLL und WINDLL, das koennte den Unterschied machen:

http://docs.python.org/library/ctypes.h ... -libraries
RoterMilan
User
Beiträge: 5
Registriert: Mittwoch 5. Oktober 2011, 16:28

Danke für den Tip.

Script funktioniert.

MfG

RoterMilan
Antworten