Re: PID-Regler Kategorie: Programmierung (von krassos - 8.12.2004 22:02) | ||
Als Antwort auf Re: PID-Regler von guido - 8.12.2004 19:58 | ||
| ||
> 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 | ||
Antwort schreiben Antworten: 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) |