@paul53 ich bin's mal wieder, nachdem jetzt sogar das E-Auto nach 15 Monaten Lieferzeit da ist... Wie kann ich den Regler aus dem Beispiel für z.B. 30 Sekunden lang "anhalten", weil meine Beobachtung ist folgende:
Der go-E-Charger verändert die Ladeleistung mit ganzen Ampere-Sprüngen, d.h. wenn ich mit 6 A Lade und der Regler wg. PV-Überschuss Richtung 7 A steuert, springt auf einmal bei 1-phasigem Laden der Istwert von ca. 1.4 kW (6 A) auf 1.6 kW (7 A), was natürlich beim Regler eine Sprungantwort provoziert und auf 6 A zurückgeschaltet wird und dann geht's hin und her. Ich möchte xp aber nicht so groß wählen, dass der Sprung so klein ist, dass es nicht zum Runterschalten kommt, dann wird das ganze viel zu träge. Der Trigger ist also die Änderung des Ladestroms in der Wallbox, was dazu führen soll, dass der Regler für z.B. 30 Sekunden inaktiv ist, um den Leistungssprung ohne Reaktion abzuwarten. Kriegt man die "function control" für eine bestimmte Zeit angehalten, getriggert durch die Veränderung des Ladestrom? Ggf. kann man das erreichen, indem man für die Zeit den Sollwert auf den Istwert schreibt (x=w), dann gibt es keine Abweichung zwischen x und w und y wird nicht verändert. Die Frage ist dann halt, was passiert, wenn wieder auf den echten Istwert geschaltet wird, ist ja auch ein Sprung. Die "function control" kurz anzuhalten scheint da der bessere Weg zu sein...
Danke schon mal vorab!
Ergänzung: habe das jetzt erst einmal gelöst, indem ich xp dynamisch aus Blockly heraus hochsetze, um die Sprungantwort zu dämpfen, aber vielleicht hast du noch eine elegantere Idee? Hier das komplette Regler-Skript mit dynamischem Xp.
// PI-Regler
// Datenpunkt-IDs eintragen !
const xid = 'javascript.0.Wallbox.Netzleistung'; // Istwert
const wid = 'javascript.0.Wallbox.Sollwert_Netzbezug'; // Sollwert
const yid = 'javascript.0.Wallbox.Ladeleistung'; // Stellgröße
const maxid = 'javascript.0.Wallbox.maxOut'; // Stellgröße Maximum zur Reglerbegrenzung
const xpid = 'javascript.0.Wallbox.xp'; // xp: je größer, je langsamer
// P-Band in K, Nachstellzeit in s
const Xp = 50; // je größer, je langsamer ==> Initialwert, wird in "function control" dynamisch verändert
const Tn = 5; // je größer, je langsamer
var x = getState(xid).val; // Istwert
var w = getState(wid).val; // Sollwert
var m = getState(maxid).val; // Sollwert Maximum
const PI = require('pi-controller'); // als zusätzliches NPM-Modul in JS-Config eintragen
const pi = new PI(Xp, Tn);
//pi.setOutputMax(m); // default: OutputMax = 100 ==> wird in "function control" aufgerufen, um dynamisches maxOut zu berücksichtigen
function control() {
const Xp = getState(xpid).val; // Xp kommt dynamisch vom Blockly-Skript
pi.setOutputMax(m); // maxOut kommt dynamisch vom Blockly-Skript
var y = pi.Control(w - x)+1.3; // Stellsignal mit 1.3 kW Offset um Totzeit zu reduzieren bis Mindestleistung von 1.4 kW erreicht ist
setState(yid, Math.round(y*100)/100); //Stellwert auf 2 Nachkommastellen runden
console.log(Xp);
console.log(getState(yid).val);
}
control(); // Script start
on(xid, function(dp) {
x = dp.state.val;
control();
});
on(wid, function(dp) {
w = dp.state.val;
control();
});
on(maxid, function(dp) {
m = dp.state.val;
control();
});
if (Tn) setInterval(control, 250 * Tn );