Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, CC2-ReglerBoard, OSOPT V3.0
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)