Re: [V4.5 IP4] Nutzung von KI (LLM) für Dokumentation und Custom-Logiken
Verfasst: Mi Sep 24, 2025 9:45 pm
bitte testen
sie hat sich speichern lassen
wegen fehlender bauteile ist für mich ein testen nicht möglich
beim 2 ten versuch war sie speicherbar
ich habe der ki nur deine anleitung gegeben mehr nicht
also dein kompletten forumsbeitrag mit der anforderung deiner ki
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.1",
"Author": "AI (nach Vorgaben von Georg E.)",
"Last_Update": "2025-09-24"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "a" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "a" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ], // NEU: Variable für -$in_Netzbezug
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Laden_Cond3", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
[ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Laden_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
[ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Entladen_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// NEU: Absolutwert für Netzbezug für Entladeberechnung
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", -1.0 ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
// $in_Netzbezug == 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzeNetzbezugStandbyLaden" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2" ], "$Lgc_Netzbezug_Standby_to_Laden_Cond1" ], // Lgc_Netzbezug_Standby_to_Laden_Cond1 = ($in_Netzbezug >= 600W)
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_Standby_to_Laden_Cond3", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$Lgc_SOC_Standby_to_Laden_Cond3" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$in_Netzbezug" ], // A > B
// SOC >= 100%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Laden_to_Standby_Cond2", "$KonstGrenzeSOCMax" ], // A > B
[ "Comparator", "$in_SOC", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$KonstGrenzeSOCMax" ], // A == B
[ "Or", [ "$Lgc_SOC_Laden_to_Standby_Cond2", "$Lgc_Netzbezug_Laden_to_Standby_Cond1" ], "$Lgc_SOC_Laden_to_Standby_Cond2" ], // Lgc_SOC_Laden_to_Standby_Cond2 = ($in_SOC >= 100%)
[ "Or", [ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$Lgc_SOC_Laden_to_Standby_Cond2" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$in_Netzbezug" ], // A > B
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "$in_Netzbezug" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2" ], "$Lgc_Netzbezug_Standby_to_Entladen_Cond1" ], // Lgc_Netzbezug_Standby_to_Entladen_Cond1 = ($in_Netzbezug <= -250W)
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Standby_to_Entladen_Cond2", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_SOC_Standby_to_Entladen_Cond2" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0%
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_Entladen_to_Standby_Cond2", "$in_SOC" ], // A > B
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$in_SOC" ], // A == B
[ "Or", [ "$Lgc_SOC_Entladen_to_Standby_Cond2", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1" ], "$Lgc_SOC_Entladen_to_Standby_Cond2" ], // Lgc_SOC_Entladen_to_Standby_Cond2 = ($in_SOC <= 0%)
[ "Or", [ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$Lgc_SOC_Entladen_to_Standby_Cond2" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", "$KonstStatusLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", "$KonstStatusSTANDBY", "$KonstStatusENTLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", "$KonstStatusENTLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", 1.0 ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", 1.0 ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungLaden", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielLadeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungLaden) => X - Y
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last) - KORRIGIERTER TYPO
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungEntladen", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielEntladeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungEntladen)
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$out_SollLeistungLaden", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$out_SollLeistungEntladen" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}
sie hat sich speichern lassen
wegen fehlender bauteile ist für mich ein testen nicht möglich
beim 2 ten versuch war sie speicherbar
ich habe der ki nur deine anleitung gegeben mehr nicht
also dein kompletten forumsbeitrag mit der anforderung deiner ki
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.1",
"Author": "AI (nach Vorgaben von Georg E.)",
"Last_Update": "2025-09-24"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "a" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "a" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ], // NEU: Variable für -$in_Netzbezug
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Laden_Cond3", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
[ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Laden_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
[ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Entladen_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// NEU: Absolutwert für Netzbezug für Entladeberechnung
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", -1.0 ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
// $in_Netzbezug == 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzeNetzbezugStandbyLaden" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2" ], "$Lgc_Netzbezug_Standby_to_Laden_Cond1" ], // Lgc_Netzbezug_Standby_to_Laden_Cond1 = ($in_Netzbezug >= 600W)
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_Standby_to_Laden_Cond3", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$Lgc_SOC_Standby_to_Laden_Cond3" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$in_Netzbezug" ], // A > B
// SOC >= 100%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Laden_to_Standby_Cond2", "$KonstGrenzeSOCMax" ], // A > B
[ "Comparator", "$in_SOC", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$KonstGrenzeSOCMax" ], // A == B
[ "Or", [ "$Lgc_SOC_Laden_to_Standby_Cond2", "$Lgc_Netzbezug_Laden_to_Standby_Cond1" ], "$Lgc_SOC_Laden_to_Standby_Cond2" ], // Lgc_SOC_Laden_to_Standby_Cond2 = ($in_SOC >= 100%)
[ "Or", [ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$Lgc_SOC_Laden_to_Standby_Cond2" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$in_Netzbezug" ], // A > B
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "$in_Netzbezug" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2" ], "$Lgc_Netzbezug_Standby_to_Entladen_Cond1" ], // Lgc_Netzbezug_Standby_to_Entladen_Cond1 = ($in_Netzbezug <= -250W)
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Standby_to_Entladen_Cond2", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_SOC_Standby_to_Entladen_Cond2" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0%
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_Entladen_to_Standby_Cond2", "$in_SOC" ], // A > B
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$in_SOC" ], // A == B
[ "Or", [ "$Lgc_SOC_Entladen_to_Standby_Cond2", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1" ], "$Lgc_SOC_Entladen_to_Standby_Cond2" ], // Lgc_SOC_Entladen_to_Standby_Cond2 = ($in_SOC <= 0%)
[ "Or", [ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$Lgc_SOC_Entladen_to_Standby_Cond2" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", "$KonstStatusLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", "$KonstStatusSTANDBY", "$KonstStatusENTLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", "$KonstStatusENTLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", 1.0 ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", 1.0 ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungLaden", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielLadeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungLaden) => X - Y
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last) - KORRIGIERTER TYPO
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungEntladen", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielEntladeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungEntladen)
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$out_SollLeistungLaden", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$out_SollLeistungEntladen" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}