This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
# Batterie
|
||||
|
||||
IP-Symcon-Modul fuer Batteriespeicher im Enelix EMS. Das Modul uebernimmt die
|
||||
Leistungsangebote und SoC-Logik der bisherigen Enelix-Batterie, arbeitet aber
|
||||
ereignisbasiert und schreibt Stellwerte direkt in ausgewaehlte
|
||||
IP-Symcon-Registervariablen.
|
||||
|
||||
## Funktionen
|
||||
|
||||
- positive Leistung bedeutet Laden, negative Leistung bedeutet Entladen
|
||||
- 250-W-Grundraster mit 50-W-Feinwerten zwischen -200 W und +200 W
|
||||
- unterschiedliche Leistungsangebote fuer PV- und Peakbetrieb
|
||||
- Reserve- und Mindestladezustand mit konfigurierbarer Hysterese
|
||||
- direkte Registeransteuerung fuer herstellerunabhaengige Batterien, GoodWe,
|
||||
SolarEdge und Sigenergy
|
||||
- Umschaltung zwischen Wechselrichter- und Enelix-Steuerung
|
||||
- ereignisbasierte Reaktion auf alle ausgewaehlten Messwerte
|
||||
- Managerkommunikation ueber den Enelix-Vertrag 4.0
|
||||
- Sollwert-Timeout, zeitbasierte Aenderungssperre und periodische Vollmeldung
|
||||
- optionale Diagnosevariablen und Debug-Logging
|
||||
|
||||
Es gibt keinen zyklischen Regel- oder Berechnungstimer. Timer werden nur fuer
|
||||
Vollmeldungen, den Ablauf einer Manager-Vorgabe und das Ende der
|
||||
Aenderungssperre verwendet.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- IP-Symcon ab Version 8.0
|
||||
- ein eingerichteter Enelix Manager
|
||||
- numerische Variablen fuer Ladezustand, Netzleistung, Batterieleistung sowie
|
||||
maximale Lade- und Entladeleistung
|
||||
- numerische Registervariablen mit Standard- oder benutzerdefinierter Aktion
|
||||
|
||||
## Vorzeichen und Einheiten
|
||||
|
||||
| Wert | Positiv | Negativ | Einheit |
|
||||
| --- | --- | --- | --- |
|
||||
| Manager-Sollleistung | Laden | Entladen | W |
|
||||
| Batterieleistung | Laden | Entladen | W |
|
||||
| Netzleistung | Netzbezug | Einspeisung | W |
|
||||
| Ladezustand | - | - | % |
|
||||
|
||||
Sigenergy-Leistungsregister werden in kW beschrieben. Alle anderen
|
||||
Leistungsregister werden in W beschrieben.
|
||||
|
||||
## Batterietypen und Register
|
||||
|
||||
| Batterietyp | Management | Modus | Leistungsregister |
|
||||
| --- | --- | --- | --- |
|
||||
| Herstellerunabhaengig | WR 0, Enelix 1 | Laden 0, Entladen 1 | getrennt Laden/Entladen in W |
|
||||
| GoodWe | WR 1, Enelix 2 | Laden 11, Entladen 12 | gemeinsam, absoluter Wert in W |
|
||||
| SolarEdge | WR 1, Enelix 4 | Laden 3, Entladen 4 | getrennt Laden/Entladen in W |
|
||||
| Sigenergy | WR 0, Enelix 1 | Laden 3, Entladen 6 | getrennt Laden/Entladen in kW |
|
||||
|
||||
Bei Wechselrichtersteuerung bietet die Batterie dem Manager nur [0] an. Das
|
||||
Modul setzt die Leistungsregister auf 0 und schreibt den passenden
|
||||
Automatikcode in das Managementregister.
|
||||
|
||||
Die Konfigurationsmaske zeigt nach Wahl des Batterietyps nur die benoetigten
|
||||
Registerauswahlen:
|
||||
|
||||
- GoodWe: Management, Modus und gemeinsames Leistungsregister
|
||||
- alle anderen Typen: Management, Modus, Ladeleistung und Entladeleistung
|
||||
|
||||
## Messwerte
|
||||
|
||||
| Property | Beschreibung |
|
||||
| --- | --- |
|
||||
| MaxLadeleistungVariableID | Aktuell zulaessige maximale Ladeleistung in W |
|
||||
| MaxEntladeleistungVariableID | Aktuell zulaessige maximale Entladeleistung in W |
|
||||
| LadezustandVariableID | Ladezustand in % |
|
||||
| NetzleistungVariableID | Netzbezug beziehungsweise Einspeisung in W |
|
||||
| IstleistungVariableID | Aktuelle Batterieleistung in W |
|
||||
| MesswertMaxAlter | Maximales Alter jedes Messwertes in Sekunden |
|
||||
|
||||
Alle Messwerte muessen als Integer- oder Floatvariable vorliegen. Fehlt ein
|
||||
Messwert, ist er veraltet oder liegt der Ladezustand ausserhalb von 0 bis
|
||||
100 %, meldet sich die Batterie als nicht verfuegbar und bietet nur [0] an.
|
||||
|
||||
## Ladezustandslogik
|
||||
|
||||
ReserveLadezustand entspricht der bisherigen Peakshaving-Reserve.
|
||||
MindestLadezustand schuetzt vor weiterer Entladung.
|
||||
LadezustandHysterese ersetzt die bisher fest im Code hinterlegte
|
||||
2-Prozent-Hysterese.
|
||||
|
||||
Die bisherigen betriebsartabhaengigen Angebote bleiben erhalten:
|
||||
|
||||
- Im PV-Betrieb steht oberhalb der Reserve das gesamte Raster zur Verfuegung.
|
||||
- Unterhalb der Reserve wird die maximale Ladeleistung angeboten.
|
||||
- Bei vollem Speicher werden nur Entladung und 0 angeboten.
|
||||
- Im Peakbetrieb wird oberhalb der Reserve der aus Netz- und aktueller
|
||||
Batterieleistung berechnete Entladewert angeboten.
|
||||
- Innerhalb der Reserve-Hysterese und unterhalb des Mindestladezustands werden
|
||||
Laden und Entladen wie bisher eingeschraenkt.
|
||||
|
||||
## Manager und Zeitverhalten
|
||||
|
||||
Das Modul verwendet den gemeinsamen Enelix-Nachrichtenvertrag 4.0.
|
||||
Betriebsart ist PV oder Peak. Ein Paket mit Sollleistung_W=null
|
||||
kuendigt nur die Betriebsart an und loest die Neuberechnung des Angebots aus.
|
||||
|
||||
Aenderungssperre ist die ereignisbasierte Entsprechung des frueheren
|
||||
Idle-Counters. Nach einer echten Sollwertaenderung meldet das Modul
|
||||
AenderungMoeglich=false. Ein einmaliger Timer hebt die Sperre nach Ablauf
|
||||
der konfigurierten Sekunden wieder auf.
|
||||
|
||||
VorgabeTimeout setzt die Register auf 0, wenn der Manager eine Vorgabe
|
||||
nicht rechtzeitig erneuert. Meldeintervall erzeugt nur eine periodische
|
||||
Vollmeldung und fuehrt keinen unabhaengigen Regelzyklus aus.
|
||||
|
||||
## Sichtbare Variablen
|
||||
|
||||
Immer vorhanden:
|
||||
|
||||
- Aktiv: lokale EMS-Freigabe
|
||||
- Ladestatus: 0 unbekannt, 1 ruhend, 2 laden, 3 entladen
|
||||
|
||||
Bei aktivierten Diagnosevariablen werden zusaetzlich unter anderem
|
||||
Istleistung, Sollleistung, Ladezustand, Messwertgueltigkeit, Hysterese,
|
||||
Leistungsgrenzen, Energie, Leistungsangebot und der letzte Registerbefehl
|
||||
angezeigt.
|
||||
|
||||
LoggingEin aktiviert zusaetzliche Meldungen im IP-Symcon-Debugprotokoll.
|
||||
Die Schaltflaeche **Messwerte und Angebot aktualisieren** loest eine sofortige
|
||||
ereignisartige Aktualisierung aus. **Register auf sicheren Zustand setzen**
|
||||
verwirft die aktuelle Vorgabe und schreibt eine Leistung von 0.
|
||||
|
||||
## Inbetriebnahme
|
||||
|
||||
1. Batterietyp und Steuerung auswaehlen.
|
||||
2. Alle fuenf Messwertvariablen zuordnen.
|
||||
3. Die automatisch eingeblendeten Registervariablen zuordnen.
|
||||
4. Reserve, Mindestladezustand und Hysterese pruefen.
|
||||
5. Diagnosevariablen und Logging fuer die Erstinbetriebnahme aktivieren.
|
||||
6. Die Batterie im Manager zuordnen.
|
||||
7. Aktiv einschalten.
|
||||
8. Unter Aufsicht je einen Lade-, Entlade- und Nullsollwert senden.
|
||||
9. Registercodes, Vorzeichen, Einheiten und reale Wechselrichterreaktion
|
||||
kontrollieren.
|
||||
10. Abschliessend die Wechselrichtersteuerung waehlen und pruefen, dass alle
|
||||
Leistungsregister auf 0 sowie das Managementregister auf Automatik gehen.
|
||||
|
||||
## Fehlerbilder
|
||||
|
||||
- **Konfiguration ungueltig:** Variablentypen, Aktionszuordnung und die fuer
|
||||
den Batterietyp erforderlichen Register pruefen.
|
||||
- **Messwerte fehlen oder sind veraltet:** Variablenaktualisierung und
|
||||
MesswertMaxAlter kontrollieren.
|
||||
- **Register konnten nicht geschrieben werden:** Standard- oder
|
||||
benutzerdefinierte Aktion der Zielvariablen sowie die Geraetekommunikation
|
||||
pruefen.
|
||||
- **Sollwert wird abgewiesen:** Der Wert muss im zuletzt gemeldeten Angebot
|
||||
enthalten und die Aenderungssperre muss abgelaufen sein.
|
||||
|
||||
## Tests
|
||||
|
||||
~~~bash
|
||||
composer test -- --filter 'Batterie(Regler|Modulstruktur)Test'
|
||||
composer symcon:single -- Batterie
|
||||
composer check
|
||||
~~~
|
||||
|
||||
Der Symcon-Test prueft die Modulinstanz, direkte GoodWe-Registerbefehle,
|
||||
Laden und Entladen, Messwertereignisse sowie die Rueckgabe an die
|
||||
Wechselrichtersteuerung.
|
||||
|
||||
## Weiterfuehrende Dokumentation
|
||||
|
||||
- [Ausfuehrliche Modulbeschreibung](../docs/module/Batterie/README.md)
|
||||
- [Manager-Verbraucher-Schnittstelle](../docs/Schnittstelle.md)
|
||||
- [Migration von Enelix 1](../docs/migration/Batterie.md)
|
||||
@@ -0,0 +1,229 @@
|
||||
{
|
||||
"elements": [
|
||||
{
|
||||
"type": "ExpansionPanel",
|
||||
"caption": "Manager und Zeitverhalten",
|
||||
"expanded": true,
|
||||
"items": [
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "PrioritaetPV",
|
||||
"caption": "Prioritaet PV",
|
||||
"minimum": 0
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "PrioritaetPeak",
|
||||
"caption": "Prioritaet Peak",
|
||||
"minimum": 0
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "Meldeintervall",
|
||||
"caption": "Meldeintervall",
|
||||
"suffix": " s",
|
||||
"minimum": 1
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "VorgabeTimeout",
|
||||
"caption": "Vorgabe-Timeout",
|
||||
"suffix": " s",
|
||||
"minimum": 1
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "Aenderungssperre",
|
||||
"caption": "Sperrzeit nach Leistungsaenderung",
|
||||
"suffix": " s",
|
||||
"minimum": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ExpansionPanel",
|
||||
"caption": "Batterie und Messwerte",
|
||||
"expanded": true,
|
||||
"items": [
|
||||
{
|
||||
"type": "Select",
|
||||
"name": "Batterietyp",
|
||||
"caption": "Batterietyp",
|
||||
"onChange": "IPS_RequestAction($id, 'FormBatterietyp', $Batterietyp);",
|
||||
"options": [
|
||||
{"caption": "Unkonfiguriert", "value": 0},
|
||||
{"caption": "Herstellerunabhaengig", "value": 1},
|
||||
{"caption": "GoodWe", "value": 2},
|
||||
{"caption": "SolarEdge", "value": 3},
|
||||
{"caption": "Sigenergy", "value": 4}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Select",
|
||||
"name": "Batteriemanagement",
|
||||
"caption": "Steuerung der Batterie",
|
||||
"options": [
|
||||
{"caption": "Wechselrichter", "value": 1},
|
||||
{"caption": "Enelix Manager", "value": 2}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "MaxLadeleistungVariableID",
|
||||
"caption": "Maximale Ladeleistung",
|
||||
"validVariableTypes": [1, 2]
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "MaxEntladeleistungVariableID",
|
||||
"caption": "Maximale Entladeleistung",
|
||||
"validVariableTypes": [1, 2]
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "LadezustandVariableID",
|
||||
"caption": "Ladezustand",
|
||||
"validVariableTypes": [1, 2]
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "NetzleistungVariableID",
|
||||
"caption": "Netzleistung",
|
||||
"validVariableTypes": [1, 2]
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "IstleistungVariableID",
|
||||
"caption": "Aktuelle Batterieleistung",
|
||||
"validVariableTypes": [1, 2]
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "MesswertMaxAlter",
|
||||
"caption": "Maximales Messwertalter",
|
||||
"suffix": " s",
|
||||
"minimum": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ExpansionPanel",
|
||||
"caption": "Ladezustandsgrenzen",
|
||||
"expanded": true,
|
||||
"items": [
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "ReserveLadezustand",
|
||||
"caption": "Reserve fuer Peakshaving",
|
||||
"suffix": " %",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"digits": 1
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "MindestLadezustand",
|
||||
"caption": "Minimaler Ladezustand",
|
||||
"suffix": " %",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"digits": 1
|
||||
},
|
||||
{
|
||||
"type": "NumberSpinner",
|
||||
"name": "LadezustandHysterese",
|
||||
"caption": "Reserve-Hysterese",
|
||||
"suffix": " %",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"digits": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ExpansionPanel",
|
||||
"caption": "Batterieregister",
|
||||
"expanded": true,
|
||||
"items": [
|
||||
{
|
||||
"type": "Label",
|
||||
"caption": "Es werden nur die zum gewaehlten Batterietyp passenden Register angezeigt."
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "ManagementRegisterVariableID",
|
||||
"caption": "Managementregister",
|
||||
"validVariableTypes": [1, 2],
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "ModusRegisterVariableID",
|
||||
"caption": "Lade-/Entlademodus",
|
||||
"validVariableTypes": [1, 2],
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "LeistungsRegisterVariableID",
|
||||
"caption": "Leistungsregister",
|
||||
"validVariableTypes": [1, 2],
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "LadeleistungRegisterVariableID",
|
||||
"caption": "Ladeleistungsregister",
|
||||
"validVariableTypes": [1, 2],
|
||||
"visible": false
|
||||
},
|
||||
{
|
||||
"type": "SelectVariable",
|
||||
"name": "EntladeleistungRegisterVariableID",
|
||||
"caption": "Entladeleistungsregister",
|
||||
"validVariableTypes": [1, 2],
|
||||
"visible": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "ExpansionPanel",
|
||||
"caption": "Darstellung und Diagnose",
|
||||
"items": [
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "EinstellungenInVisu",
|
||||
"caption": "Einstellungen in der Visualisierung anzeigen"
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "DiagnosevariablenAnzeigen",
|
||||
"caption": "Diagnosevariablen anzeigen"
|
||||
},
|
||||
{
|
||||
"type": "CheckBox",
|
||||
"name": "LoggingEin",
|
||||
"caption": "Diagnoseprotokoll aktivieren"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "Button",
|
||||
"caption": "Messwerte und Angebot aktualisieren",
|
||||
"onClick": "IPS_RequestAction($id, 'Aktualisieren', true);"
|
||||
},
|
||||
{
|
||||
"type": "Button",
|
||||
"caption": "Register auf sicheren Zustand setzen",
|
||||
"onClick": "IPS_RequestAction($id, 'SichererZustand', true);"
|
||||
}
|
||||
],
|
||||
"status": [
|
||||
{"code": 102, "icon": "active", "caption": "Aktiv"},
|
||||
{"code": 201, "icon": "error", "caption": "Konfiguration ungueltig"},
|
||||
{"code": 202, "icon": "inactive", "caption": "Messwerte fehlen oder sind veraltet"},
|
||||
{"code": 203, "icon": "error", "caption": "Batterieregister konnten nicht geschrieben werden"}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "{437FB683-517F-4FEC-8CCB-FE6B0A62B69E}",
|
||||
"name": "Batterie",
|
||||
"type": 3,
|
||||
"vendor": "Enelix",
|
||||
"aliases": [
|
||||
"Batteriespeicher"
|
||||
],
|
||||
"parentRequirements": [],
|
||||
"childRequirements": [],
|
||||
"implemented": [],
|
||||
"prefix": "ENELIX",
|
||||
"url": "https://git.belevo.ch/ENELIX/Enelix-EMS/src/branch/develop/Batterie"
|
||||
}
|
||||
+1175
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user