Re: PID-Regler Kategorie: Programmierung (von guido - 8.12.2004 19:58) | ||
Als Antwort auf Re: PID-Regler von guido - 14.11.2004 17:06 | ||
| ||
Hallo ich habe versucht den PID-Regler von Krassos als Regler für meine Kesselkreispumpe einzusetzen. Leider bleibt die Unit immer hängen wenn ich den Regler starte und ich weis nicht warum. ich habe für die Werte tv und tn erstmal 0.1 eingesetzt als ausgang sozusagen. dann habe ich für kp 0.01 eingesetzt ist das io ??? ich denke ich poste mal den Code dann kann man sich das leichter vorstellen. //Pumpe 1 /******************************************************************/ /* 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 pid1 (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 y=y*(-1); //wert invertieren y1=y; if y>14999 or y<4499 { if y>14999 y1=14999; if y <4499 y1=4499; if y <3000 y1=0; } ea = e; return y1; } /*****************************************************************/ //Pumpe 2 /******************************************************************/ /* 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 */ function pid2 (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 y=y*(-1); //wert invertieren y1=y; if tempaus.value[4]>700 y=14999; if y>14999 or y<4499 { if y>14999 y1=14999; if y <4499 y1=4499; if y <3000 y1=0; } ea = e; return y1; } //--------------------------------------------------------------------------- //init und ausgabe der PWM ports //--------------------------------------------------------------------------- int pid[5],out,out2; float d[2]; //************ thread main //************ { pid[0]=0.1; pid[1]=0.1; pid[2]=0.1; pid[3]=0.1; d[0]=0.01; d[1]=0.01; plm.settimebase(0,5); plm.settimebase(1,5); plm.setmode(0,0); plm.setmode(1,0); plm.setperiod(0,15000); plm.setperiod(1,15000); plm.out(0,-1); plm.out(1,-1); loop { out=pid1(500,tempaus.value[0],pid[0],pid[1],d[0]); if regelung3.oelp==1 plm.out(0,out); else plm.out(0,0); out2=pid2(600,tempaus.value[4],pid[2],pid[3],d[1]); if regelung3.holzp==1 plm.out(1,out2); else plm.out(1,0); } } //--------------------------------------------------------------------------- Die Invertierung erfolgt weil ich einen Festen Sollwert für den Kessel vorgeben möchte. Um Kondensat zu vermeiden einmal bei K1 50.0°C und bei K2 60.0°C und da venn der vorgabe Wert grö�er als der Istwert ist die Pumpe laufen soll habe ich das Signal Invertert das ist alles. Ich hoffe Ihr könnt helfen Mfg Guido | ||
Antwort schreiben Antworten: 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) |