NEWS
Batterieladest. mit Intervall - skript verändert sich
-
Hallo zusammen,
habe ein Blockly geschrieben, welches abhängig vom SoC des Batteriespeiechers die Ladeleistung reduzieren soll.
Dazu müssen nach Modbus-Doku des WR (SMA SBS 2.5) alle 6 Register zyklisch geschrieben werden. Nach Erfahrungen anderer User so alle 15-25 sek.
Sonst verfällt der WR in den Automatikmodus.Das funktioniert auch soweit so gut, WR lässt sich steuern.
Nun ändert aber das Skript einige Sachen von sich aus.
z.b. aktualisiert er die Werte nach einer gewissen zeit auf einmal alle 5 Sekunden , und nach einem Wechsel der Leistung , also z.b. der Sprung von SoC 79 auf 80 (was eine Leistungsänderung haben sollte) schreibt er dann beide Werte , also 2200 W und 1950 W ins Register 40795.
Wo habe ich hier den Fehler, dass sich der Zyklus "aufhängt" ?
Ich danke für eure Hilfe
var my_1, my_2, my_3, my_4; on({ id: [].concat(['modbus.0.inputRegisters.30845_BAT_SoC']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if (((obj.state ? obj.state.val : '') <= 99) && ((obj.state ? obj.state.val : '') >= 98)) { my_1 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 500, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 97) && ((obj.state ? obj.state.val : '') >= 90)) { my_2 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 1650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 89) && ((obj.state ? obj.state.val : '') >= 80)) { my_3 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 1950, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 79) && ((obj.state ? obj.state.val : '') >= 70)) { my_4 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 2200, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if ((obj.state ? obj.state.val : '') <= 69) { (() => { if (my_1) { clearInterval(my_1); my_1 = null; }})(); (() => { if (my_2) { clearInterval(my_2); my_2 = null; }})(); (() => { if (my_3) { clearInterval(my_3); my_3 = null; }})(); (() => { if (my_4) { clearInterval(my_4); my_4 = null; }})(); setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 2500, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); } });Ich danke euch :)
Edit , nun gerad ebei 90% SoC schreibt er tatsächlich beide Werte gleichzeitig.
-
Hallo zusammen,
habe ein Blockly geschrieben, welches abhängig vom SoC des Batteriespeiechers die Ladeleistung reduzieren soll.
Dazu müssen nach Modbus-Doku des WR (SMA SBS 2.5) alle 6 Register zyklisch geschrieben werden. Nach Erfahrungen anderer User so alle 15-25 sek.
Sonst verfällt der WR in den Automatikmodus.Das funktioniert auch soweit so gut, WR lässt sich steuern.
Nun ändert aber das Skript einige Sachen von sich aus.
z.b. aktualisiert er die Werte nach einer gewissen zeit auf einmal alle 5 Sekunden , und nach einem Wechsel der Leistung , also z.b. der Sprung von SoC 79 auf 80 (was eine Leistungsänderung haben sollte) schreibt er dann beide Werte , also 2200 W und 1950 W ins Register 40795.
Wo habe ich hier den Fehler, dass sich der Zyklus "aufhängt" ?
Ich danke für eure Hilfe
var my_1, my_2, my_3, my_4; on({ id: [].concat(['modbus.0.inputRegisters.30845_BAT_SoC']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if (((obj.state ? obj.state.val : '') <= 99) && ((obj.state ? obj.state.val : '') >= 98)) { my_1 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 500, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 97) && ((obj.state ? obj.state.val : '') >= 90)) { my_2 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 1650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 89) && ((obj.state ? obj.state.val : '') >= 80)) { my_3 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 1950, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if (((obj.state ? obj.state.val : '') <= 79) && ((obj.state ? obj.state.val : '') >= 70)) { my_4 = setInterval(async () => { setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 2200, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); }, 15000); } else if ((obj.state ? obj.state.val : '') <= 69) { (() => { if (my_1) { clearInterval(my_1); my_1 = null; }})(); (() => { if (my_2) { clearInterval(my_2); my_2 = null; }})(); (() => { if (my_3) { clearInterval(my_3); my_3 = null; }})(); (() => { if (my_4) { clearInterval(my_4); my_4 = null; }})(); setStateDelayed('modbus.0.holdingRegisters.40236_CmpBMSOpMod' /* Betriebsart des BMS */, 2424, 250, false); setStateDelayed('modbus.0.holdingRegisters.40793_BatChaMinW' /* Minimale Batterieladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40795_BatChaMaxW' /* Maximale Batterieladeleistung */, 2500, 250, false); setStateDelayed('modbus.0.holdingRegisters.40797_BatDschMinW' /* Minimale Batterieentladeleistung */, 0, 250, false); setStateDelayed('modbus.0.holdingRegisters.40799_BatDschMaxW' /* Maximale Batterieentladeleistung */, 2650, 250, false); setStateDelayed('modbus.0.holdingRegisters.40801_GridWSpt' /* Sollwert der Netzaustauschleistung */, 0, 250, false); } });Ich danke euch :)
Edit , nun gerad ebei 90% SoC schreibt er tatsächlich beide Werte gleichzeitig.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden