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()
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 ?