Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung von Modbus TCP

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

    Erstaunlich - Endian entfällt bei solchen kleinen Abweichungen als Fehlerursache. Da liegt vermutlich irgendwo ein Konvertierungs- oder Rundungsfehler vor, der nur die Nachkommastellen betrifft. Nach diesem Umrechner sind die in Simply Modbus angezeigten Hex-Werte vom Bus korrekt umgerechnet.

    Hier scheint die betreffende Stelle im Plugin zu sein - mit decode_xxbit_float hab ich allerdings noch nicht gearbeitet, da meine eigenen Modbus-Plugins die Floats anders berechnen. Daher kann ich da leider nicht wirklich weiterhelfen.

    /tom

    p.s. ivande [schlaumeiermodus] Die Vergangenheitsform von 'read' ist übrigens 'read' (ausgesprochen wie 'red') nicht 'readed' - siehe Logausgaben. [/schlaumeiermodus]

    p.p.s. Ist denn gesichert, dass die Werte auch wirklich zum gleichen Zeitpunkt ausgelesen werden? Nicht, dass die Unterschiede einfach nur aufgrund von Zeitversatz in den Lesevorgängen entstehen.
    Zuletzt geändert von Tom Bombadil; 01.03.2023, 22:56.

    Kommentar


      Vielen Dank Tom Bombadil für deine Antwort.

      Wenn ich das Plugin richtig verstehe, frägt es die Register der einzelnen Items doch nacheinander ab und speichert den zurückgelieferten Wert am Item. Korrekt?
      Wenn dem so ist, kann ich mir nicht vorstellen, dass mit dem "decoding" zu tun hat, weil ja dann der Einzelwert an sich falsch sein müsste.

      Diese sind jedoch definitiv vertauscht.

      Ein Timing-Problem kann ich deshalb auch ausschließen.
      Ich geh nochmals zu Klarstellung auf das gepostet Beispiel ein.
      Register Item Werte modbus_tcp Werte Simply Modbus
      72 Import (importierte kWh) 141.15728 338.518005
      74 Export (exportierte kWh) 338.50698 230.188995
      52 TotalPower (momentane Leistung in W) 230.18400 nicht abgefragt
      Wie gesagt wurden die die "Simply Modus" Werte kurz nach den "modbus_tcp" Werten abgefragt, weil dies ja manuell erfolgt ist.
      Da es sich ja um den Zähler eines Speichers handelt, ist ja logisch, dass dort mehr Energie importiert als exportiert wurde, sprich die Werte von "Simply Modus" sind tendenziell richtig (auch wenn man am Zähler selbst schaut).

      Die 141.15728 bei " modbus_tcp Import" entsprechen eigentlich der momentanen Leistung, sprich zu diesem Zeitpunkt flossen rund 141 Watt in Richtung Speicher. Dies ist auch logisch, da der Akku voll war und nur noch noch minimal geladen wurde. Ein negatives Vorzeichen würde bedeuten, dass der Akku entladen wird.

      Für mich sieht es folglich nach wie vor so aus, dass modbus_tcp aus irgendwelchen Gründen die Werte vertauscht. Wenn jetzt alle Register nah beeinander liegen würden, wär das noch irgendwie besser nachvollziehbar. Aber dadurch, dass das Register für "TotalPower" doch weit von den anderen beiden entfernt liegt, hab ich keine Idee, an was das liegen könnte...

      Kommentar


        da scheint in der tat etwas durcheinander zu geraten, komisch allerdings dass es zeitweise dann alles passt. Ist das sicher, dass zeitweise die angezeigten Werte passen??

        Ich muss erst mal die gut gesammelten Infos studieren, vielleicht können wir mit einen zusätzlichen Log-Eintrag im Plugin die empfangenen Bytes anzeigen lassen um den Problem auf die Schliche zu kommen.

        Gruß ivan

        Kommentar


          Danke ivande für deine schnelle Antwort.

          Ja, da bin ich mir sicher. Da es gerade passt, machen wir ein ganz aktuelles Beispiel:​

          image.png Werte sind wieder vertauscht. Der Wert bei Import (Address 72) entspricht eigentlich dem von TotalPower (Address 52). Der Akku wird gerade mit ca. 3,3 kW geladen.

          Ich habe daraufhin SmarthomeNG neu gestartet, da die Werte nach einem Restart dann plötzlich wieder passen:

          image.png
          Diese Werte sind jetzt wieder plausibel. Zu diesem Zeitpunkt wird jetzt noch mit 1,6 kW geladen. Meine Frau hatte gerade die Waschmaschine eingeschaltet ;-)

          Ich werd vll. mal parallel noch versuchen, ein Script zu schreiben, welches ebenfalls via pymodbus die Werte periodisch holt. Eventuell liegt es ja an dem Modul selbst...
          Angehängte Dateien

          Kommentar


            du könntest im plugin __init__.py die Zeile 456 ändern, damit im log auch die Registerwerte in Hex angezeigt werden:

            Code:
            self.logger.debug("read {0}.{1}.{2} (address.slaveUnit) regCount:{3} registers:{4}".format(objectType, address, slaveUnit, registerCount, ' '.join(str(hex(e)) for e in result.registers)))

            Kommentar


              fuppy: Ok, jetzt hab sogar ich es verstanden. Ignoriere meine Kommentare von oben einfach, ich hatte die Anfrage falsch interpretiert.

              /tom

              Kommentar


                Zitat von ivande Beitrag anzeigen
                du könntest im plugin __init__.py die Zeile 456 ändern, damit im log auch die Registerwerte in Hex angezeigt werden:

                Code:
                self.logger.debug("read {0}.{1}.{2} (address.slaveUnit) regCount:{3} registers:{4}".format(objectType, address, slaveUnit, registerCount, ' '.join(str(hex(e)) for e in result.registers)))
                Hab ich hinzugefügt.

                Soll ich später dann wenn der Fehler wieder aufgetreten ist die Log-Einträge posten? Aktuell funktioniert noch alles...

                Kommentar


                  Zitat von fuppy Beitrag anzeigen
                  die Log-Einträge posten?
                  👍

                  ich vermute die Daten werden irgendwie schon falsch ankommen, sonst kann ich mir das nicht erklären, dass es eine Zeit funzt und dann wieder nicht,..

                  Kommentar


                    Zitat von ivande Beitrag anzeigen
                    👍

                    ich vermute die Daten werden irgendwie schon falsch ankommen, sonst kann ich mir das nicht erklären, dass es eine Zeit funzt und dann wieder nicht,..
                    So ich hab nun ein paar Log-Einträge:


                    Hier ist noch alles in Ordnung.
                    Code:
                    2023-03-02  17:02:52 INFO     plugins.modbus_tcp  connected to ModbusTcpClient(192.168.0.181:502)
                    2023-03-02  17:02:52 DEBUG    plugins.modbus_tcp  read InputRegister.72.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:02:52 DEBUG    plugins.modbus_tcp  read InputRegister.72.1 (address.slaveUnit) regCount:2 registers:0x43b2 0x1eb8
                    2023-03-02  17:02:52 DEBUG    plugins.modbus_tcp  value readed: 356.239990234375 type: <class 'float'>
                    2023-03-02  17:02:52 DEBUG    plugins.modbus_tcp  read InputRegister.74.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  read InputRegister.74.1 (address.slaveUnit) regCount:2 registers:0x4372 0x9d71
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  value readed: 242.61500549316406 type: <class 'float'>
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  read InputRegister.52.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  read InputRegister.52.1 (address.slaveUnit) regCount:2 registers:0x429e 0x22dd
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  value readed: 79.0680923461914 type: <class 'float'>
                    2023-03-02  17:02:53 DEBUG    plugins.modbus_tcp  poll_device: 3 register readed requed-time: 0:00:00.183023

                    Hier fängt der Fehler dann an...
                    Code:
                    2023-03-02  17:03:23 INFO     plugins.modbus_tcp  connected to ModbusTcpClient(192.168.0.181:502)
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.72.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.72.1 (address.slaveUnit) regCount:2 registers:0x4366 0xd9ad 0x4366 0x77eb 0x4365 0x3039 0x3ea9 0xff13 0x3f13 0xf2a 0x3ed2 0x516d 0xc1a8 0xf932 0x42ad 0x2e07 0x4280 0x94aa 0x41f4 0x9dea 0x42b7 0x20f9 0x4286 0x36e 0xc1b0 0xe074 0xc1ee 0x2825 0xc197 0x14c0 0xbf30 0xd627 0x3f72 0x1791 0x3f75 0x9f48 0x0 0x0 0x0 0x0 0x0 0x0 0x4366 0x2b45 0x0 0x0 0x3ee0 0xcf9c 0x3fa8 0x9bb5 0x0 0x0 0x4301 0xc232 0x0 0x0 0x4313 0xccd5 0x0 0x0 0xc28d 0x8756
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  value readed: 230.8502960205078 type: <class 'float'>
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.74.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.74.1 (address.slaveUnit) regCount:2 registers:0x43b2 0x1ed9
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  value readed: 356.2409973144531 type: <class 'float'>
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.52.1 (address.slaveUnit) regCount:2
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  read InputRegister.52.1 (address.slaveUnit) regCount:2 registers:0x4372 0x9d71
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  value readed: 242.61500549316406 type: <class 'float'>
                    2023-03-02  17:03:23 DEBUG    plugins.modbus_tcp  poll_device: 3 register readed requed-time: 0:00:00.207385

                    Hier dann das folgende Update, bei dem die Werte schon nicht mehr stimmen...
                    Code:
                    2023-03-02 17:03:54 INFO plugins.modbus_tcp connected to ModbusTcpClient(192.168.0.181:502)
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.72.1 (address.slaveUnit) regCount:2
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.72.1 (address.slaveUnit) regCount:2 registers:0x42e6 0x6a96
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp value readed: 115.20817565917969 type: <class 'float'>
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.74.1 (address.slaveUnit) regCount:2
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.74.1 (address.slaveUnit) regCount:2 registers:0x43b2 0x1f1b
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp value readed: 356.2430114746094 type: <class 'float'>
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.52.1 (address.slaveUnit) regCount:2
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp read InputRegister.52.1 (address.slaveUnit) regCount:2 registers:0x4372 0x9db2
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp value readed: 242.61599731445312 type: <class 'float'>
                    2023-03-02 17:03:54 DEBUG plugins.modbus_tcp poll_device: 3 register readed requed-time: 0:00:00.100420​
                    Bei Abfrage per Simply Modbus passen die Werte nach wie vor...

                    Kommentar


                      obwohl hier nur zwei 16bit Werte gelesen werden sollten kommen 62 Werte an? Nach diesem seltsamen read stimmen die Werte nicht mehr. Welche Version von pymodbus ist bei dir installiert?

                      Zitat von fuppy Beitrag anzeigen
                      Code:
                      2023-03-02 17:03:23 DEBUG plugins.modbus_tcp read InputRegister.72.1 (address.slaveUnit) regCount:2 registers:0x4366 0xd9ad 0x4366 0x77eb 0x4365 0x3039 0x3ea9 0xff13 0x3f13 0xf2a 0x3ed2 0x516d 0xc1a8 0xf932 0x42ad 0x2e07 0x4280 0x94aa 0x41f4 0x9dea 0x42b7 0x20f9 0x4286 0x36e 0xc1b0 0xe074 0xc1ee 0x2825 0xc197 0x14c0 0xbf30 0xd627 0x3f72 0x1791 0x3f75 0x9f48 0x0 0x0 0x0 0x0 0x0 0x0 0x4366 0x2b45 0x0 0x0 0x3ee0 0xcf9c 0x3fa8 0x9bb5 0x0 0x0 0x4301 0xc232 0x0 0x0 0x4313 0xccd5 0x0 0x0 0xc28d 0x8756
                      Du könntest versuchen in __init__.py in Zeile 447 den read abzubrechen, wenn die Anzahl der gelesenen Register falsch ist. Da der Fehler bei darauffolgenden reads dann aufrecht bleibt, denke ich, dass dies noch nicht zu einer verbesserung führt?

                      Code:
                              if (len(result.registers) != registerCount):
                                  self.logger.error("count of read registers is incorrect regCount:{0} len(result.registers):{1}".format(registerCount, len(result.registers)))
                                  return None
                      Zuletzt geändert von ivande; 02.03.2023, 23:54.

                      Kommentar


                        Zitat von ivande Beitrag anzeigen
                        obwohl hier nur zwei 16bit Werte gelesen werden sollten kommen 62 Werte an? Nach diesem seltsamen read stimmen die Werte nicht mehr. Welche Version von pymodbus ist bei dir installiert?
                        Version 3.1.3

                        Ich kann mir das auch nicht erklären. OK, es können schon mal falsche Werte gelesen werden, aber wieso bleibt dass dann konstant falsch?
                        Das geht mir auch nicht ein…

                        Kommentar


                          Moin

                          Jetzt werfe ich doch mal nen Firmwarefehler des Wechselrichters in die Runde.
                          Mal beim Hersteller anfragen?

                          Kommentar


                            Zitat von ivande Beitrag anzeigen
                            Du könntest versuchen in __init__.py in Zeile 447 den read abzubrechen, wenn die Anzahl der gelesenen Register falsch ist. Da der Fehler bei darauffolgenden reads dann aufrecht bleibt, denke ich, dass dies noch nicht zu einer verbesserung führt?

                            Code:
                            if (len(result.registers) != registerCount):
                            self.logger.error("count of read registers is incorrect regCount:{0} len(result.registers):{1}".format(registerCount, len(result.registers)))
                            return None
                            Kann ich gerne machen! Werde berichten, sobald ich Ergebnisse hab.

                            Kommentar


                              Zitat von Sipple Beitrag anzeigen
                              Moin

                              Jetzt werfe ich doch mal nen Firmwarefehler des Wechselrichters in die Runde.
                              Mal beim Hersteller anfragen?
                              Ich lese keinen Wechselrichter aus, sondern ein Smartmeter, um genau zu sein ein EASTRON SDM72D-M. Bin mir jetzt nicht sicher ob V1 oder V2.

                              Ich schließe ein direktes Problem damit erstmal aus, da die Abfrage via Simply Modbus richtige Werte liefert…

                              Kommentar


                                Ist ja erstmal egal, welches Gerät das ist. Wenn Simply Modbus wirklich 100%ig sicher immer die richtigen Werte liefert, dann hast du natürlich recht, dann kann es das Gerät nicht sein.

                                Kommentar

                                Lädt...
                                X