Seite 1 von 1

DLL einbinden

Verfasst: Dienstag 8. Mai 2012, 16:00
von RoterMilan
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 ?

Re: DLL einbinden

Verfasst: Dienstag 8. Mai 2012, 16:31
von deets
Es gibt CDLL und WINDLL, das koennte den Unterschied machen:

http://docs.python.org/library/ctypes.h ... -libraries

Re: DLL einbinden

Verfasst: Dienstag 8. Mai 2012, 17:11
von RoterMilan
Danke für den Tip.

Script funktioniert.

MfG

RoterMilan