Bij het uitlezen van een Solaredge omvormer heeft het register voor de totaal opgeleverde vermogen een incorrecte waarde. Met deze blog hoop ik te achterhalen hoe dat kan en hoop het te kunnen corrigeren.
Ook kan deze blog anderen helpen die met het zelfde onderwerp bezig zijn.
Ik heb een Solaredge SE3000H Omvormer. Enkel fase aansluiting.
De Solaredge wordt zeer bewust niet aan internet aangesloten. Dus GEEN App in de cloud. Ik heb een fysieke geijkte kWh meter en ik heb de Solaredge "SetApp". Dat is een App om het apparaat uit te kunnen lezen en instellingen aan te passen. Ik heb een Raspberry Pi3 met een CAN Hat RS485 printje er boven op. Ik lees de Solaredge uit via het RS485 interface. Wat ik wil is alle Solaredge registers uitlezen om zo zelf alle waarden weer te geven.
Verschil fysieke meting en aangegeven waarden
Er zit nu een verschil van 3 kWh tussen de waarde die de SetApp aangeeft en de kWh meter. Interessant.
De fysieke meter is 3 KWh lager. Dit kan niet verklaard worden met het gecumuleerde standby gebruik van de Solaredge 's nachts. Dit verbruik is 4W gedurende de hele nacht. Precies om die reden heb ik de kWh meter ook.
Uitlezen SolarEdge via RS485
Het is niet gelukt om de SolarEdge uit te lezen via Modbus. De Solaredge geeft geen reactie. Er is pas activiteit als ik met de SetApp het RS485 interface instel op Sunspec. Dit is een open protocol. Voor mijn doen is dat perfect. Er bestaan verschillende registers en die kun je uitlezen.
Als software om dat te doen gebruik ik Minimalmodbus onder Python. Zie specificatie hier
De specificatie wat in welk register zit kun je hier vinden.
In tussen ben ik er achter dat Solaredge zich niet exact aan de specificatie houd maar grotendeels klopt het. Ik heb dat opgelost door alle registers op te vragen en zo heb ik waarden terug gevonden.
Uitlezen doe ik zo;
Eerst verbinding maken met Minimalmodbus in RTU mode en dan
0 is het ophalen van de waarde met 0 decimalen.
Op dat moment ben je er nog niet want er is ook nog een schaalfactor die je moet toepassen. Die SF staat meestal paar registers verder.
Voorbeeld:
Register: 40072 (I_AC_Current "AC Total Current value") waarde = 135
Register: 40075 waarde = 65534
Dit laatste is een signed interger die als een unsigned interger wordt opgehaald. Dit is echter geen probleem.
65534 - 65536 = -2. Het gaat om een schaalfactor van -2. Dit zet je zo om: register x 10 ^ SF = 135 x 0,01 = 1,35 Ampere. De waarden kloppen ook met wat de meter aangeeft. Dit gaat dus prima.
32 Bit waarden uitlezen
Het totaal opgeleverde vermogen kan een heel groot getal worden. Daarom is het opgeslagen als een 32 bits waarde. Het gebruikt 2 register posities en staat op register 40094 (register 40095 bestaat daarom dus niet) Naam: I_AC_Energy_WH "AC Lifetime Energy production".
De SF voor dit register staat in register: 40096.
Ophalen van 32 bit waarden gaat zo:
3 is een modbus functie code die 3 of 4 kan zijn. 4 werkt niet.
Zie Minimalmodbus spec boven voor details.
Tot zo ver het goede nieuws. Nu het probleem.
De waarde die uit dit register komt is heel groot en lijkt geen relatie te hebben met de echt opgeleverde kWh die ik gelukkig wel weet. Het is wel zo dat de waarde in register 40094 gestaagd aan het oplopen is.
Een paar voorbeelden.
Meter Meter W SetApp SetApp W Register 40094
---------------------------------------------------------------------------
250,7 250700 254,5 254500 3793616896
251,8 251800 255,61 255610 3866755072
251,9 251900 255,77 255770 3877109760
Je ziet zo al dat de achterste register waarden niet zomaar een schaalfactor zit.
Tussen de bovenste regels zit volgens de SetApp 1110 W verschil. In register waarde een verschil van 73138176. Dat zijn ca 65890 punten per Watt. Je kunt natuurlijk ook een factor uitrekenen tussen SetApp en register. 3793616896 / 254500 = 14906,156762279.
Maar daarmee kom je niet naar de laatste register waarde: 14906,156762279 * 255770 = 3812547715.
Dat klopt dus niet met de werkelijke waarde...
Er zit dus niet zomaar een factor of verschil tussen.
Als laatste heb ik de byte order van 0 naar 1 aangepast. Dan is de gelezen waarde heel laag. Bijvoorbeeld 36066. De scale factor in register 40096 is helemaal een ramp. Deze waarde zou een relatief costante factor moeten zijn maar de waarde varieert heel erg. Daar kan ik helemaal niets mee.
Ik weet dus even niet meer verder.
Wie helpt me verder?
Ook kan deze blog anderen helpen die met het zelfde onderwerp bezig zijn.
Ik heb een Solaredge SE3000H Omvormer. Enkel fase aansluiting.
De Solaredge wordt zeer bewust niet aan internet aangesloten. Dus GEEN App in de cloud. Ik heb een fysieke geijkte kWh meter en ik heb de Solaredge "SetApp". Dat is een App om het apparaat uit te kunnen lezen en instellingen aan te passen. Ik heb een Raspberry Pi3 met een CAN Hat RS485 printje er boven op. Ik lees de Solaredge uit via het RS485 interface. Wat ik wil is alle Solaredge registers uitlezen om zo zelf alle waarden weer te geven.
Verschil fysieke meting en aangegeven waarden
Er zit nu een verschil van 3 kWh tussen de waarde die de SetApp aangeeft en de kWh meter. Interessant.
De fysieke meter is 3 KWh lager. Dit kan niet verklaard worden met het gecumuleerde standby gebruik van de Solaredge 's nachts. Dit verbruik is 4W gedurende de hele nacht. Precies om die reden heb ik de kWh meter ook.
Uitlezen SolarEdge via RS485
Het is niet gelukt om de SolarEdge uit te lezen via Modbus. De Solaredge geeft geen reactie. Er is pas activiteit als ik met de SetApp het RS485 interface instel op Sunspec. Dit is een open protocol. Voor mijn doen is dat perfect. Er bestaan verschillende registers en die kun je uitlezen.
Als software om dat te doen gebruik ik Minimalmodbus onder Python. Zie specificatie hier
De specificatie wat in welk register zit kun je hier vinden.
In tussen ben ik er achter dat Solaredge zich niet exact aan de specificatie houd maar grotendeels klopt het. Ik heb dat opgelost door alle registers op te vragen en zo heb ik waarden terug gevonden.
Uitlezen doe ik zo;
Eerst verbinding maken met Minimalmodbus in RTU mode en dan
code:
1
| regval = instrument.read_register(register,0) |
0 is het ophalen van de waarde met 0 decimalen.
Op dat moment ben je er nog niet want er is ook nog een schaalfactor die je moet toepassen. Die SF staat meestal paar registers verder.
Voorbeeld:
Register: 40072 (I_AC_Current "AC Total Current value") waarde = 135
Register: 40075 waarde = 65534
Dit laatste is een signed interger die als een unsigned interger wordt opgehaald. Dit is echter geen probleem.
65534 - 65536 = -2. Het gaat om een schaalfactor van -2. Dit zet je zo om: register x 10 ^ SF = 135 x 0,01 = 1,35 Ampere. De waarden kloppen ook met wat de meter aangeeft. Dit gaat dus prima.
32 Bit waarden uitlezen
Het totaal opgeleverde vermogen kan een heel groot getal worden. Daarom is het opgeslagen als een 32 bits waarde. Het gebruikt 2 register posities en staat op register 40094 (register 40095 bestaat daarom dus niet) Naam: I_AC_Energy_WH "AC Lifetime Energy production".
De SF voor dit register staat in register: 40096.
Ophalen van 32 bit waarden gaat zo:
code:
1
| regval = instrument.read_long(register, 3, signed=False, byteorder=0) |
3 is een modbus functie code die 3 of 4 kan zijn. 4 werkt niet.
Zie Minimalmodbus spec boven voor details.
Tot zo ver het goede nieuws. Nu het probleem.
De waarde die uit dit register komt is heel groot en lijkt geen relatie te hebben met de echt opgeleverde kWh die ik gelukkig wel weet. Het is wel zo dat de waarde in register 40094 gestaagd aan het oplopen is.
Een paar voorbeelden.
Meter Meter W SetApp SetApp W Register 40094
---------------------------------------------------------------------------
250,7 250700 254,5 254500 3793616896
251,8 251800 255,61 255610 3866755072
251,9 251900 255,77 255770 3877109760
Je ziet zo al dat de achterste register waarden niet zomaar een schaalfactor zit.
Tussen de bovenste regels zit volgens de SetApp 1110 W verschil. In register waarde een verschil van 73138176. Dat zijn ca 65890 punten per Watt. Je kunt natuurlijk ook een factor uitrekenen tussen SetApp en register. 3793616896 / 254500 = 14906,156762279.
Maar daarmee kom je niet naar de laatste register waarde: 14906,156762279 * 255770 = 3812547715.
Dat klopt dus niet met de werkelijke waarde...
Er zit dus niet zomaar een factor of verschil tussen.
Als laatste heb ik de byte order van 0 naar 1 aangepast. Dan is de gelezen waarde heel laag. Bijvoorbeeld 36066. De scale factor in register 40096 is helemaal een ramp. Deze waarde zou een relatief costante factor moeten zijn maar de waarde varieert heel erg. Daar kan ik helemaal niets mee.
Ik weet dus even niet meer verder.
Wie helpt me verder?
[ Voor 0% gewijzigd door Sirius.B op 25-10-2020 14:06 . Reden: tabel ]