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.
-
Ihr braucht nicht mehr zu Antworten. Fehler gefunden.
Zyklus nicht beendet ich depp....