Hallo!
ich habe mal versucht einen PID-Regler in Excel nachzubauen, natürlich
per VBA. Leider will das ganze nur so halb funktionieren und ich habe
nur eine indirekte Ahnung woran das liegen könnte, aber ersteinmal die
Fakten:
Die Tabelle in Excel sieht so aus:
A B C D
1 Ü-Schrift Ü-Schrift Ü-Schrift Anzeige des
Soll-wert Ist-Wert Abweichung benutzen Stellwertes
2 Wert Wert Wert Wert
3 Wert Wert Wert Wert
4 Wert Wert Wert Wert
5 Wert Wert Wert Wert
Der Programmcode ist folgender (angelehnt an auch bereits hier
diskutierte Regel-Probleme):
[code]Sub pid_berechnung_()
Dim abweichung, sollwert, abweichung_summe, istwert, abweichung_alt As
Double
kp = Range("o2").Value
tn = Range("o3").Value
tv = Range("o4").Value
Call löschen 'Löscht nur Ist-Wert Zellen, für neue Berechnung
'Initialisieren (evtl. falsch?!)
abweichung = 0
abweichung_summe = 0
abweichung_alt = 0
stellwert = 0
'Soll-Wert festlegen immer fix
sollwert = Range("A2").Value
For i = 2 To 25
istwert = Cells(i, 2).Value
abweichung = sollwert - istwert
Cells(i, 3).Value = abweichung
If istwert <= Cells(2, 1).Value Then 'Wenn der Ist-Wert kleiner
'als Soll ist, dann mach das; Ansonsten Schleife beenden
abweichung_summe = abweichung_summe + abweichung
stellwert = kp * abweichung
stellwert = stellwert + (1 / tn) * abweichung_summe
stellwert = stellwert + tv * (abweichung_alt - abweichung)
Cells(i, 4) = stellwert
abweichung_alt = abweichung
Cells(i + 1, 2).Value = stellwert + istwert
Else
Exit For
End If
Next
End Sub[\code]
Nun das Problem (als Bild dabei)
Ich habe einen Soll-Wert von 100 und einen Ist-Wert von 30 =>
abweichung=70
Nun wird mein Stellwert aber, wie man sieht, immer größer?! Das ist doch
nicht richtig, oder? Und nach 2 Schritten ist er direkt fertig.
Ich glaube, dass kommt daher, da das bei dem D-Anteil ja
(abweichung_alt-abweichung) genommen wird. Beim ersten mal, ist
abweichung_alt=0 und daher wird genommen (0-70)*Tv => ergibt einen
negativen Wert, der von der aktuellen Regelabweichung abgezogen wird.
Daher ist der erste Wert schön "klein", bzw. "gering" bei der nächsten
Runde habe ich aber z.b. dann (70-56) => 26*tn, der wert ist wieder groß
und die Stellgröße wird daraufhin wieder so groß.
Wenn ich an Kp, Tv, Tn drehe, wird alles nur noch schlimmer :-)
Kann mir jemand helfen? Einen Tip geben, oder mir sagen, was ich falsch
mache?
Vielen Dank! Gruß!
Ich blicke zwar nicht ganz genau bei deiner Formel durch, aber du musst
zunächst die P, I und D-Werte getrennt ermitteln, dann mit je einem
Faktor versehen (der meist kleiner 1 ist), alle drei Ergebnisse addieren
und nun endlich zur Anwendung (Stellgröße) bringen ... Vorzeichen
beachten.
Hallo!
Danke für deine Antwort.
Also meine Formel habe ich von Wikipedia:
http://de.wikipedia.org/wiki/Regler#PID-Regler
Mein Problem ist, wie man oben auf dem Bild sieht, dass der Stellwert
immer größer wird, obwohl die Regelabweichung kleiner wird. Das ist ja
nicht richtig, oder?
MfG
Hallo,
habe gerade nochmal drüber geschaut und habe den D-Anteil geändert:
von abweichung_alt-abweichung auf abweichung-abweichung_alt..
aber das hat auch keine verbesserung gegeben, der erste stellwert ist
nun immer EXTREM groß, sodass ich direkt auf den Ist-Wert springe und
eigentlich in einem schritt fertig bin :-) Ist ja auch logisch, denn
abweichung_alt=0 und abweichung z.b. =50
dann habe ich tv*(50-0) => ziemlich groß
Ich habe irgendwie das Gefühl, dass der D-Anteil beim ersten Durchlauf
das Problem ist, da da abweichung_alt=0 ist darum fällt der erste Wert
immer so aus der Reihe.
Einen anderen Vorzeichenfehler gibt es doch nicht, oder?
Danke für die Idee!
Gruß!
Du willst doch eine Simulation machen, oder? Hast du bedacht, dass eine
reale Regelstrecke nicht sofort und genau auf die Stellgröße reagiert -
im Gegensatz zu den Zahlenwerten in einer Excel-Tabelle. Wenn das nicht
so wäre, würde immer ein simpler P-Regler genügen ...
Welchen Stellwert du rausschickst und was die Regelstrecke davon annimmt
sind schliesslich zwei verschiedene Dinge.
Reale Stellglieder habe immer eine Begrenzung der Stellgröße:
z.B. ein Verstärker kann nur eine bestimmte Leistung abgeben
In Deiner Simulation fehlt das. Du baust einen Dead-Beat-Regler, in der
Theorie ist der klasse in der Praxis nicht vorhanden.
Wie sieht eigentlich Deine Regelstrecke aus? Hab die Zeilen nicht
durchschaut.
Hallo!
Danke für die Antworten! Ja ich wollte so eine Art Simulation machen. Es
ist irgendwie alles so theoretisch was man hört.
@Frank
ok, das stimmt. Aber nimmt die Regelstrecke nicht den Stellwert als
Vorgabe? Also nimmt sie ihn doch schon "irgendwie" an.
Danke für Deine Antwort, aber so ganz verstehe ich noch nicht worauf du
hinaus möchtest! ;)
@slow
Ok, das wusste ich nicht, dass die begrenzt werden. Da schaue ich gleich
mal nach, wie ich sowas sinnvoll lösen könnte.
Hm, Dead-Beat-Regler? Davon habe ich noch nie etwas gehört.
Regelstrecke, nunja. Die Idee dahinter war eigl. nur folgende:
Ich habe einen Soll-Wert und einen Ist-Wert (beide von mir vorgegeben).
Dann lasse ich den Regler den Ist-Wert auf den Soll-Wert anpassen (als
PID-Regler)
Wenn man aber so möchte, quasi ein Becherglas mit T_ist in das anderes
Wasser hineingekippt wird. Dann hat die Mischung eine andere Temp und
die soll auf T_soll geregelt werden.
Meinst du das?
Danke für die Antworten!
Gruß!
Frank K. schrieb:> ok, das stimmt. Aber nimmt die Regelstrecke nicht den Stellwert als> Vorgabe? Also nimmt sie ihn doch schon "irgendwie" an.
Ja klar, eine reale Regelstrecke braucht Zeit, um sich dem Wirken der
Stellgröße zu beugen - um das zu optimieren gibt es schliesslich die
zeitabhängigen I- und D-Anteile.
Deine Simulation nimmt die Werte dagegen sofort in voller Höhe an und
verhält sich damit absolut atypisch, deshalb wohl auch die unerwarteten
Ergebnisse. Du musst irgendwie ereichen, dass deine simulierte
Regelstrecke träge und mit Überschwingen reagiert, dann passen auch die
Formeln wieder.
Evtl. hilf dir da Excel nicht weiter, versuche es mal mit VB oder VBA.
In der Simulation musst du einen Zeittakt einführen, in dem die
Regelstrecke jeweils nur zum Teil der Stellgröße nachgibt. Will man auch
das Überschwingen simulieren (nichtlinear!), muss man schon ganz schön
tief in die Mathe- und Programmierekiste greifen.
Richtig mit grafischer Oberfläche und einstellbaren Parametern wäre das
sicher en begehrtes Lerntool ...
Ok, Danke für die Antwort.
So heftige habe ich das Problem, mit dem Stellwert, nicht gesehen.
Dann muss ich mich wohl nach alternativen umschauen, oder tiefer in die
Programmierung einsteigen ;)
Danke für die Antwort!