Hallo zusammen,
ich wollte mal der Allgemeinheit was Gutes tun, und stelle hier mal ein Beispielprogramm für einen PID-Regler rein. Am Programm bastel ich zur Zeit wieder. Den alten Status von 2002 will ich aber gerne veröffentlichen.
Programm-Kurzerklärung:
Das Programm wechselt zwischen Sollwertvorgaben +10,00 und -10,00.
Durch anpassen der PID-Faktoren kann der Verlauf des Istwerts verändert werden.
Hier im TimerPID befindet sich der eigentliche Regler:
EDIT: Neuester Code, bitte den im Programm ersetzen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| P := Diff * StrToFloat(P_Faktor.Text); I := (I +Diff) * StrToFloat(I_Faktor.Text); D := (Diff - D_Save) * StrToFloat(D_Faktor.Text); D_Save := Diff; F := P + I + D; |
Gute Ergebnisse hab ich durch P=100 I=0,90 und D=1000 erzielt.
Delphi-Quelltext
1: 2:
| QPC := GetTickCount(); dt := (QPC - QPC_OLD)/1000; |
Der berechnete Stellwert entspricht hier im Beispiel der Beschlunigung a:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| A := Stellwert / StrToFloat(M_Faktor.Text); V := V + A * t - V * K; if V > StrToFloat(V_Faktor.Text) then V := StrToFloat(V_Faktor.Text); if V < -StrToFloat(V_Faktor.Text) then V := -StrToFloat(V_Faktor.Text); Istwert := Istwert + V * t; |
V dann der Geschwingigkeit v und der Istwert ist der Weg s.
Der Anteil
V * K, der von der Geschwingkeit abgezogen wird antspricht einer einfachen geschwindigkeitsabhängigen Verzögerung. So kann ziemlich einfach eine Störgröße (wie im Realen) simuliert werden.
Zur Übersichtlichkeit der Bedienung oder sonstiges im Bezug auf das Design gebe ich keine Stellungnahme, da es sich hier bei um eine Beipsielsoftware handelt, wie man einen PID-Regler programmieren kann. Dies soll anregen und nicht das Layout
Ansonsten viel Spaß damit
Andreas
PS: Helfe bei Fragen bzgl. Regler gerne weiter.