Modbusspezi hier ? Habe ein Problem mit zwei Registern

  • Ich habe ein kleines Malheur mit den Registern bei SMA


    Ich nutze den PHPModbus der auf dem NAS liegt und eigentlich einwandfrei funktioniert.


    Die Register sind (sollten) lt Doku gleich sein.


    Ich frage drei WR ab. Die Anfrage ist immer gleich, bis auf die IP und die UnitID.


    Der Codeschnipsel sieht so aus


    Mit dem Numberformat setze ich die Ausgabe des Modbus auf eine Kommazahl und setze den Tausendertrenner



    Code
    1. $STP6000WS1V = number_format (Modbus ("xxx.xxx.xxx.xxx",4,30771,10)/100,2,",","."); //aktuell String1 Volt
    2. $SB5WS1V = number_format (Modbus ("xxx.xxx.xxx.xxx",3,30771,10)/100,2,",","."); //aktuelle Volt String1
    3. $SB3WS1V = number_format (Modbus ("xxx.xxx.xxx.xxx",3,30771,10)/100,2,",","."); //aktuell Volt String1
    4. $STP6000WS2V = number_format (Modbus ("xxx.xxx.xxx.xxx",4,30959,10)/100,2,",","."); //aktuell String2 Volt
    5. $SB3WS2V = number_format (Modbus ("xxx.xxx.xxx.xxx",3,30959,10)/100,2,",","."); //aktuelle Volt String2
    6. $SB5WS2V = number_format (Modbus ("xxx.xxx.xxx.xxx",3,30959,10)/100,2,",","."); //aktuelle Volt String2


    Der WR SB5 liefert als einziger die richtigen Werte. Der SB3 und der Tripower liefern nicht nur zahlenmässig falsche, sondern obendrein negative Zahlenwerte.


    Hat da jemand eine Idee was es sein könnte?


    Ich vermute das ich falsche Register anspreche. Nur finde ich keine Doku die dies bestätigt.


    Und alles durchtesten wird sicher bis zum Frühjahr dauern


    Übrigens habe ich das Problem nur bei den Stringsspannungen. Bei allen anderen Parametern funktioniert das mit den gleichen Registernummern super.


    Ich hatte SMA auch angeschrieben. Bis auf die Vermutung dass es an einem alten Versionsstand im STP liegen könne wusste man nicht weiter. Das Update ist drauf, brachte aber keine Verbesserung


    Grüsse
    Carsten

    7,28 kWp, 6000TL20, Ost mit 28 x ReneSola JC260M-24/Bb (02/2013)
    2,65 kWp, 2500TL21, West mit 10 x SolarWorld AG SW 265 mono (EU)
    6,48 kWp, SB5.0, W/NW mit 22 x SolarWorld AG SW 270 mono (EU)
    14,8 kWh Hoppecke Batterie mit SI 6H-11

  • Hallo Steffen,


    die Listen habe ich rauf und runter.


    obs am Datentyp liegt glaube ich nicht.


    Die Zahl bekommt entsprechend ein Komma verpasst oder nicht....


    Es passt ja bei allen (anderen) Werten


    Hier ein relevantes Beispiel:


    30769 DC-Strom Eingang 1, in A S32 FIX3 RO
    30771 DC-Spannung Eingang 1, in V S32 FIX2 RO
    30773 DC-Leistung Eingang 1, in W S32 FIX0 RO


    Verschiedene Register = unterschiedliche Ausgabewerte, ansonsten bis auf die Kommastelle alles gleich


    Trotzdem bekomme ich zwei richtige Ergebnisse und ein falsches
    das muss mir jemand mal erklären :cry:

    7,28 kWp, 6000TL20, Ost mit 28 x ReneSola JC260M-24/Bb (02/2013)
    2,65 kWp, 2500TL21, West mit 10 x SolarWorld AG SW 265 mono (EU)
    6,48 kWp, SB5.0, W/NW mit 22 x SolarWorld AG SW 270 mono (EU)
    14,8 kWh Hoppecke Batterie mit SI 6H-11

  • Da ich den Typ des STP 6000 nicht genau kannte, habe ich in der Liste einfach in der ersten Karteikarte "STP nn000TL-10, PKG 2.65" nachgeschaut und dort z.B. kein Register 30771 gefunden. Ich habe deshalb gedacht, Du kennst die Liste vielleicht nicht.
    Offensichtlich hast Du die Liste aber schon sehr genau studiert. Jetzt habe ich in der Signatur auch entdeckt, dass Du einen 6000TL-20 hast. Dort gibt es dieses Register wieder. Leider habe ich dann auch keine Idee mehr.
    Ich habe bisher nur mit der SUNSPEC Version der Modbus-Schnittstelle gearbeitet.

  • Ja ich habe da schon so ziemlich alles durch
    Die Register müssen richtig sein.


    Von drei WR liefert einer das richtige Ergebnis


    Ich vermute einen Fehler in der Zerlegung des HEX Codes der vom WR kommt

    7,28 kWp, 6000TL20, Ost mit 28 x ReneSola JC260M-24/Bb (02/2013)
    2,65 kWp, 2500TL21, West mit 10 x SolarWorld AG SW 265 mono (EU)
    6,48 kWp, SB5.0, W/NW mit 22 x SolarWorld AG SW 270 mono (EU)
    14,8 kWh Hoppecke Batterie mit SI 6H-11

  • Carstene : eine Vermutung hätte ich - bräuchte dazu aber Beispieldaten...


    Kannst Du bitte die erhaltenen Werte posten?
    Also den (falschen, negativen) Wert, den Du erhältst und welcher Wert es hätte ungefähr sein müssen?
    Wenn Du HEX bekommst, dann bitte den HEX Wert - oder was auch immer Deine Modbus Abfrage zurückliefert...


    Grüße, mmm

  • Ich suche in Kürze die relevanten Sachen zusammen

    7,28 kWp, 6000TL20, Ost mit 28 x ReneSola JC260M-24/Bb (02/2013)
    2,65 kWp, 2500TL21, West mit 10 x SolarWorld AG SW 265 mono (EU)
    6,48 kWp, SB5.0, W/NW mit 22 x SolarWorld AG SW 270 mono (EU)
    14,8 kWh Hoppecke Batterie mit SI 6H-11

  • Heute hatte ich Zeit und Musse um das Ganze mal zusammenzutippseln


    Anbei die relevanten Bildschirmdrucke mit


    Auszug der Rückmeldung des FC3 (Lesen Mobus) im Hex Format
    Das was nach der Umrechnung durch den PHP Modbus als Zahl rauskommt
    Werte aus der Weboberfläche des WRs bzw Fotos vom STP


    SB3





    SB5

  • Kann nur 5 Bilder anhängen


    Hier der Rest:


    SB5




    STP






    Ich hoffe diese Infos helfen dir weiter. Die Ausdrucke sind innerhalb weniger Sekunden entstanden, daher sollten die Werte nicht allzuweit auseinander liegen


    Ich bin da mit meinem Latein ziemlich ausgereizt bzw. muss mich dann tiefer in das Thema einarbeiten als es meine knappe Zeit zulässt.
    Ich hoffe mit der dunkleren Jahreszeit diese Zeit wieder zu haben um das Thema weiter ausarbeiten zu können


    Aber falls du da besser drin bist bin ich für tips gerne zu haben


    Ich habe es nicht eilig ( obendrein ist in der Ferien erst mal Urlaub angesagt)


    Mach dir also keinen Stress


    Grüsse
    Carsten

  • Dachte mir schon, ist eine schnell behobene Sache!


    Unsigned und Signed Int (16 bit) sind verwechselt.
    Du verwendest Signed Int, ist aber ein Unsigned seitens SMA.


    Lösungsvorschlag 1 (Pfusch):
    Wenn Deine Stringspannung unter Null ist, dann addiere 655,36 und Du bist fertig.


    Lösungsvorschlag 2:
    Am Beispiel des STP, hier sind im Data Array die Felder [2] = 152 und [3] = 161
    Wie machst Du aus diesen beiden Feldern die Stringspannung? Hier ist der Fehler drin.
    Richtig ist es so (im Falle eines 16 bit unsigned int, wo offentsichtlich ein Scale Factor seitens SMA von 1/100 gesetzt ist):
    (152 * 256 + 161) / 100 = 390,73
    also: (Feld [2] * 256 + Feld [3]) / 100
    Woher kommt bei Dir der Scalefactor von 1/100? Müsste ein eigenes Register sein.
    Wie auch immer, Du kennst Dein Programm und SMA besser - Fehler ist nur, signed statt unsigned Int zu verwenden, der Rest passt!


    Der Grund, warum es einmal gepasst hat und einmal nicht, ist weil die Stringspannung beim funktionierenden in dem Wertebereich ist, der bei signed und unsigned gleich ist.
    https://de.wikipedia.org/wiki/Integer_(Datentyp)
    Wertebereich signed: −32768 bis 32767
    Wertebereich unsigned: 0 bis 65535
    Alles was bei unsigned über 32767 ist, wird bei signed negativ dargestellt.


    Kommst damit weiter?


    Grüße, mmm