pymodbus: lesen möglich, schreiben nicht

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    vielleicht sind hier mehr pymodus-Nutzer:
    Möchte bei meiner Ladesäule über pymodbus das Register 1000 mit einem Wert (Stromstärke, hier 14) beschreiben. Alles hat, bis zum Crash und Funktionsverlust der SD-Karte auch mal funktioniert. Das Backup war natürlich nicht aktuell und nun bastle ich es mir nochmals zusammen...

    Hier der Code von write.py:

    Python
    #!/usr/bin/python3
    from pymodbus.client.sync import ModbusSerialClient
    client = ModbusSerialClient(method = "rtu", port="/dev/ttyUSB0", baudrate=9600, stopbits=1, bytesize=8, timeout=1)
    rq = client.write_registers(1000,14,unit=1)
    rq = client.read_holding_registers(1000,1,unit=1)
    print(rq.registers)

    Und hier die Fehlermeldung:

    Code
    Traceback (most recent call last):
     File "write.py", line 4, in <module>
       rq = client.write_registers(1000,14,unit=1)
     File "build/bdist.linux-armv7l/egg/pymodbus/client/common.py", line 97, in write_registers
     File "build/bdist.linux-armv7l/egg/pymodbus/register_write_message.py", line 138, in __init__
    TypeError: object of type 'int' has no len()

    Nehme ich die Zeile

    Code
    rq = client.write_registers(1000,14,unit=1)

    raus, kommt keine Fehlermeldung und der Wert im Register 1000 wird angezeigt (Wert stimmt auch). Auch wenn ich andere Werte der Register 1001 und 1002 abfrage passt es. So gesehen sollte die Kommunikation mit der Ladesäule funktionieren, nur das Schreiben klappt nicht...

  • Danke __deets__, die Fehlermeldung ist nun weg, Wert wird aber nicht ins Register geschrieben. Es wird immer der selbe Wert ausgegeben. Hab mich auch an die Anleitung orientiert und rumexperimentiert, also u.a. nicht nur das "s" entfernt sondern auch das "unit=1". Alles ohne Erfolg.

  • Auch das write_register sollte einen Fehlerobjekt (rq in deinem Code oben) zurückgeben - wie sieht denn das aus? Gibt das eventuell an, das die Operation nicht erfolgreich war?

  • Nein, keine Fehlermeldung. Es erscheint nur der ausgelesene Wert.
    Was ich auch nicht verstehe: es hat, als ich es Ende Mai installiert habe, mit dem ersten Code (also registerS) auch funktioniert. Seitdem hat es ja auch keine neue pymodus-Version gegeben, oder?
    Und mehr als pymodus und Python muss ich auch nicht installieren? Nicht dass da der Hund begraben ist...

  • Kenne ich mich nicht mit aus. Das es anders funktioniert haben soll bezweifele ich. Du hast ggf. subtil etwas anderes gemacht, zB statt nur einen Wert zu schicken eine Liste mit dann aber auch nur einem Wert drin verschickt. Ein neues Release von pymodbus ist eher unwahrscheinlich, ja.

    Und was heisst "keine Fehlermeldung"? Hast du die Rückgabe geprüft, oder erscheint nur keine auf der Konsole.

    Andere Pakete sind denke ich auch nicht notwendig - das waere schon seltsam, wenn man lesen, aber nicht schreiben kann. Da macht der modbus keinen Unterschied, und die Library sollte das auch nicht.

  • Servus,
    was mir gerade so spontan einfiel: ich hab seinerzeit mal für JumpY eine Modbus-Implementierung zwischen Raspi und Arduino gemacht.
    Dabei hat mir ein Modbus-Monitor sehr gute Dienste geleistet. Das war -> der hier <- ...
    Vielleicht hilft er Dir ja auch weiter.

    btw: evtl. hat das bei Dir damals aufgrund eines bugs funktioniert, der mittlerweile gefixt ist ;) ... alles schon da gewesen.

    cu,
    -ds-

  • Habe nun versucht nochmals alles zu installieren. Ich brauche wohl nicht extra sagen, dass jetzt natürlich gar nichts mehr funktioniert und ich schon an der Installation von pymodbus scheitere :wallbash:


    Habe das System eigentlich gestern neu aufgesetzt und nur Openhab 2.0 installiert. Auch kein Python, da schon die aktuelle Versin vorhanden war:

    Code
    pi@raspberrypi:~ $ sudo apt-get install python3
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    python3 is already the newest version.
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  • Zum einen vermischst du laut deinem Output munter Python 2 und Python 3. Zum anderen fehlt dir fuer das Python das du dann am Ende wirklich nutzten willst das dazugehörige dev-paket, also zB python-dev oder python3-dev oder was auch immer - denn da ist Python.h drin.

  • Danke, es wurde viel kopiert und auch eine Menge Warnmeldungen ausgespuckt

    und zum Schluss noch eine Fehlermeldung:

    Für mich ist das alles immer weniger nachvollziehbar...

  • Die letzte Fehlermeldung klingt nach Rechteproblem. Hast du sudo benutzt? Wenn ja, versuch mal das Verzeichnis das angemeckert wird vorher mit mkdir -p <pfad> zu erzeugen, damit es bereits existiert. Mit sudo sollten die Rechte dann egal sein.

    Die Warnungen sind ignorierbar.

  • OK, Installation abgeschlossen. Problem, dass das Register nicht beschrieben wird ist leider immer noch da.

    Code
    pi@raspberrypi:~ $ python write.py
    [18]
    pi@raspberrypi:~ $

    "18" ist der voreingestellte Wert.

    Ansonsten erhalte ich über die Konsole keine Meldung. Gibt es ein Error-Log? Hab schon über

    Code
    pi@raspberrypi:~ $ mc


    danach gesucht aber nichts gefunden.

    Einmal editiert, zuletzt von Don_Hasso (9. November 2016 um 11:40)

  • Bitte zeig deinen Code. So kann man dazu nix sagen - ich bekomme auch mit

    Code
    print [18]

    deine Ausgabe...

  • Danke für Deine Geduld __deets__

    Hier der Code write.py:

    Python
    from pymodbus.client.sync import ModbusSerialClient
    client = ModbusSerialClient(method = "rtu", port="/dev/ttyUSB0", baudrate=9600, stopbits=1, bytesize=8, timeout=1)
    rq = client.write_register(1000,16,unit=1)
    rq = client.read_holding_registers(1000,1,unit=1)
    print(rq.registers)
  • du gibst *immer* noch nicht das rq des *write_registers* aus. Das war schon weiter oben meine Frage - was ist der Rueckgabewert des write_register-calls. Also bitte ausgeben, nach dem write. mach gleich mal ein print(dir(rq)) noch dazu, damit man mal sieht, was das Ding alles kann.

  • So richtig? :huh:

    Python
    from pymodbus.client.sync import ModbusSerialClient
    client = ModbusSerialClient(method = "rtu", port="/dev/ttyUSB0", baudrate=9600, stopbits=1, bytesize=8, timeout=1)
    rq = client.write_register(1000,16,unit=1)
    print(rq.register)
    rq = client.read_holding_registers(1000,1,unit=1)
    print(dir(rq))
    print(rq.registers)

    Kommt wieder Fehlermeldung (auch wenn ich print(rq.registers) bzw. print (rq.write_register) verwende:

    Code
    Traceback (most recent call last):
     File "write.py", line 4, in <module>
       print(rq.registers)
    AttributeError: 'ExceptionResponse' object has no attribute 'register'

    print(dir(rq):

    Code
    ['ExceptionOffset', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_rtu_frame_size', 'calculateRtuFrameSize', 'check', 'decode', 'encode', 'exception_code', 'function_code', 'original_code', 'protocol_id', 'should_respond', 'skip_encode', 'transaction_id', 'unit_id']
  • Ich habe nicht gesagt das du rq.register wiedergeben sollst. Sondern *NUR* rq. registers macht doch gar keinen Sinn, wenn du etwas *schreibst*. Darin stehen die Werte die du LIEST.
    Automatisch zusammengefügt:
    Und natürlich das dir(rq) bezogen auf den Rückgabewert vom WRITE. NICHT VOM READ. Das bringt doch gar nix. Du willst doch wissen, ob und warum ggf. dein SCHREIBEN fehlschlägt, dass du lesen kannst wissen wir ja schon eine Weile....

  • Aaahhh, jetzt glaube hab ich es gerafft:

    Python
    from pymodbus.client.sync import ModbusSerialClient
    client = ModbusSerialClient(method = "rtu", port="/dev/ttyUSB0", baudrate=9600, stopbits=1, bytesize=8, timeout=1)
    rq = client.write_register(1000,16,unit=1)
    print(rq)

    liefert:

    Code
    Exception Response(134, 6, IllegalFunction)
    • Offizieller Beitrag

    eigentlich meint er

    Python
    from pymodbus.client.sync import ModbusSerialClient
    client = ModbusSerialClient(method = "rtu", port="/dev/ttyUSB0", baudrate=9600, stopbits=1, bytesize=8, timeout=1)
    rq = client.write_register(1000,16,unit=1)
    print(dir(rq))

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • OK:

    Code
    ['ExceptionOffset', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_rtu_frame_size', 'calculateRtuFrameSize', 'check', 'decode', 'encode', 'exception_code', 'function_code', 'original_code', 'protocol_id', 'should_respond', 'skip_encode', 'transaction_id', 'unit_id']

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!