Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS: 19001030: Modbus TCP Master Read

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

    Hi,
    ich stelle die Frage auch mal hier:

    Wenn ich mittels des SMA Modbus LBS zyklisch die PV Leistung über Modbus TCP abfrage, dann könnte also die entsprechende Antwort über Modbus TCP auch von anderen Slaves am Modbus, im speziellen einer Wärmepumpe, gelesen und verarbeitet werden, oder habe ich bzgl der Modbus Architektur was falsch verstanden?

    Kommentar


      Hallo zusammen,
      ich möchte auch gerne den Modbus TCP Master Read nutzen, um meinen neuen Plenticore plus Wechselrichter von Kostal auszulesen.
      Mit QModMaster komme ich auch an die Werte des WR.
      Leider hat Kostal (meiner Meinung nach entgegen dem Standard) einen anderen Port für den Modbus definiert. Nämlich 1502 anstatt 502.

      Dadurch bekomme ich im Error Log des Bausteins natürlich die Fehlermeldung "unable to connect"

      Code:
       [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
       	 		[TR]
       			[TD]19-05-03 15:40:09[/TD]
       			[TD]274135[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: START ModbusMaster Exec[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]284636[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: v3:9;13;17;21;25[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]286030[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: inputs:[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]286231[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT START ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]286413[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ["9","13","17","21","25"][/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]286545[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT END ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]287880[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: i:0; input:9; address:144; length:1; type:3[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]290064[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: File: /usr/local/edomi/main/include/php/ModbusMaster.php | Error: 2 | Line: 100 | socket_connect(): unable to connect [111]: Connection refused[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]291620[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: Modbus Error:[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]291847[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT START ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]291994[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: {"host":"192.XXX.XXX.XXX","port":"502","client":"","client_port":"502","status":"readMultipleRegisters: START\n","timeout_sec":5,"endianness":0,"socket_protocol":"TCP"}[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]292143[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT END ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]293941[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: Modbus Error:[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]294162[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT START ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]294296[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: {}[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]294450[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: ================ ARRAY/OBJECT END ================[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]295643[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: Retries:0[/TD]
       		[/TR]
       		[TR]
       			[TD]2019-05-03 15:40:09[/TD]
       			[TD]298702[/TD]
       			[TD]15966[/TD]
       			[TD]debug[/TD]
       			[TD]EXE19001030 [v0.5]: end of delay[/TD]
       		[/TR]
       	 [/TABLE]
      Nachdem ich mir den Quellcode vom Baustein angesehen habe, konnte sogar ich als PHP Leihe erkennen, dass anscheinend der Eingang E3 im Baustein gar nicht Verknüpft ist und der Baustein somit immer per default den Port 502 nimmt.

      Auszug aus dem Quelltext:
      E3: Port (Currently not used)

      Liege ich mit meiner Aussage richtig, dass der Eingang E3 nicht verknüpft ist?

      Wenn dem so ist habe ich wohl drei Möglichkeiten:
      a) Ich versuche herauszufinden wo der Port 502 "hard" im Code angegeben ist und ändere den für meine Zwecke auf 1502 oder
      b) mit einem ganz großen BITTE kannst du "gulp2k" den Baustein vielleicht so anpassen, dass der Eingang E3 im Code auch ausgewertet wird und dadurch vielleicht der Eine oder Andere den LBS auch in Zukunft für einen Kostal WR nutzen kann oder
      c) vielleicht hat ja jemand einen anderen LBS den ich für meinen Plenticore nutzen kann???

      Für jegliche Hilfe in diesem phantastischem Forum bin ich wie immer sehr dankbar!!!

      Gruß
      Rainer






      Kommentar


        Hi Rainer,

        aktuell hab ich den LBS gar nicht mehr imEinsatz und kann es auch nciht testen.
        Nach kurzem Blick in die Library die ich nutzte ist dort der Port gar nicht vorgesehen...
        Du kannst mal versuchen bei E2 den Port mit anzugeben. ip:1502
        Eventuell klappt das.
        Aktuell ist es bei mir zeitlich echt knapp, Garten muss fertig werden
        Gruß
        Michael

        Kommentar


          Hallo Michael,

          danke für die schnelle Antwort!
          ip:1502 funktioniert leider nicht. Da gibt es einen "Host lookup failed" Fehler

          Habe mich jetzt erstmal für Variante a) entschieden und in der "ModbusMaster.php" den Port auf 1502 gesetzt.

          Damit bekomme ich eine Antwort vom WR

          Leider passen jetzt die Wert noch nicht so richtig.
          Ein "Daily Yield" von 2.1947136548255E-41 erscheint mich doch recht unglaubwürdig

          Muss wohl noch etwas mit den Datentypen oder den Adressen spielen.
          Mal schauen ob ich das auch noch hin bekomme...

          Besten Dank auf jeden Fall erst einmal!

          Gruß

          Rainer

          Kommentar


            Ok,
            einen hab ich noch...
            Anscheinend kommen bei mir die Daten vom Plenticore in anderer Byte Reihenfolge...
            Gerade an der IP Adresse (die ich testweise mal ausgelesen habe) erkennt man das Highbyte und Lowbyte anscheinend vertauscht sind.
            Beispiel:
            Soll: 199.199.199.199
            Ist: 91.991.991.9919

            Jetzt wurde hier ja mal (irgendwo auf Seite 6 oder 7) über den Endianess geschrieben und dass man den irgendwo einstellen kann.
            Geht das bei den Datentypen? Egal welchen Datentyp ich ausprobiere. Keine liefert die richtigen Werte.

            In der Kostal Doku heißt es:
            MODBUS uses a ‘big-Endian’ representation for addresses and data items. This means that when a
            numerical quantity larger than a single byte is transmitted, the most significant byte is sent first.


            Kann ich das irgenwo umstellen?
            Dank und Gruß

            Rainer

            Kommentar


              deRainer
              in der ModbusMaster.php den Port fest einzustellen ist tatsächlich der einfachste Weg wenn du nur ein Gerät hast.
              Ansonsten müsste man den Construktor erweitern und dann den Port vom LBS übergeben...

              Die Endianess kannst du im Moment nur fix im LBS einstellen.
              Im Quellcode ganz oben direkt nach den Eingängen bei v#4 eine 1 anstatt der 0 schreiben.
              Dann wird es umgedreht.
              Falls das auch nicht hilft mal mir der Startadresse spielen, ich hatte es auch schon das man da noch ein +-1 machen musste
              Gruß
              Michael

              Kommentar


                Zitat von deRainer Beitrag anzeigen
                Ok,
                einen hab ich noch...
                Anscheinend kommen bei mir die Daten vom Plenticore in anderer Byte Reihenfolge...
                Gerade an der IP Adresse (die ich testweise mal ausgelesen habe) erkennt man das Highbyte und Lowbyte anscheinend vertauscht sind.
                Beispiel:
                Soll: 199.199.199.199
                Ist: 91.991.991.9919
                Hi Rainer,

                hast d die Problematik schon gelöst?

                bei mir wird demnächst auch ein Plenticore werkeln.

                Danke
                Grüße
                Dirk
                Grüße
                Dirk

                Kommentar


                  Hallo Dirk,
                  aufgrund von Gartenprojekten bin ich leider noch nicht soweit wie ich möchte
                  Nachdem ich im LBS den Port und den Endianess angepasst habe stimmt z.B. die IP Adresse die ich zurück bekomme. Leider sind die eigentlichen Werte, die mich interessieren im Moment noch unplausibel.
                  Da kommen immer noch "Daily Yield" Werte von 1.1947136558255E-16

                  Ich denke da stimmt die Umrechnung der Werte noch nicht. Da ich den Endianess geändert habe stimmt jetzt evtl. die Konvertierung der Datentypen (Float?) nicht. Da bin ich aber noch nicht weiter gekommen.
                  Vielleicht habe ich am WE mal wieder etwas Zeit...
                  Gruß
                  Rainer

                  Kommentar


                    Ich versuche auch gerade meinen Fronius mit dem LBS ans laufen zu bekommen.
                    Ich denke ein guter Test ist das Auslesen des SunSpec registers "Manufacturer".

                    Bei mir lieferte das Lesen von zwei Registern - bei mir laut Mapping ab 40005: noui
                    Buchstaben stimmen schon mal so halbwegs, aber die Reihenfolge nicht.
                    Im LBS die Endianess umgestellt, dann kommt das hier: oniu
                    Daran konnte ich dann noch sehen, dass die Registeradresse eins niedriger sein muss, also vermutlich alle Angaben aus den SunSpec Tabellen.
                    40004 statt 40005 liefert dann: Fron

                    Registerindex und Endianess sollten also vor weiteren Versuchen bekannt sein.

                    Nächster Punkt wäre dann der Scaling_Factor, der zu manchen Werten dazugehört. Der kann dann z.B. -1 sein.
                    Bedeutet Wert = Registerwert * 10 ^ -1

                    Da bin ich aber mangels Zeit noch nicht weiter.
                    Zuletzt geändert von DerSeppel; 02.07.2019, 15:35. Grund: Rechtschreibung und so.

                    Kommentar


                      Die Sunspec unterstütz der Plenticore wohl auch. Damit könnte ich mich als nächstes beschäftigen wenn ich nicht über die Kostal Beschreibung an die Daten komme. Muss mir aber noch die Beschreibungen der einzelnen Layer zu Gemüte führen...
                      Ist ein guter Hinweis damit mal rum zu spielen.
                      Gruß

                      Kommentar


                        Also das mit den Registeraddressen habe ich irgendwo auch schon mal geschrieben.
                        Manchmal muss man +-1 auf die Addressen laut Beschreibung machen...

                        Was die Endianess angeht wie oben beschrieben kann die im Code umgestellt werden.
                        Gruß
                        Michael

                        Kommentar


                          Ein Modbus LBS für Fronius wäre interessant..
                          wärs nicht leichter den Fronius per API LBS auszulesen oder kann das nicht alles?

                          Kommentar


                            Zitat von uzi10 Beitrag anzeigen
                            Ein Modbus LBS für Fronius wäre interessant..
                            wärs nicht leichter den Fronius per API LBS auszulesen oder kann das nicht alles?
                            Per API gibts das schon:
                            - http://service.knx-user-forum.de/?co...ad&id=19001640
                            - http://service.knx-user-forum.de/?co...ad&id=19000182


                            Da sind einige Werte nicht verfügbar (z.B. Stringspannung). Das liegt aber nicht an den LBS per se. Manche Daten gibt es nur über Modbus.

                            Kommentar


                              Kurze Rückmeldung,
                              habe es hinbekommen. Habe zu kompliziert gedacht. Endianess muss nicht gedreht werden (also v4=0). Nur den Port "hart" im LBS auf 1502 setzten und die richtigen Typen wählen.

                              Bekomme jetzt alle Daten aus dem Plenticore. Muss diese jetzt nur noch sinnvoll weiterverarbeiten und in die Visu einbinden...

                              Aktuell sehen die LBS so bei mir aus:
                              LBS.JPG

                              Gruß

                              Rainer

                              Kommentar


                                Bei meinem Fronius gehts jetzt auch, mit einer kleinen Modifikation am LBS.
                                Das Array mit dem Rückgabewert von $modbus->readMultipleRegisters muss "gedreht" werden:

                                Code:
                                $recData = $modbus->readMultipleRegisters($E[5]['value'], $E[$inputs[$i]]['value'], $E[$inputs[$i]+1]['value']);
                                [B]$recData = array_reverse($recData);[/B]
                                Dann klappt es mit:
                                - Endianess = 0 (standard)
                                - Registeradressen aus der Sunspec - 1, also z.B. 40093 statt 40094 für die Netzfrequenz

                                Kommentar

                                Lädt...
                                X