Re: PID-Regler Kategorie: Programmierung (von krassos - 7.03.2005 21:57) | ||
Als Antwort auf Re: PID-Regler von krassos - 7.03.2005 15:57 | ||
| ||
Hallo Guido, hier jetzt mal was (eben grade) getestetes: /******************************************************************/ /*********Mischeransteuerung***************************************/ /* */ /* Author : Andreas Sperling */ /* Vorlage : Andreas Sperling */ /* Version : 0.1 */ /* Datum : 07.05.2005 */ /* geändert : */ /* Getestet : ja */ /* */ /******************************************************************/ /* Mischer auf/zu auf Basis zweier Temperatursignale unter Verwendung eines PID-Moduls Aufgabe des Mischers ist die gesteuerte Entladung des Speichers und die Verringerung der Brennerschaltungen. Der Mischer ist im Rücklauf des Kessels angeordnet (AB-Anschlu�) Die beiden anderen Anschlüsse sind jeweils Heizkreisrücklauf und Speichermitte. Dadurch ermöglicht der Mischer eine Steuerung des Volumenstroms durch den Speicher. /*****************************************************/ //cap[2]-zugriff auf tempfuehler._ // Ausgänge: rbports.0(Relais1) -Umschaltung auf/zu // rbports.5 -Mischer aktiv int m1fuehrung,m1tn,m1tv,test; float m1kp; function m1reset() { int m1[5]; eeprom.readintarray(7,20,m1,5); m1fuehrung=m1[0]; m1tn=m1[1]; m1tv=m1[2]; m1kp=m1[3];m1kp=m1kp/10.0; } Diese Funktion versorgt den Thread mit den von Hand änderbaren Parametern. Das händle ich in meinem Projekt bis jetzt über einen Com-Thread, in dem ich alle Parameter via Hyperterminal in einen EEPROM schreibe. Nach jeder �nderung rufe ich einfach reset auf, wodurch der Thread ab diesem Moment mit den neuen Parametern arbeitet. thread rlmisch { int mrl,smi,hkrl,x,y; /* Init: Mischer fährt für 25 sec auf und dann für 160 sec zu. Damit wird Mischer sicher zu gefahren. */ m1reset(); rbports.set(2,1);rbports.set(5,0); sleep 25000; rbports.set(2,0); sleep 32750;sleep 32750;sleep 32750;sleep 32750;sleep 32750; rbports.set(5,1); //*/ x=0; loop { sleep 25000; wait cap.Capture(2); mrl=tempfuehler.mischrl();smi=tempfuehler.speichermitte(); hkrl=tempfuehler.hkrl(); cap.Release(2); /*Da ich nicht von dem Automatismus ausgehen kann, das ein bestimmter Anschlu� am Mischer immer kälter ist als der andere, habe ich am A- und B-Anschlu� jeweils einen Fühler. Je nachdem welcher wärmer und welcher kälter ist, entscheide ich nachfolgend über den Regelsinn. */ if hkrl>=smi //Kühlen. (Verlängern der Brennerlaufzeit) { yield; run 255; y=pid1.pid(mrl,m1fuehrung,m1tv,m1tn,m1kp); run 32;yield; } else //Heizen (Möglichst gleichmä�ige Nutzung evtl. Pufferwärme) { yield; run 255; y=pid1.pid(m1fuehrung,mrl,m1tv,m1tn,m1kp); run 32;yield; } test=y; //Variable nur für Anzeigezwecke auf Testlcd if math.abs(y)>1000 { if y<0 and x>0 { rbports.set(2,0);rbports.set(5,0); sleep math.abs(y); //Das sleep hier ist noch provisorisch rbports.set(5,1); } if y>0 and x<130000 { rbports.set(2,1);rbports.set(5,0); sleep y; //Das sleep hier ist noch provisorisch rbports.set(5,1); } x=x+y;if x<0 x=0;if x>130000 x=130000; } }} Ich verwende das PID-Modul Ver 0.4 vom 06. Juli 2004 mit folgenden Anpassungen: //**Stellwert*** y = kp * (e +(ta / tn * es) + kd); //stellwertsberechnung //y = kp * e +(ta / tn * es) + kd; if y>10000 or y<-10000 //Hier geändert { if y>10000 y1=10000; //Hier geändert if y <-10000 y1=-10000; //Hier geändert } else y1=y; ea = e;//Regelabweichung für nächsten Durchlauf speichern if ki2>10000 and es>ex es=ex; //Hier geändert if ki2<=-10000 es=-10000; //Hier geändert return y1; } Die �nderungen im PID-Modul beziehen sich nur auf die Skalierung von y. Es werden also Stellzeiten von -10s (Richtung Mischer zu) bis +10s (Mischer auf) ausgegeben. Die Gesamtstellzeit für 90° Beträgt bei mir 125s. Als Parameter für PID habe ich folgendes: (noch nicht optimal bei mir) tn=200 tv=200 kp=6.5 Gru� krassos | ||
Antwort schreiben Antworten: 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) |