Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

    Zitat von fuppy Beitrag anzeigen
    Ich halte euch auf dem Laufenden!
    fuppy Wie sieht's denn mittlerweile aus...?


    Kommentar


      Sorry bmx dass ich mich nicht mehr gemeldet hab.

      Ich bin den Weg des geringsten Widerstands gegangen und bin auf Node-RED umgestiegen. Ich hatte seitdem einmal das Problem, dass der Zähler gar keine Werte mehr lieferte. Nach einem "Reset" des Zählers und der Anpassung der Cycle-Time sowie der Anzahl der ausgelesenen Register ist seitdem Ruhe.

      Ich vermute mal, dass das Problem mit dem Plugin auch irgendwas damit zu tun hatte...

      Sorry, dass ich nicht mehr hierzu beitragen kann...

      Kommentar


        Hallo zusammen,
        irgendwie stehe ich auf dem Schlauch. Ich habe zwei Wechselrichter, die ich beide per Modbus TCP anfragen möchte. Aber woher weiss eigentlich die item YAML, welche modbus_tcp sie ansprechen soll?

        Anbei meine plugin.yaml
        Code:
        ...
        modbus_wr2_fast:
            plugin_name: modbus_tcp
            host: 192.168.122.231
            port: '502'
            webif_pagelength: 100
            instance: modbus_wr2_fast
            cycle: 30
            slaveUnit: 1
        
        modbus_wr1_fast:
            plugin_name: modbus_tcp
            host: 192.168.122.230
            port: '502'
            webif_pagelength: 100
            instance: modbus_wr1_fast
            cycle: 30
            slaveUnit: 1
        Und meine item.yaml im Verzeichnis items
        Code:
        %YAML 1.1
        ---
        R03:
            WR2:
                DC_CURRENT:
                    type: num
                    name: DC_CURRENT
                    modBusObjectType: HoldingRegister
                    modBusDirection: read
                    modBusAddress: 40273
                    modBusDataType: int16 
                    modBusDirection: read
                    modBusFactor: 0.0001
        Im Webinterface sagt er, dass die Verbindung connected ist, aber ich sehe keine Items. Mir ist auch gerade nicht klar, wie sie den Weg zur richtigen Plugin-Instanz finden.
        Gebt mir doch mal nen Tipp, was ich hier übersehe.

        Danke euch!

        Kommentar


          Du musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
          Code:
          instance: modbus_wr2_fast
          Aus meinem Verständnis müsste da also stehen:

          Code:
          %YAML 1.1
          ---
          R03:
              WR2:
                  DC_CURRENT:
                      type: num
                      name: DC_CURRENT
                      modBusObjectType@modbus_wr2_fast: HoldingRegister
                      modBusDirection@modbus_wr2_fast: read
                      modBusAddress@modbus_wr2_fast: 40273
                      modBusDataType@modbus_wr2_fast: int16
                      modBusDirection@modbus_wr2_fast: read
                      modBusFactor@modbus_wr2_fast: 0.0001
          Schreib mal ob es klappt. Alternativ kannst Du Dir auch ein struct bauen für Deinen WR und dann ein instance: modbus_wr2_fast

          Kommentar


            Zitat von bmx Beitrag anzeigen
            Du musst den Attributen jeweils die Instanz mitgeben wie hier beschrieben ist.
            Code:
            instance: modbus_wr2_fast
            Aus meinem Verständnis müsste da also stehen:

            Code:
            %YAML 1.1
            ---
            R03:
            WR2:
            DC_CURRENT:
            type: num
            name: DC_CURRENT
            modBusObjectType@modbus_wr2_fast: HoldingRegister
            modBusDirection@modbus_wr2_fast: read
            modBusAddress@modbus_wr2_fast: 40273
            modBusDataType@modbus_wr2_fast: int16
            modBusDirection@modbus_wr2_fast: read
            modBusFactor@modbus_wr2_fast: 0.0001
            Bestätigung ... So klappt's bei mir mit mehreren Modbus Instanzen ...

            Kommentar


              Alles klar. danke für die schnelle Hilfe. Nun geht bei mir auch. Klasse!

              Kommentar


                Hi,

                für das Modbus Write ab Zeile 403 fehlt die Unterscheidung von unit/slave in Abhängigkeit der pymodbus Version.

                Code:
                    if objectType == 'Coil':
                        result = self._Mclient.write_coil(address, value, unit=slaveUnit)
                    elif objectType == 'HoldingRegister':
                        registers = builder.to_registers()
                        result = self._Mclient.write_registers(address, registers, unit=slaveUnit)
                -->

                Code:
                        if objectType == 'Coil':
                            if pymodbus_baseversion > 2:
                                result = self._Mclient.write_coil(address, value, slave=slaveUnit)
                            else:
                                result = self._Mclient.write_coil(address, value, unit=slaveUnit)
                        elif objectType == 'HoldingRegister':
                            registers = builder.to_registers()
                            if pymodbus_baseversion > 2:
                                result = self._Mclient.write_registers(address, registers, slave=slaveUnit)
                            else:
                                result = self._Mclient.write_registers(address, registers, unit=slaveUnit)​
                Generell:
                Wäre es sinnvoll auf Plugins wie kostalmodbus und KSEMmodbus zu verzichten (weil z.B. nicht Multi-Instance-fähig, kein Modbus Write definiert) und stattdessen für dieses generische Modbus Plugin Item Stucts zu definieren?
                Ich benötige sowohl Multi-Instance als auch Modbus Write für das kostalmodbus Plugin. Dann würde ich mal versuchen die Item Structs für Kostal Plenticore, KSEM und zwei Energiezähler mit Modbus anzulegen.




                Kommentar


                  Zitat von knx75knx Beitrag anzeigen

                  In der Log Datei finde ich dennoch eine Meldung:

                  Code:
                  WARNING lib.item.item Item Photovoltaik.Speicher_Status.Text: problem evaluating 'sh.Photovoltaik.Speicher_Status.Text.lookup()[value]': ''


                  Hallo Andre (@knx75knx​),

                  ja, beim Initialisieren hat der value keinen bekannten Wert, daher kann der aus dem Dict auch nicht ausgelesen werden. Ich habe das leicht anders geschrieben:

                  Code:
                          Speicher_Status:
                              type: num
                              name: S_Status
                              modBusAddress@se_inverter: 59782
                              modBusDataType@se_inverter: uint32
                              Text:
                                  type: str
                                  eval_trigger: ..
                                  eval: sh..lookup().get(value,'None')
                                  lookup:
                                      type: dict
                                      initial_value: "{ None: 'None', 0: 'Aus', 1: 'Standby', 2: 'Init', 3: 'Laden', 4: 'Entladen', 5: 'Fehler', 6: 'Leerlauf', 7: 'sieben', 8: 'acht', 9: 'neun', 10: 'Energiesparmodus'}"
                  Zuletzt geändert von bmx; 03.12.2023, 20:05.

                  Kommentar


                    Zitat von beckerth Beitrag anzeigen
                    für das Modbus Write ab Zeile 403 fehlt die Unterscheidung von unit/slave in Abhängigkeit der pymodbus Version.
                    Ich würde den Support der alten Pymodbus-Version entfernen. Ohnehin schleppt man dann immer mehr Ballast mit rum. Da es auch innerhalb der 3er Version zum Teil Änderungen gab, die Probleme verursachten und man nicht jede Evntualität abfragen kann. Ich habe meine requirements auf 3.5.2 umgestellt. Darunter geht nichts mehr.

                    Zitat von beckerth Beitrag anzeigen
                    Wäre es sinnvoll auf Plugins wie kostalmodbus und KSEMmodbus zu verzichten (weil z.B. nicht Multi-Instance-fähig, kein Modbus Write definiert) und stattdessen für dieses generische Modbus Plugin Item Stucts zu definieren?
                    Wäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?

                    Kommentar


                      Zitat von Cannon Beitrag anzeigen
                      Wäre es nicht sinnvoll die Plugins entsprechend zu erweitern, anstatt da "lose" einzelne Items für zu haben?
                      Da bin komplett gegenteiliger Meinung.

                      Ich bin ernsthaft am Überlegen, 'meine' Plugins für Helios und Trovis durch das generische ModbusTCP-Plugin abzulösen. Bisher war das wegen RTU nicht möglich; durch die neuen Adapter mit integriertem TCP/RTU Gateway ist das aber nun kein Problem mehr. Ist bei mir seit über einem Jahr stabil und fehlerfrei im Einsatz.

                      Lieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt - und sich bei jeder woanders reindenken und rumwurschteln muss. Und privat gewinne ich mehr Freizeit - muss keine Plugins mehr pflegen.

                      /tom
                      Zuletzt geändert von Tom Bombadil; 05.12.2023, 00:47.

                      Kommentar


                        Zitat von Tom Bombadil Beitrag anzeigen
                        Lieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt
                        Naja, wenn man sich das wie bei einem KNX-Plugin vorstellt, ist das nachvollziehbar. Allerdings wäre es dann wirklich schön, wenn es entsprechende Vorlagen gesammelt gibt. Also z.B. structs für die einzelnen Modbus-Geräte.

                        Zitat von Tom Bombadil Beitrag anzeigen
                        Und privat gewinne ich mehr Freizeit - muss keine Plugins mehr pflegen.
                        Naja ganz so ist das ja nicht. Die Vorlagen sollten dann auch aktuell gehalten werden. Aber zumindest muss man sich nicht mehr auf ständige Modbus-Änderungen einlassen. Wobei ich hoffe, dass das Thema jetzt auch durch ist.

                        Kommentar


                          Ich verwende das Plugin für die Abfrage der Register meines Wechselrichters Fronius Gen24. Das Lesen der Register funktioniert einwandfrei.

                          HTML-Code:
                          fronius:
                              plugin_name: modbus_tcp
                              host: 192.168.10.211
                              port: 502
                              cycle: 30
                              plugin_enabled: true
                          Auszug aus meiner yaml:

                          HTML-Code:
                          PV_GEN_24:
                              I_ges:                             # [A] AC Current
                                  type: num
                                  value: '0'
                                  modBusAddress: 40071
                                  modBusUnit: '1'
                                  modBusDataType: float32
                              StorCtl_Mod:                       # [StorCtl_Mod] Activate hold/discharge/charge storage control mode. Bitfield value. (bit 0: CHARGE, bit 1: DiSCHARGE)
                                  type: num
                                  modBusAddress: 40358           # 40359 bitfield16
                                  modBusUnit: '1'
                                  modBusDataType: 'uint16'       # bitfield16 (0 bis 0x7FFF)
                                  modBusDirection: 'read_write'
                                  visu_acl: rw
                          Nun wollte ich das Register PV_GEN_24.StorCtl_Mod schreiben. Trage ich den Wert 3 ein, wird nach kurzer Zeit der Wert 0 wieder angezeigt.

                          In der Konfiguration des Fronius Gen24 habe ich die Option "Wechselrichter-Steuerung über Modbus" aktiviert.

                          Fronius_Modbus.jpg

                          Warum kann ich so keine Werte in den Fronius Gen24 schreiben ? Habe ich etwas übersehen ?

                          In der Log-Datei finde ich keine Fehlermeldungen (Warnings).

                          Gruss Matthias

                          Kommentar


                            Zitat von manhartm Beitrag anzeigen
                            Warum kann ich so keine Werte in den Fronius Gen24 schreiben ? Habe ich etwas übersehen ?
                            Nur ein Gedanke dazu, der gleichzeitig eine Frage/Bitte darstellt:

                            Es gibt Geräte (z.B. meine Samson Trovis), bei denen Schreibvorgänge erst 'erlaubt' werden müssen. Bei der Trovis muss z.B. erst die Geräte-Pin in ein bestimmtes Register geschrieben werden, um das Schreiben für die nächsten 30 Minuten freizugeben. Die 'sichere Bank' wäre also, vor jedem Schreibvorgang zuerst die Geräte-Pin in ein bestimmtes Register zu schreiben.

                            Ich bin mir nicht sicher, ob sich solch ein Vorgehen bereits im generischen Modbus-Plugin abbilden lässt - möglicherweise ist Dein Problem ähnlich gelagert. Und vielleicht kann der Entwickler oder einer der aktiven Nutzer des Plugins da Licht in's Dunkel bringen.

                            /tom

                            Kommentar


                              Zitat von Tom Bombadil Beitrag anzeigen
                              Lieber eine Bibliothek mit items-Dateien für ein allgemeingültiges ModbusTCP-Plugin, als 20 verschiedene Modbus-Implementierungen, denen man ständig hinterherhechelt - und sich bei jeder woanders reindenken und rumwurschteln muss
                              So würde ich das auch sehen. Lieber ein Plugin was alles abdeckt und ein paar structs oder item.yaml mitbringt in einzelnen Dateien als jeden Code in zig Variationen aufgequirlt.



                              Kommentar


                                Zitat von manhartm Beitrag anzeigen
                                Ich verwende das Plugin für die Abfrage der Register meines Wechselrichters Fronius Gen24. Das Lesen der Register funktioniert einwandfrei.

                                Nun wollte ich das Register PV_GEN_24.StorCtl_Mod schreiben. Trage ich den Wert 3 ein, wird nach kurzer Zeit der Wert 0 wieder angezeigt.
                                Ich habe für das Plugin modbus_tcp das Logging auf DEBUG umgeschaltet und in einem kleinen Test-Plugin das Item PV_GEN_24.StorCtl_Mod gelesen und geschrieben.

                                In der Logdatei finde ich zu diesem Item folgende Einträge:

                                HTML-Code:
                                2023-12-08  12:03:02 DEBUG    plugins.modbus_tcp  parse item: PV_GEN_24.StorCtl_Mod
                                2023-12-08  12:03:02 INFO     plugins.modbus_tcp  parse item: PV_GEN_24.StorCtl_Mod Attributes {'regAddr': 40358, 'slaveUnit': 1, 'dataType': 'uint16', 'factor': 1, 'byteOrder': '>', 'wordOrder': '>', 'item': Item: PV_GEN_24.StorCtl_Mod, 'value': 0, 'objectType': 'HoldingRegister', 'dataDir': 'read_write'}
                                ...
                                2023-12-08  12:03:21 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
                                ...
                                2023-12-08  12:03:56 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
                                ...
                                2023-12-08  12:04:26 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
                                ...
                                2023-12-08  12:04:50 DEBUG    plugins.modbus_tcp  read HoldingRegister.40358.1 (address.slaveUnit) regCount:1 result:ReadHoldingRegistersResponse (1)
                                ...
                                Ich finde keine Schreibzugriffe auf das Item im Log. Ich würde erwarten, dass im Plugin die Routine "__write_Registers" aufgerufen wird und ich einen entsprechenden Eintrag "write ..." in der Log-Datei finden würde.

                                Kommentar

                                Lädt...
                                X