Also, der innere DC Regler funktioniert. Es gibt Arbeitspunkte für einen reinen P Regler wo der Fehler im Vorzeichen hin und herschwingt. Bei größeren Leistungen ist das Schwingen vom Nullpunkt weiter weg. Also habe ich noch einen I Anteil hinzugefügt. Das regelt schon mal lustig hin und her und ich kann mit Kp und Ki rumspielen.
Ein Problem dabei hat sich schon rausgestellt. Die Stromaufnahme des WR folgt der Vorgabe in verschiedenen Fahrsituationen unterschiedlich schnell. D.h. die Regelstrecke hat keine konstanten Eigenschaften. Das ist aber wohl eher eine klassische Optimierungsaufgabe aus der Regelungstechnik.
Hier ist mein Javascript für NodeRed, abgeschrieben hier aus dem Regler Wiki. Für C und Assembler Programmierer etwas gewöhnungsbedürftig. Soll und Istwert werden in globalen Variablen übergeben. Zum Zugriff braucht man dann die Methoden flow.get und flow.set. Das msg Objekt wird in einer Rückkopplungsschleife mit einer Zykluszeit von derzeit 1 sek wieder hinten eingespeist bzw. msg.out vorne als Stellgröße an den Wechselrichter ausgekoppelt.
Edit: Die Kommentare im Code sind natürlich noch falsch bzw. stammen von einer älteren Version wo ich ohne Kaskade probiert habe. Soll und Istwert sind nicht der SOC sondern die Batterie-Leistungen.Code://flow.sv = Setpoint Value, Sollwert ist gewuenschter SOC Batterie Ladezustand
//flow.pv = Process Value, Ist wert ist der aktuelle SOC Batterie Ladezustand
const Kp = 0.5; // proportional parameter
const Ki = 0.1; // integraion parameter
const Kd = 0; // differential parameter
let error = (flow.get("pv2") - flow.get("sv2")); // difference between setpoint value and process value
msg.errsum += error; // integral difference
msg.out = (Kp * error)+ (Ki * msg.errsum);
// + Kd * (error - msg.errold); // PID Regulator
msg.errold = error; // save Error for next cycle
msg.out = Math.round(msg.out)*-1 ; // negative Einspeisung, positive Akkulast
if (msg.out < -33000) msg.out = -33000; // top saturation
if (msg.out > -333) msg.out = -333; // bottom saturation
return msg;