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 ! > 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. > > <Code> > //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); > > } > } > //--------------------------------------------------------------------------- > > </Code> > 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