Re: PID-Regler Kategorie: Programmierung (von guido - 9.12.2004 21:23) | ||
Als Antwort auf Re: PID-Regler von krassos - 8.12.2004 22:02 | ||
| ||
> > 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. > > Uff, > > ich werd mir mal Mühe geben, mich in das Konstrukt reinzudenken. > > > > > > > //[mal eben gelöscht wegen der übersichtlichkeit] > > > /*****************************************************************/ > > //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; > > > Die Parameter die du hie vorgibst, sind float. In der Funktion wird int erwartet. > Also übergibst Du hier 0. Division durch Null führt zum Absturz. > > > > > > > > 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 > > > Ich bin an meine Solarpumpe wie folgendermassen rangegangen: > Die Funktion hab ich auf excel-vba portiert und dann das ganze für statische, > von mir erwartete Soll- und Istwerte simuliert. > Daraus kannst Du zumindest die Ergebnisse des Reglers im statischen Betrieb abschätzen. > > > Ich hab grade eben noch ein Modul für die Sprungantwort gefunden: > > 'pid-testalgorithmus > 'versuchskonfiguration > ' ta= abtastzeit > 'tn=nachstellzeit (i-Anteil) > 'tv=vorhaltezeit (d-Anteil) > 'kp=proportionalbeiwert (p-Anteil) > > Sub testpid() > > es = 0 > ea = 0 > ea3 = 0 > w = Cells(9, 3).Value 'w steht in C9 (für Sprungantwort =1) > > tn = Cells(11, 3).Value 'tn in C11 > tv = Cells(12, 3).Value 'tv in C12 > kp = Cells(13, 3).Value 'kp in C13 > ta = 1 > > For t = 0 To 251 > x = Cells(t + 4, 7).Value 'Der Startwert für x steht in G4 (für sprungantwort =0) > 'x = Cells(t + 5, 7).Value > 'ta = t + 1 > e = w - x 'regelabweichung > es = es + (ea + e) / 2 'i-speicher > If e - ea > 0 Then > > kd = tv / ta * (e - ea) > > > Else: > If kd > 0.5 Then > > kd = kd * (1 - 1 / kd) > Else: kd = 0 > End If > End If > y = kp * (e + (ta / tn * es) + kd) > > ea = e > > > 'Hier werden ab Zeile 5 Ausgaben berechnet. Diese lassen sich sehr schön als Diagramm darstellen > ' und stellen das Reglerverhalten dar. Hier können sehr schön verschiedene Werte für > ' die Parameter simuliert werden > Cells(t + 5, 4).Value = y > Cells(t + 5, 5).Value = e > Cells(t + 5, 6).Value = ea > Cells(t + 5, 7).Value = Cells(t + 4, 7).Value + y > Next t > > End Sub > > > Gru� krassos > Danke für den Tip das mit der int habe ich im eifer gar nicht bemerkt (schäm) Das mit Exel ist ne gute Idee danke nochmal Mfg Guido | ||
Antwort schreiben Antworten: 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) |