Ankündigung

Einklappen
Keine Ankündigung bisher.

Kostal Plenticore WR per MODBUS TCP LBS auslesen

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

    Kostal Plenticore WR per MODBUS TCP LBS auslesen

    Hallo zusammen,

    Es ist mein erstes Mal, dass ich mich mit Modbus auseinandersetze und ich benötige ein wenig Hilfe zum LBS 19001030 ModBus TCP Master Read.

    Mit dessen Hilfe will ich aktuellen Werte eines Kostal Plenticore Wechselrichters auslesen, um dann zusätzliche Verbraucher zu schalten oder zu stoppen, um so den Eigenverbrauch zu optimieren.

    Der LBS ist eingelesen und die zugehörigen PHPs im richtigen Ordner.
    Exemplarisch wollte ich mir jetzt mal einen Wert abfragen, aber es kommt nix an.

    Es wäre schön, wenn mich jemand unterstützen könnte, ob ich die E's richtig gesetzt habe.

    Die Schnittstelle des Penticore ist hierin beschrieben:
    https://www.kostal-solar-electric.co...pec_hybrid.pdf

    Bsw. diesen Wert:0x72 114 Total home consumption PV Wh Float 2 RO 0x03 will ich mal abfragen

    Wie sind die Eingänge zu setzen? Stimmt das so?

    E1: Autostart, Default=1--> bleibt
    E2: Host or IP of Modbus Slave --> hier habe ich die lokale IP-Adresse des WR gesetzt (192.1xx.1xx.xx)
    E3: Port (Currently not used) --> vom Defaultwert auf 1502 aus o.g. Anleitung gesetzt; Richtig?
    E4: Mode: 0=UDP, 1=TCP -->1
    E5: Modbus Slave ID, Default=1--> muss hier die Unit-ID1=71 (dec) gesetzt werden?

    E9: Address1 Datapoint --> auf 114 gesetzt; oder muss die Adresse in HEX angegeben werden
    E10: Lenght to read 1, Default=1 (1=1 Dword=2 Bytes) --> was muss ich hier setzen? N = Quantity of Registers ist 2 lt. Tabelle. Ist das die Länge?
    E11: Type of Data returned 1, 0=Int, 1=uInt, 2=Float, 3=Byte, 4=Bit, 5=String, 6=Swap Float --> auf 2=Float gesetzt
    E12: Function to use (Currently only FC3 Read_Multiple_Registers is implemented) --> was ist das? hier habe ich nichts verändert.

    Danke jetzt schon mal für Euren Support und eure MODBUS-Weisheit.

    F.

    #2
    Moin,
    sieht alles gut aus, hast du das Logging aktiviert? Da könnte man sicherlich sehen, woran es hakt.
    Eventuell mal die Adresse +/- 1 verändern, aber irgendeinen Wert müsstest du auf jeden Fall erhalten.

    Gruß
    Torsten

    Kommentar


      #3
      sieht alles gut aus
      Danke Thorsten für die schnelle Reaktion.
      Kannst Du mir auch die offenen Fragepunkte beantworten? E5, E10, E12

      Gruß,
      F.

      Kommentar


        #4
        Kurzes Update:

        Da könnte man sicherlich sehen, woran es hakt
        Im Logfile ist mir aufgefallen, dass ein Connection Error vorliegt und der ModBusReader-LBS sich über den Default-Port "502" verbinden wollte. Im LBS hatte ich aber "1502" gesetzt. Diese Variable wird aber wohl nicht in die ModbusMaster.PHP übernommen.

        Also dort direkt den Wert ersetzt. Seitdem tut's!

        Frage, die sich mir aber stellt:

        Wie kann ich so mehrere ModBus LBSe parallel betreiben? Hätte da auch noch eine Wärmepumpe, aus der ich per Modbus Daten ziehen will. Und die hat wiederum einen anderen Port.

        F.

        Kommentar


          #5
          Danke für deine Analyse.
          Damit war die Einbindung meines Wechselrichters recht unproblematisch.
          Ich habe auch gleich die Library und den LBS korrigiert, damit auch der Port angepasst und keine Fehler im Zusammenhang mit PHP7 ausgegeben werden.
          Library nach "/usr/local/edomi/main/include/php/Phpmodbus/" entpacken.
          https://www.dropbox.com/s/bbubmord3c...0Read.zip?dl=0

          E3 auf 1502
          E5 auf 71
          E9 auf die Adresse (dec) aus dem PDF von Kostal
          E10 muss auf den Wert in Spalte N, also 2 bei den meisten Werten gesetzt werden

          Kommentar


            #6
            Hallo Philipp,

            schön, dass es dich hier weiter gebracht hat.

            Wie verrechnest du den ausgelesenen Werte? Z.B. 108 oder 116.

            Ich selbst habe hier, nachdem ich die Verbindung zustande gebracht habe, noch nicht weitergemacht.

            Gruß,
            F.

            Kommentar


              #7
              Moin,

              Zitat von fehling Beitrag anzeigen
              E12: Function to use (Currently only FC3 Read_Multiple_Registers is implemented) --> was ist das? hier habe ich nichts verändert.
              Das ist der FunctionCode, damit bestimmst du im Prinzip, ob du ein Register lesen oder schreiben willst und ob es ein 16-Bit oder ein 1-Bit-Register ist. In dem LBS ist aber nur FC3 implementiert, also nur das Lesen von 16-Bit-Registern.

              Gruß
              Torsten

              Kommentar


                #8
                Wie verrechnest du den ausgelesenen Werte? Z.B. 108 oder 116.
                Was möchtest du denn noch verrechnen? Die Werte können, da ohne Skalierungsfaktor, direkt weiter verwendet werden😉

                Kommentar


                  #9
                  ohne Skalierungsfaktor
                  ???

                  Der WR gibt bsw. bei 108 "Home own consumption from grid W " einen 10- oder 11-stelligen Wert (weiß nicht mehr genau) zurück. Da mein Haus Strom nicht im Gigawattbereich verbraucht, nehme ich an diesen erst verrechnen/kürzen zu müssen.

                  F.

                  Kommentar


                    #10
                    Das sind eigentlich alles float Werte. Die vielen Stellen können höchstens nach dem Komma sein.
                    Hast du meine Version probiert?

                    So sieht das bei mir aus. Alle Werte in W bzw. Wh.

                    modbus.PNG

                    Kommentar


                      #11
                      Wie kann ich so mehrere ModBus LBSe parallel betreiben?

                      Hätte da auch noch eine Wärmepumpe, aus der ich per Modbus Daten ziehen will. Und die hat wiederum einen anderen Port.
                      Hallo,
                      nachdem das Auslesen eines Kostal Plexicore WR problemlos klappt (nach Änderung des Ports in der PHP), würde ich gerne die Wärmepumpe per ModBus auslesen/ggf. Werte schreiben.

                      Wie kann ich den ModBus TCP Master Read LBS mehrfach betreiben, wenn die Ports unterschiedlich sind?

                      Gruß,
                      F.

                      Kommentar


                        #12
                        Zitat von fehling Beitrag anzeigen
                        Wie kann ich den ModBus TCP Master Read LBS mehrfach betreiben, wenn die Ports unterschiedlich sind?
                        Du musst den von mir modifizierten LBS und die neue Library nehmen.
                        Damit kann man den Port am LBS angeben und mehrfach mit verschiedenen Ports verwenden.
                        Ich habe den Autor bereits informiert, dass er den LBS im Downloadbereich updaten soll.
                        Bis dahin kannst du die Version von meiner Dropbox verwenden.

                        Kommentar


                          #13
                          Ich habe seit ein paar Tagen auch den Kostal Plenticore.
                          Werde mal gucken, ob ich ein dedizierten Logikbaustein schreibe, der alle Werte ordentlich zur Verfügung stellt. Mit einzelnen Bausteinen die immer nur 4 Werte auslesen können ist mir das viel zu aufwändig in der Pflege

                          Drückt die Daumen ... (und danke für die Vorarbeit / Recherce... das erleichtert einiges!)
                          Autor der SonoPhone, SonoPad und SqueezePad Apps.

                          Kommentar


                            #14
                            Vielleicht hilft dir das auch noch weiter.
                            Habe ich mal auf die Schnelle gemacht:

                            PHP-Code:
                            <?php
                            $host 
                            "192.168.x.x";
                            $port "1502";
                            $modbusID "71";

                            require_once(
                            "/usr/local/edomi/main/include/php/Phpmodbus/ModbusMaster.php");
                            set_time_limit(10);

                            date_default_timezone_set('Europe/Berlin');

                            $modbus = new ModbusMaster($host"TCP"$port);

                            $recData $modbus->readMultipleRegisters($modbusID10080);

                            echo 
                            "Aktuelle Ertrag: ".roundFloat($recData,100-100)."W<br>";
                            echo 
                            "Aktueller Verbrauch aus Netz: ".roundFloat($recData,108-100)."W<br>";
                            echo 
                            "Aktueller Verbrauch aus PV: ".roundFloat($recData,116-100)."W<br>";

                            $recData $modbus->readMultipleRegisters($modbusID25226);
                            echo 
                            "Aktueller Wert Powermeter: ".roundFloat($recData,252-252)."W<br>";

                            $recData $modbus->readMultipleRegisters($modbusID3208);
                            echo 
                            "Tagesertrag: ".roundFloat($recData,322-320)."Wh<br>";

                            $request = array(
                            array(
                            108,2,2),
                            array(
                            116,2,2),
                            array(
                            252,2,2),
                            array(
                            322,2,2));

                            unset(
                            $modbus);

                            function 
                            roundFloat($array$index) {
                            return 
                            round(getfloat($array$index));
                            }

                            function 
                            getfloat($array$index) {
                            return 
                            real2float(($array[2*$index+2]<<24) | ($array[2*$index+3]<<16) | ($array[2*$index]<<8) | $array[2*$index+1]);
                            }

                            function 
                            real2float($value) {
                            // get unsigned long
                            $ulong pack("L"$value);
                            // set float
                            $float unpack("f"$ulong);

                            return 
                            $float[1];
                            }
                            ?>

                            Kommentar


                              #15
                              Ja - bin schon recht weit, habe gestern in der Nacht noch etwas durchgezogen
                              Mache das ähnlich wie im Beispiel - 100 Werte holen und dann die richtigen rauspicken.

                              Bin gerade schon am Formatieren der Ausgangswerte (und festlegen, welche alle in welcher Reihenfolge angeboten werden).

                              Bei zwei Feldern bin ich noch unsicher:
                              die Weboberfläche zeigt:
                              - die Leistung des Inverters
                              - den Grid Feed-In

                              Ich weiß noch nicht auf welche Felder das mappt (oder ob der zweite nur berechnet ist).
                              Zur Verfügung stehen in der Doku:
                              • 172 Total AC active power Float
                              • 575 Inverter Generation Power (actual) W S16
                              und ich weiß noch nicht, welches ich nehme.

                              Bei der Batterie weiß ich auch noch nicht, welche Werte ich nehmen soll / welche wichtig sind.
                              Aktuell gucke ich auf
                              • 582 Actual battery charge/discharge power W S16
                              • 210 Act. state of charge %
                              Autor der SonoPhone, SonoPad und SqueezePad Apps.

                              Kommentar

                              Lädt...
                              X