
| 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: | ||