+ Antworten
Ergebnis 1 bis 3 von 3
  1. #1
    Registriert seit
    Dec 2008
    Ort
    Weinheim
    Beiträge
    23

    Standard PV Inverter Sunspec Protokoll lesen - hier ein einigermaßen universeller Ansatz

    Hallo zusammen,
    mit der Symcon Modbus Unterstützung kann man sich ja einzelne Daten aus PV Invertern einfach ziehen, inkl. eventuell angeschlossener Meßgeräte. Ich wollte aber unbedingt alle Daten haben - und dafür Feld für Feld eine Definition anzulegen, war mir zu viel Arbeit. Das sind über 200 Felder.

    Deswegen habe ich mir einmal ein recht universelles Script gebaut, um mit Hilfe des sog. Sunspec Protokolls die Inverter und Meßgerätedaten auszulesen. Viele PV Solar Inverter unterstützen das. Mein Inverter ist von Solaredge, aber das schöne an diesem Skript ist, es sollte sich leicht auf andere Inverter (Fronius, SMA, etc.), welche dieses Protokoll unterstützen, umbauen lassen. Das Script legt auch gleich die Variablen an. Eine Stunde Arbeit zur Anpassung müsst ihr sicher einkalkulieren.

    Vorgehensweise:

    1. Die zu Eurem Inverter gehörige Sunspec Dokumentation laden - in der Regel ein PDF file, in dem alle Sunspec Felder zu den Inverter-Registern aufgelistet sind. Google z.b "Solaredge Sunspec". Wie wir daraus die Struktur isolieren, siehe weiter unten.
    2. Von phpmodbus/Phpmodbus at master · adduc/phpmodbus · GitHub die 5 Dateien "PhpModbusMaster ... usw" in das symcon Skripte Verzeichnis laden
    3. Aus dem beigefügten ZIP file die Datei Sunspec_load.ips.php in ein beliebiges Script laden (Copy-Paste). Das ist das Hauptprogramm.
    4. Einen Kategorie-Einstiegsbaum anlegen - bei mir eine Kategorie Sunspec, und darunter 3 Kategorien "Common Model", "Inverter Model" und "Meter 1 Model". Ggfs. weitere, falls euer Inverter mehr unterstützt.
    5. Nun brauchen wir die Sunspec Definitionen. Mein Ansatz war, aus dem PDF file aus Punkt 1 die Definitionen zu isolieren. Das ging ganz einfach - PDF nach Word importieren, die entsprechenden Sektionen nach Excel kopieren und von dort ein csv file erzeugen. Siehe als Beispiel das beigefügte CSV file. Das laden wir nun in ein Script (copy-paste), und mißbrauchen dieses Script als Eingabe für das Hauptprogramm, um die notwendigen Variablen alle zu erzeugen. Ggfs. müsst ihr eure csv Ausgabe an die Einlese-Funktion anpassen oder umgekehrt.
    6. Zuguterletzt durch die Anfangssektion im Programm gehen, und eure Kategorie-ID's eintragen, die Start-/Stop Addressen für die Sektionen anpassen (z.B. Start des Meter 1 Models ab Addresse 40121, usw). Diese aus der Sunspec Doku eures Inverters entnehmen.


    Dann das Hauptprogramm alle z.b. 30sek laufen lassen. Das erzeugt die Sunspec Struktur (beim ersten Mal) sowie lädt alle Daten. Im Programm selbst sind viele print_r's und echo's eingestreut, um das zu debuggen. Das Ergebnis sind dann so ähnlich aus wie im angefügten Bild. Weiteres Post-Processing ist nötig - da z.B. einzelne Variablen mit Skale-Faktors belegt sind - d.h. man muß nochmal durch 100 oder 10 teilen, um auf die Watt Zahl o.ä. zu kommen. Sicherlich alles noch nicht perfekt.

    In der Hoffnung, daß dies mal wer brauchen kann - viel Spass.

    Grüsse


    Sunspec_Symcon.zipKlicken Sie auf die Grafik für eine größere Ansicht 

Name:	bild.png 
Hits:	106 
Größe:	106.4 KB 
ID:	48887

  2. #2
    Registriert seit
    Feb 2008
    Ort
    Düsseldorf
    Beiträge
    369

    Danke für die Skripte!
    Ich hänge mich hier mal mit meinen gesammelten Infos dran. Das ist eher die "zu Fuß" Methode. Das Auslesen mit den Skripten aus dem ersten Beitrag ist natürlich eleganter :-)
    Hier sind z.B. auch die Infos für einen LG Chem Resu 10H Speicher enthalten:

    Meine Anlagenkonfiguration:
    Wechselrichter: Solaredge SE5000H
    Speicher: LG Chem Resu 10H
    6,5 kWp


    Hier die Adressen die ich verwende mit ein paar Zusatzinfos zum Umrechnen. Die Skripte sind wohl etwas stümperhaft... funktionieren aber.

    Zum Ablauf der Umrechnung:
    Zu fast jedem Wert gibt es einen Skalierungsfaktor der ebenfalls über Modbus ausgelesen wird. Mit diesem Skalierungsfaktor muss der eigentliche Wert umgerechnet werden. Hierzu habe ich unter jedem Modbus Device eine neue Float Variable erstellt und mit entsprechendem Profil versehen. Dann noch ein Script für das jeweilige Modbus Device erstellt das mit einem Ereignis aufgerufen wird. (Immer wenn der Skalierungsfaktor aktualisiert wird -> Script ausführen) Wichtig ist das nur die Modbus Devices für den Skalierungsfaktor zyklisch abgerufen werden. Also z. B. alle 30 Sekunden. Die Modbus Devices mit den eigentlichen Werten werden nur beim ausführen des Skripts ausgelesen. Werden beide zyklisch gelesen kommt es teilweise zu falschen Ergebnissen weil dann der Skalierungsfaktor z.B. nicht zum Wert passt. Man erhält dann z.B. nicht 450 Watt sondern 4500 Watt...

    Die unten aufgeführten Adressen sind nicht komplett sondern enthalten nur die Werte die für mich relevant sind. Wenn was fehlt müsst ihr euch die Werte aus der Sunspec Dokumentation ziehen!

    Falls hier jetzt jemand, angesichts meiner Skripte, die Hände über dem Kopf zusammenschlägt bin ich natürlich für elegantere Lösungen offen :-)

    Die IDs in den Skripten müssen natürlich entsprechend angepasst werden!

    Solaredge Modbus Adressen:

    Name: AC - Netzfrequenz (Herz)
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 85
    • Factor: Dividiere durch 1000





    Name: AC - Gesamte Produktion (kWh)
    • Einheit: DWord (32Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 93
    • Factor: keinen


    Name: AC - Gesamte Produktion (kWh) SKALIERUNGSFAKTOR
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 95
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (11487); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(30961);
    $scalefactor GetValueInteger(49750);
    $data $original ** $scalefactor;
    $data2 $data 1000;
    SetValueFloat(42127$data2);
    ?>



    Name: AC - Leistung (Watt)
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 83
    • Factor: keinen


    Name: AC - Leistung (Watt) SKALIERUNGSFAKTOR
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 84
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (21222); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(53191);
    $scalefactor GetValueInteger(52040);
    $data $original 10 ** $scalefactor;
    SetValueFloat(27462$data);
    ?>



    Name: AC - Strom (Ampere)
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 71
    • Factor: keinen


    Name: AC - Strom (Ampere) SKALIERUNGSFAKTOR
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 75
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (27901); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(32725);
    $scalefactor GetValueInteger(24015);
    $data $original 10 ** $scalefactor;
    SetValueFloat(51954$data);
    ?>



    Name: DC - Leistung (Watt) die vom Wechselrichter in AC umgewandelt wird
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 100
    • Factor: keinen


    Name: DC - Leistung (Watt) SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 101
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (43139); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(22196);
    $scalefactor GetValueInteger(48284);
    $data $original 10 ** $scalefactor;
    SetValueFloat(21176$data);
    ?>



    Name: DC - Spannung (Volt)
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 98
    • Factor: keinen


    Name: DC - Spannung (Volt) SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 99
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (53508); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(10607);
    $scalefactor GetValueInteger(20091);
    $data $original 10 ** $scalefactor;
    SetValueFloat(11695$data);
    ?>



    Name: DC - Strom (Ampere)
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 96
    • Factor: keinen


    Name: DC - Strom (Ampere) SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 97
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (55900); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(46616);
    $scalefactor GetValueInteger(38686);
    $data $original 10 ** $scalefactor;
    SetValueFloat(44619$data);
    ?>



    Name: Eingespeiste kWh
    • Einheit: DWord (32Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 226
    • Factor: keinen


    Name: Eingespeiste kWh SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 242
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (41873); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(22211);
    $scalefactor GetValueInteger(43041);
    $data $original 10 ** $scalefactor;
    $data2 $data 1000;
    SetValueFloat(58001$data2);
    ?>



    Name: Bezogene kWh
    • Einheit: DWord (32Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 234
    • Factor: keinen


    Name: Bezogene kWh SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 242
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (36015); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(39392);
    $scalefactor GetValueInteger(12867);
    $data $original 10 ** $scalefactor;
    $data2 $data 1000;
    SetValueFloat(52819$data2);
    ?>



    Name: Status Wechselrichter
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 107
    • Factor: keinen



    Variablenprofil:
    1 = Off
    2 = Sleeping
    3 = Grid Monitoring
    4 = On
    5 = Produktion
    6 = Shutting Down
    7 = Fault
    8 = Setup




    Name: Einspeisung/Bezug (kW)
    Minuswerte = Strombezug aus dem Netz, Pluswerte = Einspeisung in das Netz)
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 206
    • Factor: keinen


    Name: Einspeisung/Bezug (kW) SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 210
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (12237); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(44899);
    $scalefactor GetValueInteger(54001);
    $data $original 10 ** $scalefactor;
    $data2 $data 1000;
    SetValueFloat(29957$data2);
    ?>



    Name: Temperatur Wechselrichter (°C)
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 103
    • Factor: keinen


    Name: Temperatur Wechselrichter (°C) SKALIERUNGSFAKTOR
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 106
    • Factor: keinen


    PHP-Code:
    <?
    ModBus_RequestRead
    (58998); //ID des Modbus Device welches ausgelesen werden soll
    $original GetValueInteger(10287);
    $scalefactor GetValueInteger(32574);
    $data $original 10 ** $scalefactor;
    SetValueFloat(23899$data);
    ?>



    Name: Wechselrichter Typ
    • Einheit: Word (16Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 69
    • Factor: keinen



    Variablenprofil:
    101 = single phase
    102 = split phase
    103 = three phase






    Speicher (LG Chem Resu 10H)

    Name: Ladezustand in Prozent
    • Einheit: DWord (32Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 62852
    • Factor: keinen


    PHP-Code:
    <?
    $ips_data 
    GetValueInteger(40344); 
    $ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16); 
    $float_value u32ToFloat($ips_data_WordSwapped); 
    SetValueFloat(54116$float_value); 

    function 
    u32ToFloat($u32

      
    $sign = ($u32&0x80000000)? -1:1
      
    $exponent = (($u32&0x7F800000)>>23) - 127
      
    $base = (float)(($u32 0x007FFFFF)|0x00800000)/0x00800000 
      return ((float) 
    $sign pow(2$exponent) * $base); 


    ?>



    Name: Speicherleistung in Watt (Negative Werte = Speicher Entladen, Positiv = Speicher laden...)
    • Einheit: DWord (32Bit - vorzeichenlos)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 62836
    • Factor: keinen


    PHP-Code:
    <?
    $ips_data 
    GetValueInteger(52988); 
    $ips_data_WordSwapped = (($ips_data>>16)&0xFFFF) | (($ips_data&0xFFFF)<<16); 
    $float_value u32ToFloat($ips_data_WordSwapped); 
    SetValueFloat(16893$float_value); 

    function 
    u32ToFloat($u32

      
    $sign = ($u32&0x80000000)? -1:1
      
    $exponent = (($u32&0x7F800000)>>23) - 127
      
    $base = (float)(($u32 0x007FFFFF)|0x00800000)/0x00800000 
      return ((float) 
    $sign pow(2$exponent) * $base); 


    ?>



    Name: Speicherstatus
    • Einheit: Short (16Bit - vorzeichenbehaftet)
    • Funktion (Lesen): Holding Register auslesen (03)
    • Modbus Adresse: 62854
    • Factor: keinen



    Variablenprofil:
    1 = Aus
    3 = Laden
    4 = Entladen
    6 = Erhaltungsladung


    Und so sieht die Struktur bei mir aus:
    Klicken Sie auf die Grafik für eine größere Ansicht 

Name:	struktur.jpg 
Hits:	42 
Größe:	96.9 KB 
ID:	49408

    Sonnige Grüße
    Stephan
    Geändert von da8ter (05.06.19 um 08:49 Uhr)
    ___________________________________________
    Wago SPS 750-881 mit Dali Klemme 753-647 und den üblichen DI`s und DO`s
    IP-Symcon Unlimited, letzte Beta...

  3. #3
    Registriert seit
    Jul 2019
    Beiträge
    1

    Standard Modbus-Adressen für LG 10H

    Hallo

    Ich versuche, eine Verbindung zu Modbus TCP meines SolarEdge 5000 HD Wave mit einem LG 10H-Akku herzustellen. Alles gemäß https://www.solaredge.com/sites/defa...nical-note.pdf funktioniert, aber die Batterieadressen fehlen.

    Kennt Ihr zufällig die richtigen Adressen?

    Vielen Dank im Voraus.

    [edit durch DrNiels: Einladung ein unbekanntes Tool auszuführen und die Ausgabe zu posten entfernt]
    Geändert von Dr. Niels (29.07.19 um 08:52 Uhr)

Ähnliche Themen

  1. Neu hier und gleich ein paar (Sicherlich auch alte Fragen)
    Von daMeier im Forum Allgemeine Diskussion
    Antworten: 10
    Letzter Beitrag: 29.12.18, 02:00
  2. IPS Module, hier mein Ansatz zum "Lüftungmodul"
    Von tomgr im Forum Allgemeine Diskussion
    Antworten: 0
    Letzter Beitrag: 31.05.15, 21:13
  3. Enocean protokoll lesen und senden
    Von test2011 im Forum EnOcean
    Antworten: 0
    Letzter Beitrag: 12.10.14, 09:30
  4. die Suche hier ist ein Krampf
    Von BeLo im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 9
    Letzter Beitrag: 25.10.13, 11:54
  5. Bitte lesen, bevor ein Thema eröffnet wird
    Von paresy im Forum Externe Zusatzsoftware
    Antworten: 0
    Letzter Beitrag: 12.03.12, 11:40