Re: PID-Regler Kategorie: Programmierung (von krassos - 3.07.2004 22:32) | ||
Als Antwort auf Re: PID-Regler von krassos - 2.07.2004 23:09 | ||
| ||
Hier eine etwas geänderte Version der function: ( ein paar erläuternde Worte nachfolgend) /******************************************************************/ /* PID-Regler /* /* Author : Andreas Sperling /* Vorlage : Andreas Sperling /* Version : 0.4 /* Datum : 29. Juni 2004 /* geändert : 03. Juli 2004 /* Getestet : ja /* Benötigt : /* /******************************************************************/ /* Geändert: I-Anteil arbeitet nur innerhalb des Proportionalbandes Dadurch wird die �berschwingweite bei grossen Führungssprüngen oder grossen Störgrössen verringert. Geändert: Abtastzeit ta wird innerhalb der function berechnet. */ /* w Sollwert x istwert ta abtastzeit tv vorhaltezeit (D-Anteil) tn nachstellzeit (i-anteil) kp proportionalanteil */ //konstanten für die berechnungen const two = 2.0; const tree = 3.0; const zero = 0.0; const twox = 2000.0; // ****************************** float ea; float es,kd; long z1,z2; string diff,integral,zeit; float ta; function pid (int w,int x,int tv,int tn,float kp) returns int { int y1;float e,y,diff1; z1=system.timer(); ta=(z1-z2);ta=ta/twox;z2=z1;if ta<0.1 or ta>20.0 ta=1.0; //Abtastzeitermittlung e = w - x;//regelabweichung if kp*e<500 es = es + ((ea + e) / two);else es=0.01; //i-speicher diff1=e-ea; kd = (kd+tv / ta * diff1)/two; //D-anteilsberechnung und d-Anteil ausklingen y = kp * (e +(ta / tn * es) + kd); //stellwertsberechnung y1=y; if y>500 or y<0 { if y>500 y1=500; if y <0 y1=0; } ea = e; //*****************************// //kontrollanzeigen für den experimentellen betrieb str.putfloatf(integral,ta / tn * es,3);str.putfloatf(diff,kd,3); rblcd.clear(); rblcd.print(diff);rblcd.print(" "); rblcd.line(2);rblcd.print(integral);integral="";diff=""; //*****************************// return y1; } Also das Programm rundherum hängt natürlich stark von der Regelaufgabe ab. Zu den Parametern: w- INT - hier wird der Sollwert übergeben. Das int-format sollte bei den meisten aufgaben genügen. x - int - hier wird der (gemessene) Istwert der Regelstrecke übergeben. Bei einer einfachen Temperaturregelung wäre x also die aktuelle Temperatur und w die Solltemperatur. Bei einer anspruchsvolleren Solarkollektorpumpe wäre w die Differenztemperatur Kollektor-Speicher und x die Kollektortemperatur. Der Rückgabewert kann direkt in eine entsprechende PLM-Ansteuerung weitergereicht werden. Für einen quasistetigen Temperaturregler reicht als Ausgang ein Digitalausgang. Mein quasistetigregler hab ich im Test mal so gestaltet: int m2,y; thread tick { loop { sleep 40; regel.m2 = regel.m2 + 1; if regel.m2 > 500 regel.m2 = 0; } } function raum1(int w,int x) { int tv,tn; float kp; tv=2;tn=110;kp=30; y=pidtest.pid(w,x,tv,tn,kp); if y>m2 rbports.set(2,1); else rbports.set(2,0); } thread main { run tick; } tv -float- Vorhaltezeit definiert die grö�e des d-Anteils im regler. je grö�er, um so stärkere Reaktion des d-Anteils. Abschalten durch tv=0. tn-float- nachstellzeit. definiert den I-Anteil im regler. Je kleiner, um so stärker wirkt der I-Anteil. abschalten durch sehr gro�e Werte. tv und tn sind auf sekunden normiert (durch die ta berechnung innerhalb der function). kp-float- definiert den Proportionalanteil im regler. Eine Einstellung der Parameter von Hand erfordert etwas Gefühl und beobachtung der einzelnen Anteile im Regler. Richtwerte kann man wie folgt berechnen: tu bezeichne die Totzeit der Regelstrecke. Als Totzeit bezeichnet man die Summe aller Zeiten vom anlegen eines Eingangssignals (beispiel heizung an) bis zu einer Reaktion der Regelstrecke ( beispiel messwert am Temperaturfühler beginnt zu steigen) tg bezeichne die Ausgleichszeit der Strecke. Die Ausgleichszeit ist die Zeit von der ersten Reaktion bis zum erreichen des endwerts (bzw. dessen nähe). Die Ausgleichszeit beginnt also nach der Totzeit. Jetzt die Regelparameter: Recht brauchbare Werte kann man mit folgender Formel berechnen: kp=0,6...0.95*tg/tu tv=0,2...0,5*tu tn=1...5*tu Viel Spass beim probieren. krassos PS: Die praktische Einstellung der Parameter erfordert geduld und Spucke. Im Einzelfall würde ich das aber gern hier diskutieren. | ||
Antwort schreiben Antworten: Re: PID-Regler (von guido - 9.11.2004 18:35) Re: PID-Regler (von krassos - 9.11.2004 18:56) Re: PID-Regler (von guido - 9.11.2004 20:49) Re: PID-Regler (von krassos - 10.11.2004 7:54) Re: PID-Regler (von guido - 10.11.2004 20:21) Re: PID-Regler (von krassos - 11.11.2004 7:48) Re: PID-Regler (von guido - 11.11.2004 19:38) Re: PID-Regler (von krassos - 12.11.2004 19:19) Re: PID-Regler (von guido - 12.11.2004 20:40) Re: PID-Regler (von krassos - 12.11.2004 20:55) Re: PID-Regler (von guido - 14.11.2004 17:06) Re: PID-Regler (von guido - 8.12.2004 19:58) Re: PID-Regler (von krassos - 8.12.2004 22:02) Re: PID-Regler (von guido - 9.12.2004 21:23) Re: PID-Regler (von krassos - 9.12.2004 21:48) Re: PID-Regler (von Guido - 1.03.2005 17:46) Re: PID-Regler (von krassos - 7.03.2005 15:57) Re: PID-Regler (von krassos - 7.03.2005 21:57) Re: PID-Regler (von guido - 10.03.2005 17:37) Re: PID-Regler (von guido - 13.03.2005 14:55) Re: PID-Regler (von krassos - 16.03.2005 21:41) Re: PID-Regler (von krassos - 8.04.2005 17:34) Re: PID-Regler (von Guido - 13.04.2005 21:21) Re: PID-Regler (von krassos - 14.04.2005 5:01) Re: PID-Regler (von Guido - 14.04.2005 19:50) Re: PID-Regler (von guido - 9.11.2004 18:48) |