TIA Funktionierte Python Bibliotek mit Optimierte Datenbausteine

Hallo zusammen

Ich teste gerade eine Koppelungsmöglichkeit einer S7-300 via seriellem MPI Adapter an einem PC System (Linux)
Aktuelle libnodav läuft auch (TestMPI), auch händisch angepasster C code bringt mir die Daten welche ich wünsche von der Steuerung.

Um das ganze nicht all zu low-level zu implementieren hätte ich gerne auf das hier angesprochene Python Interface zurückgegriffen [1]
Als Beispiel habe ich das hier [2] gefunden, jedoch beschreibt das eine Verbindung über Netzwerk. Auch das Beispiel mit LOGO hat für mein Problem nicht weitergeholfen, ebenfalls über Netzwerk [3]

Versuche ich das Beispiel auf seriell anzupassen:
Code:
import libnodave
import struct

link = libnodave.libnodave()

link.set_port('/dev/ttyUSB0',"38400", 'O')
link.new_interface('if1', 0, 1, 2)
link.set_timeout(50000000)

link.init_adapter()

link.connect_plc(2, 0, 2)

def read_real():
    print link.dave.daveGetFloat(link.dc)

def read_real_old():
    data = []

    for i in range(4):
        data.append(link.dave.daveGetU8(link.dc))

    real = struct.unpack('>f', struct.pack('4B', *data))[0]
    print real


def read_floats():
    link.read_bytes(0x84, 10, 92, 3 * 4)
    for i in range(3):
        read_real_old()


def read_new_floats():
    print link.read_bytes(0x84, 10, 92, 3 * 4)
    for i in range(3):
        read_real()

read_floats()

print 'YAY'

link.disconnect()
stirbt die Ausführung leider mit "Segmentation fault".

Hat jemand für dieses Python Interface ein funktionierendes Beispiel mit serieller Anbindung oder einen Tipp?
Bis jetzt habe ich leider nur Leute gefunden die das selbe Problem haben, zB. hier [4]

Vielen Dank & Grüsse

[1] https://github.com/netdata-be/python-libnodave
[2] https://github.com/gijzelaerr/siemens-300/blob/master/test.py
[3] https://blog.abapguru.de/2015/02/verbindung-mit-python-libnodave-und-einer-siemens-logo-0ba7/
[4] https://www.mikrocontroller.net/topic/380285
 
Hallo zusammen

Habe die python-libnodave leider nicht mit MPI zum rennen bekommen :-(

Was jetzt nach viel Debugging, teils auch in libnodave, läuft ist eine eigene simple Anbindung von libnodave in pytho.
Das jedoch das auch nur in python3, unter python2 generiert mit das selbe Python Script einen segfault :-(

Wenn jemand an Details interessiert ist kann ich gerne noch eine Ausführung dazu schreiben.

Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube kommunizieren zwischen Pc und seriell oder MPI mit einer SPS ist glaube ich inzwischen etwas sehr exotische. MPI ist eh nur noch sehr eingeschränkt nutzbar. Und ich verwende viel Python mit Ethernet und CanBus. Die Meisten SpS Systeme haben ja inzwischen eine Ethernet Schnittstelle
 
Hallo Georg

Danke für deine Antwort. Das ist in der Tat so, bei heutigen CPUs haben die meisten eine Netzwerkschnittstelle.
Da ich aber nicht die Monster Anbindung plane und noch einiges an S7-300 Hardware verfügbar habe (jedoch leider kein CP343-1 ;-) ) wäre ich für eine MPI Anbindung sehr dankbar.

Die gute Neuigkeit ist, ich habe es inzwischen mit Python3 und python-libnodave ebenfalls hinbekommen (auf Debian Linux)
Adapter ist ein alter Siemens RS232/MPI (972-0CA21-0XA0) an USB/RS22 Konverter (FTDI)

Für den Fall das eine hilflose Seele hier auf den Beitrag stösst und auf Lösung hofft, kurz eine Anleitung wie ich vorgegangen bin.
  • python-libnodave aus git ausgecheckt
  • mittels 2to3 das Script auf Python3 konvertiert ($ 2to3 ~./python-libnodave/ -n -w)
  • python-libnodave geringfügig patchen:
    • self.buffer = ctypes.create_string_buffer('buffer') -> self.buffer = ctypes.create_string_buffer(b'buffer')
  • Den, ich bin der Meinung Typo korrigiert, siehe [1]
  • Installiert mit "python3 setup.py install"
  • Der Code sieht aus wie folgt
Python:
import libnodave

link = libnodave.libnodave()

def main():
 
    localMPI = 0
    plcMPI = 2 #anpassen, je nach CPU Adresse
    plcRack = 0
    plcSlot = 0

    #link.SetDebug(99)
    print('01')
    link.set_port(b'/dev/ttyUSB0', b'38400', b'o')

    print('02')    
    link.new_interface(b'IF1', localMPI, libnodave.daveProtoMPI2, libnodave.daveSpeed187k)

    print('03')
    link.set_timeout(5000000)

    print('04')
    link.init_adapter()

    print('05')
    link.connect_plc(plcMPI, plcRack, plcSlot)

    print('06')
    print('M200.0 Immer EIN', link.get_marker(200,0))
    link.disconnect()

if __name__ == '__main__':
    main()

In der Hoffnung das das jemandem mal weiterhilft! :)

Grüsse


[1] https://github.com/netdata-be/python-libnodave/issues/2
 
Zuletzt bearbeitet:
Zurück
Oben