Technische Detailfragen - Firmwareimplementation VE.Can bei Multi RS Solar 48/6000/100-450/100

Sehr geehrtes Victron Team / Hallo Community,

da ich bereits sehr breit gefächerte Erfahrungen in dem Gebiet gesammelt habe, sowie bereits einiges mit Geräten diverser Hersteller gemacht habe und da ich selbst Elektronik Entwickler / Firmware Programmierer im automotive Bereich bin, habe ich mich für eines meiner neueren Projekte für einen Multi RS Solar 48/6000/100-450/100 entschieden, da dieser nach breiter Marktanalyse die besten Vorraussetzungen für mein Vorhaben (DIY Peak Shaving Powerwall bzw. AC- gekoppelter Batteriespeicher für dynamische Stromtarife) bietet.

Im Zuge dessen habe ich mir direkt eine eigene Steuerplatine (Dongle) entwickelt und programmiert, welche sich direkt per RJ45 mit dem VE.Can verbinden lässt und sich gleichzeitig darüber versorgt (sehr geringe Stromaufnahme), sowie in weiterer Folge dann auf Netzwerkbasis (IEEE 802) per VE.Can (NMEA 2000) den Multi RS Solar direkt steuert sowie alle relevanten Parameter überwacht.

(Warnung an alle die daran denken, ähnliches umzusetzen: Der VE.Can ist nicht galvanisch getrennt und liefert ebenso direkte Batteriespannung über gewisse Pins, hier ist Vorsicht geboten, da sonst sehr schnell Schäden entstehen können!)

Bei der Detailimplementation sind jedoch folgende Fragen auf gekommen:

Der aktuelle Wechselrichtermodus kann per VREG: 0x0200 gesteuert / abgefragt werden (1…Reiner Ladebetrieb, 2…Reiner Wechselrichter, 3…Ein, 4…Aus, 251…Durchschleifen), dies ist auch soweit offiziell dokumentiert (bis auf den letzten Modi).

Die Leistungsvorgabe sowohl für den AC-gekoppelten Lade- als auch Entladebetrieb habe ich per ESS AC-Grid-Setpoint VREG: 0xD0C8 realisiert, dies scheint in keiner offiziellen Doku auf, wird jedoch z.B. von der Victron Connect App verwendet und funktioniert soweit problemlos.

Bei beiden Registern stellt sich für mich jedoch die Frage nach der genauen Wechselrichterseitigen Firmwareimplementation des Registers:

  • Wird bei jedem Schreibzugriff der Wert rein als RAM Variable gehandhabt oder findet im Hintergrund eine Speicherung im Langzeitspeicher (EEPROM, FLASH oder eher unwarscheinlich (ob vorhanden), FRAM statt)?
  • Sollte hier eine Speicherung im Langzeitspeicher statt finden, wird diese jedes Mal (bei jedem Schreibbefehl) oder nur bei einer Änderung des Wertes durchgeführt?
  • Wie hoch ist die Schreibzyklenzahl des verwendeten Speichers?
  • Sind eventuell Mechanismen vorhanden, welche den jeweilgen Wert nur alle x-Sekunden speichern oder geschieht dies gar nur, wenn aktiv ein Abfall der Versorgungsspannung erkannt wird?
  • Bzw. die wichtigste Frage, können diese Register im beliebigem Abstand / zyklisch beschrieben werden ohne Langzeitfolgen zu riskieren?

Mit freundlichen Grüßen,

Hyperelectronic

Hi @Hyperelectronic

For dynamic power control please consider using register 0xD054, it is never stored and it has a timeout of 60s. While active it overrides register 0xD0C8, after the 60s timeout the unit falls back to the value in register 0xD0C8.

There is no direct dynamic equivalent of register 0x0200, this is stored on power-loss and/or physical power switch off. The flash endurance is specified at 10k cycles.

A close alternative for register 0x0200 might be register 0xD055: bit 0 = DisableCharge, bit 1 = DisableFeedIn, bit 3 = DisablePV, bit 7 = DischargDisabled, this is not stored and has no timeout. Additionally register 0xD09A can be used to disconnect from the grid (0=allow connection, 1=disconnect), this is also not stored.

Keep in mind that the GX usually writes to these registers, especially when Dynamic ESS is active.

With kind regards,
Thiemo van Engelen

Hi @thiemovanengelen

0xD09A is overriding the 0xD0E0 register state?

Thanks in advance!

Hello Thiemo van Engelen,

First of all, thank you for your fast and detailed answer.

I did a short test of register 0xD054 (via my remote debug interface), it seems to work exactly as you have described it. This is just perfect for my use case. I am very happy that I decided on one of your products, it seems to work exactly as I could have hoped for!

For controlling the inverter state, I will test your suggestion later (when I am at home and can look at the exact behavior of the inverter), but I think I will stick to the default register as I only use it after a certain inactivity time to save some energy by first switching the inverter to passthrough mode and after an even longer time switching off the inverter completely (doing this only after quite some time to prevent unnecessary relay cycles), so I do this at most a few times a day and therefore it should not be that bad, even if it would be stored to NVM.

Just for curiosity, are all “config” registers handled the same way (so just stored at power loss or switchoff), so, for example, the battery limits could be changed (infrequently) without any flash wear?

Is there any publicly available VREG list of the ESS registers (that are used by the Cerbo GX) for managing the inverters, or are they held under closed source / under an NDA?

Best regards,

Hyperelectronic