
| Re: PID-Regler Kategorie: Programmierung (von krassos - 16.03.2005 21:41) | ||
| Als Antwort auf Re: PID-Regler von guido - 13.03.2005 14:55 | ||
| ||
|
> Hallo Krassos, > > kansst du mir bitte sagen wo du den parameter > if ki2>10000 and es>ex es=ex; //Hier geändert > if ki2<=-10000 es=-10000; //Hier geändert > > vereinbart hast und berechnest ich kann leider auch im pid Programm nichts finden > > danke > > Mfg Guido Kein Problem, ich poste einfach nochmal das kpl. PID-Modul in der aktuell für den Mischer verwendeten Fassung. Mein gröÃ?tes Problem bisher war die Stellzeit des Mischers und damit die Regelträgheit richtig zu berücksichtigen. Meine aktuellen Regelparameter sind wie folgt: Abtastzeit ca 30sec.; d.h. alle ca 30sec wird PID aufgerufen. tn=250 groÃ?er Wert, weil Reaktionsträges System (GröÃ?ere Werte verringern den Integralanteil) Tv=350 GroÃ?er Wert Erhöht den Differentialanteil, Notwendig, um schon beim Anzeichen einer Temperaturänderung einen Stellwert zu generieren. Beispiel: Sollwert 37°C Istwert: 38°C Tendenz fallend generiert ein Signal: Mischer auf, obwohl Der Istwert gröÃ?er als der Sollwert ist. kp=180 Für kp hab ich eine Dynamisierung bei mir eingefügt (Im Mischer Thread). Damit mache ich kp von der Differenztemperatur an den Mischereingängen abhängig. Dahinter steht folgender Gedanke: Bei einem groÃ?en Temperaturunterschied zwischen den Mischereingängen genügt ein kleinerer Regelschritt, ein kleiner Temperaturunterschied erfordert natürlich einen gröÃ?eren Regelschritt. //****************************** float ea; float es,kd; long z2; function pid (int w,int x,int tv,int tn,float kp) returns int { //Bedingungen: tn>0 long z1; float e,y,diff1,ki1,ki2,ta,ex; int y1; //**Abtastzeit**** z1=system.timer(); ta=(z1-z2);ta=ta/constant.tx;z2=z1;if ta<0.01 ta=0.01; //Abtastzeitermittlung //**Regelabweichung*** e = w - x; //regelabweichung //**I-Anteil*** ex=es;ki1=kp*e; //ki2=kp*ta/tn*es+ki1; ki2=kp*ta/tn*es+ki1; es = es + ((ea + e) / constant.two);//else es=zero; //i-speicher //**D-Anteil*** diff1=e-ea; kd = (kd+tv / ta * diff1)/constant.two; //D-anteilsberechnung und d-Anteil ausklingen //**Stellwert*** y = kp * (e +(ta / tn * es) + kd); //stellwertsberechnung //y = kp * e +(ta / tn * es) + kd; if y>19000 or y<-19000 { if y>19000 y1=19000; if y <-19000 y1=-19000; } else y1=y; ea = e;//Regelabweichung für nächsten Durchlauf speichern if ki2>10000 and es>ex es=ex; if ki2<=-10000 and es<ex es=ex; return y1; } | ||
Antwort schreiben Antworten: | ||