# Regelalgorithmus - VBA



## phetzaaa (29 Oktober 2011)

Hallo! 
ich bin frisch angemeldet und habe direkt eine große frage 

ich habe vor einiger Zeit begonnen einen PID Regler in Excel mit VBA zu progammieren. Aber ich komme momentan einfach nicht weiter. Nachdem ich vergebns versucht habe P, D und I Anteil direkt mit einzuprogrammieren, versuche ich zur Zeit nur den P-Anteil in den Griff zu bekommen, aber dies haut irgendwie nicht hin.  

zuerst einmal der Quellcode:
 [/CODE]Im Prinzip eine Herdplatte mit Q=m*cp*deltaT

Mein Problem ist nun, wenn ich ein xp von 10 °C angebe
und yh=1000 W ist (maximale Leistung)
Ergibt sich ja für Kp=yh/xp=1000W/10°C=100W/°C

und eine xp Bereich von 10, also muss doch der P-Regler, bei einer Soll-Temp von 100°C, bis 90°C volle 1000W fahren und danach die Leistung proportional zurücknehmen um dann irgendwann bei 0W zulanden (optimaler Fall)? Richtig?

Bei mir sieht das ganze jedoch leider so aus


(Für dieses Beispiel habe ich die Bergenzung, dass Q maximal 1000W sein darf rausgenommen)
Der Heizwert liegt jenseits der 1000W und der Heizwert nimmt schon bei einer Differenz von 20°C ab. Ich komme gerade nicht mehr weiter, hat evtl. jemand eine Idee, oder sieht wo mein Fehler ist? Ich habe mal alles Fett makiert, was meiner Meinung nach mit dem P-Antei zu tun hat.

Falls jemand einen Tipp hat, wäre ich sehr sehr Dankbar!

gruß!


----------



## Thomas_v2.1 (29 Oktober 2011)

Woher kommt denn yh?
Der Variablenwert wird zumindest in dem von dir gezeigten Code nicht beschrieben.


----------



## phetzaaa (29 Oktober 2011)

Hallo!

ja, entschuldigung. yh habe ich als globale variabel und als konstante deklariert

Const yh As Integer = 1000

Das ist meine maximale Heizleistung in [W]

Gruß!


----------



## Thomas_v2.1 (29 Oktober 2011)

Mir ist nicht ganz klar was du mit dieser Zeile bezwecken willst:

```
Q = m_stellwert * (i - 6) 'Q=Y*delta_t [W]
```

Du hast hier einen digitalen zeitdiskreten Regler programmiert, also ist die Zeitdifferenz immer gleich (1).


----------



## phetzaaa (29 Oktober 2011)

Hm,
also ich habe mir über die eingebrachte Wärmemenge gedanken gemacht.
Diese ändert sich ja mit der Zeit, also 

dQ/dt = m*cp*delta_T/dt

und die Anderung von Q hängt vom Stellwert ab =>
Q = m_stellwert * delta_t 
bei dem delta_t dachte ich nun, dass das die Differenz vom Anfang, bis zum Zeitpunkt t ist. (Wie beim I-Anteil, da Summiere ich ja auch von t=0 bis t=t auf) Aber ich glaube das war ein Denkfehler.

auf jeden Fall bekomme ich dann für die Temperaturänderung
delta_T = Q/(m*cp)


Hm, aber du hast recht. Iich betrache meine System ja eh nur an bestimmten Punkten.
Wenn ich als zeitschritt immer 1 annehme erhalte ich folgendes Bild.
xp=10. Irgendwie scheint es, dass er diesen Proportionalbereich überhaupt nicht annehmen will.

4

MfG!


----------



## Thomas_v2.1 (29 Oktober 2011)

Also bei mir funktioniert es wie es soll.
Ich habe aber deine If-Abfrage für mit "If m_istwert + 0.00005..." und das "Exit For" auskommentiert. Ansonsten würde die Schleife nur einmal durchlaufen.

Falls du damit vorhattest einen Totbereich für den Regler umzusetzen, programmiert man das besser etwas anders.


----------



## Thomas_v2.1 (29 Oktober 2011)

Was hast du denn in deinem Diagramm hinter der Variable für Heizleistung liegen? Da müsste dann der Wert von Q angezeigt werden (Cells(i, 6)) und nicht die Stellgröße. Denn die wird begrenzt bis du in den Proportionalbereich hineinkommst.


----------



## phetzaaa (29 Oktober 2011)

Uff, jetzt bin ich verwirrt.  hm, also meine Heizleistung ist der Wert Q in cells(i,6). Diese gebe ich auch als "Heizleistung" im Diagramm aus.  Ahh, ok.. ich hatte die Begrenzung für das Q nicht drin, darum waren die Werte so extrem hoch. Dann war es der Fehler mit der Zeit.   Aber warum hast du die If-Abfrage weggenommen nund hast du ja 1500 volle Durchläufe, auch wenn du schon den Soll-Wert von 100°C erreicht hast. Die If-Abfrage sollte eigentlich nur abbrechen, wenn der Soll-Wert erreicht ist. Da der reine P-Regler ja nie den Soll-Wert erreicht und später sich nur noch irgendwas im 1^(-14) Bereich ändert, habe ich einfach zum Test die 0,00005 aufaddiert, damit er irgendwann mal nah genug an 100°C abbricht. Ich glaube da wäre auch eine "Do-until"-Schleife besser gewesen    Ist das in der Praxis auch üblich, dass die Stellgröße dann begrenzt wird?   VIEEEELEN DANK SOWEIT! Dann schau ich gleich mal nach dem I und D Anteil, aber die müssten ja eigl. laufen!  //Mist zu früh gefreut, wenn ich die anderen Dazu nehme, schwingt er gnadenlos über und bricht auch nicht bei 90°C ab zu heizen.


----------



## Thomas_v2.1 (29 Oktober 2011)

Eben. Wenn du ein schwingungsfähiges System hast, fallen dir falsche Reglerparameter gar nicht auf wenn du immer mit der Darstellung bei Erreichen des Sollwertes abbrichst.

Wenn du mit Excel und Reglern mehr rumprobieren willst, würde ich die Programmstruktur auch etwas ändern.
Momentan hast du ja Regler und Regelstrecke in einer Funktion zusammengeworfen. Sinnvoller wäre es den PID-Regler in eine eigene Funktion mit entsprechenden Parametern und Rückgabewerten zu packen. Gleiches gilt für deine Regelstrecke.
Wenn du das so getrennt hast, kannst du später einfacher deinen Regler an eine andere Regelstrecke "anschließen" und das Verhalten beobachten. Um die für den I- und D-Anteil notwendigen Daten aus dem vorigen Aufruf zu behalten, kannst du z.B. statische Variablen verwenden, oder machst dir gleich aus allem ein Klassenmodul.


----------



## phetzaaa (29 Oktober 2011)

Stimmt! Das habe ich gar nicht bedacht, dass ich die Überschwinge gnadenlos abschneide.



Eine Frage hätte ich noch:

Begrenzt man in der Praxis auch den Stellwert?


Danke dir nochmals sehr!


----------



## Thomas_v2.1 (29 Oktober 2011)

Das liegt an deiner "negativen Heizleistung". Man könnte sagen, dadurch dass die Temperatur überschwingt, versucht der Regler dieses wieder herunterzukühlen, und das System schwingt sich bei dir auf.

Wenn du die Heizleistung nach unten auf 0 begrenzt dürfte das eigentlich nicht auftreten. Das müsstest du so programmieren wenn du wirklich nur heizen kannst. Da deine Regelstrecke (der Ofen) keine Wärmeverluste hat, kannst du aber niemals wieder auf den Istwert herunterkommen, wenn du diesen einmal überschritten hast.


----------

