Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS: Abfrage von Modbus TCP via Homeserver

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS LBS: Abfrage von Modbus TCP via Homeserver

    Liebe Alle,

    der GIRA Homeserver (4.11) spricht leider kein Modbus TCP. Man kann sich nun schön die Finger brechen, und die Anfragen selbst via TCP binär fummeln und danach überlegen, wie man die Byte-Reihenfolge (Endianess) anpasst. Spaß macht das nicht.

    Ich hab wegen der ganzen PV-Wechselrichter und Wallboxen mal einen abstrakten Lese-Baustein (für Holding Register!) gehackt. Ist noch nicht fertig, aber wer freiwillig testen möchte .. Freue mich über euer Feedback!



    Man gibt die IP, Port und ggf. unit-ID des Modbus Servers an und danach für jedes Register in dezimaler Schreibweise. Unterstützte Datentypen:
    Typ Beschreibung
    int8 Signed Int - Fragt 1 Register ab -- DPT 6.x
    uint8 Unsigned Int - Fragt 1 Register ab -- DPT 5.x
    int16 Signed Int - Fragt 1 Register ab -- DPT 8.x
    uint16 Unsigned Int - Fragt 1 Register ab -- DPT 7.x
    int32 Signed Int - Fragt 2 Register ab -- DPT 13.x
    uint32 Unsigned Int - Fragt 2 Register ab -- DPT 12.x
    int64 Signed Int - Fragt 4 Register ab -- DPT 13.x
    uint64 Unsigned Int - Fragt 1 Register ab -- DPT 12.x
    float32 Float - Fragt 2 Register ab -- DPT 9.x oder 14.x, je nach Länge
    float64 Float - Fragt 4 Register ab -- DPT 14.x
    string ASCII - String-Länge angeben! -- 14byte Text
    Für String/Text muss die Lese-Länge der Register angegeben werden.
    Ausgabe ist für alle numerischen Typen über die numerischen Ausgänge. Die String/Text-Ausgänge erhalten auch die numerischen Werte als String. Wird ein String abgefragt, so ist dieser nur auf dem String-Ausgang.

    Der Baustein baut eine Verbindung via TCP auf und hält diese wenn möglich. Er fragt aber alle Werte einzeln ab, so dass zw. den Reads sich die anderen Werte auch wieder geändert haben können.

    Wer testen will: PM an mich. Entwickelt für den HS 4.11 (4.10 sollte auch gehen). Sollte der Baustein das Licht der Welt final erblicken, so bleibt dieser kostenlos / Frei. Keine Haftung. Weiterentwicklung wie ich es gedenke.

    Amazon Wish list: https://www.amazon.de/hz/wishlist/ls/22KJ1D22XROTQ
    Paypal Geschenke: paypal.me/SvenNDS

    #2
    Ich hab den Baustein noch etwas getestet und die Beta dann hier hochgeladen im Download-Bereich. Viel Spaß beim Testen.
    Die Baustein-Hilfe ist gepflegt.

    Bei Fehlern findet ihr auch im Debug-Modus eine Sektion, wo Fehler und co ausgegeben wird.

    Wenn der Baustein euch nützt: Freue mich über Spielkram und Pampers :-)

    Kommentar


      #3
      So ,

      auch wenn ich derzeit nicht wirklich Verwendung dafür habe wollte ich den Baustein dennoch testen , Modbus kommt mir "leider" immer öfter zwischen die Finger.

      Ich habe soeben erfolgreich einen SMA Wechseltrichter angebunden , (HS mit aktueller 4.11)
      Der Baustein funktioniert bisher perfekt !!
      Und erweitert den Gira HS endlich mit Modbus !!!!

      Kleiner Verbesserungsvorschlag nachdem es im Code normal nur eine "Kleinigkeit" ist wäre die Erweiterung um einen Faktor,
      lässt sich natürlich auch mit einer Multiplikation am Ausgang lösen aber wäre natürlich schicker im Baustein.

      Bin etwas überrascht das die Rückmeldung hier so gering ist , haben doch schon viele auf so einen Baustein gewartet, ich denke viele haben die Möglichkeiten von dem Baustein noch gar nicht registriert!

      Ich habe mich mit Pampers bei dir bedankt irgendwann wird der Baustein sicherlich produktiv bei mir eingesetzt.

      Modbus.PNG
      Zuletzt geändert von MrDuFF; 07.06.2021, 10:10.
      greetz Benni

      Kommentar


        #4
        Danke für's Testen und die Windeln. Ich dachte auch, dass das Feedback größer ausfällt. So kann man viele Wärmepumpen, Wallboxen, Wechselrichter usw. damit abfragen.

        Du müsst übrigens die Register-Anzahl nur beim String angeben. Ein uint32 hat beispielsweise immer 2 Register und das ist hinterlegt. Was bei non-String an Länge bei den Registern angegeben wird, wird ignoriert.

        Das mit den Multiplikatoren hatte ich mir auch schon überlegt. War/Bin aber hin und her gerissen, ob man nicht lieber einen reinen Baustein nur für eine Funktion macht und dafür dann klar abgegrenzt die Multiplikation, wie bei dir so gelöst, dahinter. Würde hier gern noch auf anderes Feedback warten.

        Mal sehen, vielleicht mache ich auch noch einen schreibenden Baustein. Ob frei oder kommerziell überlege ich mir aber noch.

        Kommentar


          #5
          Hallo Sven,

          auf so ein Modul habe ich schon lange gewartet, danke dafür.
          Ich habe mal auf die Schnelle ein paar Register meiner Wärmepumpe abgefragt, funktioniert sehr gut.
          Wenn man die Register auch schreiben könnte, wäre das der Hammer, dann könnte ich meine Wärmpumpe und die Lüftungsanlage auch steuern.

          Das Schreiben von einem Register würde mir in dieser Form erstmal völlig reichen
          int16 Signed Int - Fragt 1 Register ab -- DPT 8.x
          uint16 Unsigned Int - Fragt 1 Register ab -- DPT 7.x
          Ich bin gern Beta-Tester und bedanke mich mit einer Spende.

          Screenshot 2021-06-08 172223.pngScreenshot 2021-06-08 175042.png

          Kommentar


            #6
            Hallo Sven,

            Habe dir so eben Pampers gesichert.

            Einfach ein genialer Baustein auf den ich schon lange gewartet habe, besonders jetzt gerade nachdem mein Wiregate Server das Zeitige segnet hat.

            Ich hätte ihn schon früher getestet aber das Gateway hatte Lieferzeit.

            Ich werde die nächsten Tage weitere Test mit verschiedenen Geräten machen.

            Kommentar


              #7
              Du musst die Werte ja auch an der Dezimalstelle verschieben. Hat das ein Grund, wieso du die 10 mittels Eingangsbox (7/0/15) dir holst?

              Ich hab mich mal an das Schreiben gesetzt. Weiterhin - wie hier - nur Modbus Holding Register. Denke diese finden in der Haustechnik auch am meisten Anwendung. Das hier wäre mein Aufschlag:

              Greenshot 2021-06-08 22.14.05.png

              Geht das in die Richtung die helfen würde?
              Hab die Implementierung sogar quasi fertig, aber muss diese die Tage testen und die Doku glatt ziehen und nochmal aufräumen. Testing bräuchte ich aber defintiv Hilfe. Ich hab nur ein Gerät welches 3 Register schreibbar hat und diese bringen mich nicht weiter. Meine Wallbox und das Auto dazu kommen erst noch, dann wäre ein Test schon jetzt möglich. Melde mich wenn fertig für Alpha-Tests.

              Kommentar


                #8
                Hi Sven,

                sieht gut aus. Ich teste das gern mal an meiner Wärmepumpe. Eine zusätzlich Implementierung des Funktionsode 16 (Preset Multiple Registers) als nächster Schritt wäre noch super. Für einige Register sind z.Bsp. Adminrechte notwendig. Das sieht dann bei mir so aus.

                image_113682.jpg

                Mir ist nur noch nicht ganz klar, wie ich das Register beschreiben muss. In meinem Fall ist das PW für Adminrechte 6699 Dezimal.
                Leider hatte ich aber noch keinen Erfolg. ModbusClient meldet immer "Illegal Data Value"
                Hast du evtl. eine Idee wie das Register richtig beschrieben werden muss?

                image_113683.jpg

                PS:

                Zitat
                "Du musst die Werte ja auch an der Dezimalstelle verschieben. Hat das ein Grund, wieso du die 10 mittels Eingangsbox (7/0/15) dir holst?"

                Wusste ich nicht, bin blutiger Anfänger, danke für den Tipp !
                Zuletzt geändert von zomteck; 09.06.2021, 17:41.

                Kommentar


                  #9
                  Wenn ich es richtig sehe wird das in den Baustein zu integrieren komplex.
                  Die Darstellung des Strings mittels Hi/Lo Doppelbyte ist in meinen Augen das normale Vorgehen bei Modbus und kann mein Schreib-Modul. Aber: Die Schnittstelle erwartet, dass alle nicht benötigten String / Modbus-Register auf 0 gesetzt werden. Binär 0 ist ASCII NUL-Zeichen. Das kriegt man also nicht im Logik-Editor eingebaut.

                  Einzige Lösung wäre, dass man es als byte-abfolge RAW in die Register schreibt. Mal sehen ob das geht.

                  Wie aber behält die Wärmepumpe den State "authenticated" bei? So gibt es ja keinen Zustand, so dass wenn du dich anmeldest ja jeder Zugriff dann auf die Admin-Funktionen via Netzwerk erhält. Oder beschränkt er das auf die Quell-IP? (Theoretisches Problem weil LAN und ggf. eigenes vLAN)

                  Zu deiner Frage wie man sich dort Authentifiziert:
                  Ich würde 6699 von ASCII in Binär umformen und dann alles weitere mit 0 auffüllen:
                  Code:
                  36 36 39 39 00 00 00 00 00 00 00 00 00 00 00 00
                  Try it out. Ich fokussiere mich erstmal auf rudimentäres Schreiben.

                  Kommentar


                    #10
                    Ich denke auch das rudimentäres Schreiben von einem Register völlig ausreicht. Der Anwendungsfall für die multiplen Register ist sicher gering.
                    Mir ist auch nicht ganz klar, wie die Wärmepumpe den State handhabt, also schieben wir das mal in die Ecke "nice to have"
                    Ich freue mich schon auf die Alpha-Tests

                    Kommentar


                      #11
                      Hat jemand den Bauspein schon mit einem Modbus/IP zu Modbus/RS485-Konverter ausprobiert? Z.B. dem USR-W610?


                      Kommentar


                        #12
                        Danke Florian für die Pampers und für eine große Paypal-Spende. Einmal Pampers ist scheinbar auf dem Weg verloren gegangen :-)

                        Write-LBS kann nun auch getestet werden, freiwillige Tester bitte eine PM.

                        Zitat von hypnotoad Beitrag anzeigen
                        Hat jemand den Bauspein schon mit einem Modbus/IP zu Modbus/RS485-Konverter ausprobiert? Z.B. dem USR-W610?
                        Sollte theoretisch klappen, wenn das Ding schon alles immer pollt und dann via ModbusTCP zur Verfügung stellt - so verstehe ich die Kiste.
                        Aber ich hab was cooleres im Kopf: Weiß jemand, ob der Zugriff auf die USB-Geräte aus Logikbausteinen klappt?

                        Ich hab mir einen Modbus-USB Serial Converter für 4€ gekauft und angeschlossen. Wird auch erkannt:
                        Greenshot 2021-06-13 22.42.45.png
                        Leider sehe ich den Unix-Devicenamen nicht, vermute aber es ist /dev/ttyUSB0.

                        Hab meinen Logikbaustein (Version noch nicht hier im Download-Bereich!) erweitert. Als Adresse kann man nun angeben: "serial:rtu:9600:/dev/ttyUSB0". Danach funktioniert Modbus RTU theoretisch ebenso. Auch Modbus ASCII oder Binär sollte gehen. Nachteil: Ich kann es aber mangels Modbus-RTU gerät nicht testen. Ich kriege eine ConnectionException, was theoretisch an fehlener Kommunikation mit dem USB-Stick oder am fehlenden Pair liegen könnte.

                        Wenn wer ein RTU-Gerät hat und mir helfen möchte es herauszufinden ob es klappt: Einfach melden. Dann gibts diese Alpha-Version zum testen. Ansonsten packe ich es in die Ablage bis ich ein RTU-Gerät mal haben sollte. (Will es aber vermeiden)
                        Angehängte Dateien

                        Kommentar


                          #13
                          Ich denke, sobald es um USB-Zugriff geht, ist man sehr stark Gira ausgeliefert. Wahrscheinlich müsstest Du nur noch mknode ausführen, und dazu benötigst Du root-Rechte. Wenn die nodes automatisch erstellt werden, dann müsstest Du Zugriff auf diese haben, etc. Letztlich ist es vielleicht gar nicht so dumm, wenn der HS nur Zugriff auf Netzwerkgeräte hat (Schutz vor Überspannung / falscher elektrischer Anschluss oder Zerstörung durch kaputte USB-Geräte). Deswegen würde ich so einen TCP/Modbus-Konverter einsetzen.

                          Kommentar

                          Lädt...
                          X