Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hier eine etwas geänderte Version der function: ( ein paar erläuternde Worte nachfolgend) > > <code> > /******************************************************************/ > /* 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; > } > </code> > > 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: > > <code> > 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; > > > > } > </code> > > 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.