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

Re: PID-Regler Kategorie: Programmierung (von guido - 8.12.2004 19:58)
Als Antwort auf Re: PID-Regler von guido - 14.11.2004 17:06
Ich nutze:
CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
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.


//Pumpe 1
/******************************************************************/
/* 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
*/

//konstanten für die berechnungen
const two = 2.0;
const tree = 3.0;
const zero = 0.0;
const twox  = 2000.0;
// ******************************
float ea;
float es,kd;
long z1,z2;
string diff,integral,zeit;
float ta;
function pid1 (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 y>14999 or y<4499
{
if y>14999 y1=14999;
if y <4499 y1=4499;
if y <3000 y1=0;
}
ea = e;
return y1;
}





/*****************************************************************/
//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;


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

Mfg Guido


    Antwort schreiben


Antworten:

Re: PID-Regler (von krassos - 8.12.2004 22:02)
    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)