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

Timermodul Kategorie: Programmierung (von krassos - 12.11.2004 12:53)
Ich nutze:
C-Control II Unit, CC2-ReglerBoard, OSOPT V3.0
Hallo Community,

hab mal wieder 'n bischen Hirnschmalz zu veröffentlichen. Kann sein das es keiner braucht.

Ich wollt einfach nur mal 'n Timer der so simpel funktioniert wie bei 'ner SPS.
Kommentare und Verbesserungen ausdrücklich erwünscht, sofern jemand diese Fuction zum
Einsatz bringt.

mfg krassos


/*******************************************************************************/
/* Universaltimer                                                              */
/* Autor     : Andreas Sperling                                                */
/* Vorlage   :                                                                 */
/* Version   : 1.0                                                             */
/* Datum     : 12. November 2004                                               */
/* Getestet  : ja                                                              */
/* Benötigt  : system.c2; constant.c2
/* Bemerkungen: Function verwaltet 11 Timer (Nummer 0...10)
                Kann für allgemeine Verzögerungesaufgaben verwendet werden
/******************************************************************
Universaltimer auf Basis des Systemtimers im Millisekundentakt

Rückgabewert=timerstatus

Parameter:
          num.......timernummer
          start.....wenn gesetzt, wird startzeit gespeichert
          res.......setzt status auf 0
          time......Laufzeit in Millisekunden
/****************************************************************************/


long t[10];               //speicher für startzeit
int state[10];            //speicher für status

function t_v(int num,int start,int res,long time) returns int
{
long t1,t2;
t1=system.timer();       //aktuelle zeit speichern
if start
   {                     //wenn start gesetzt, zeit speichern
   t[num]=t1;            //und status setzen
   state[num]=constant.on;
   }
t2=math.labs(t1-t[num]);                     //absolutdifferenzbildung
if t2 > time state[num]=constant.off;        //zeitüberprüfung
if res state[num]=constant.off;              //reset wenn res
return state[num];
}


Und so binde ich den Timer zur Zeit ein:

(vorläufig funktionsfähiges Modul, welches laufend erweitert wird:)
Hier sieht man auch, wie ich meinen PID-Regler momentan betreibe.


/*************************************************************************
Modul zur Ansteuerung einer Solarumwälzpumpe
*/


//variablen
int scale,p1init,p1pumpenstart,p1pumpenfuehrung,
    p1pumpenstop,p1tn,p1tv,p1min,p1y,kollmax,p1state;
float p1kp;

function p1reset(){
int p1[8];
eeprom.readintarray(7,0,p1,8);
p1init=p1[0];
p1pumpenstart=p1[1];
p1pumpenfuehrung=p1[2];
p1pumpenstop=p1[3];
p1tn=p1[4];
p1tv=p1[5];
p1kp=p1[6];p1kp=p1kp/10.0;
p1min=p1[7];
plm.settimebase(0,4);
plm.setperiod(0,p1init);plm.out(0,0);
scale=(p1init-p1min)/1000;
}


thread pumpe{
//variablen
int kollektor,VL,RL,speicherunten,t1,s1,s2,s3,s4,
    y,x,m1,m2;

//initialisierungen
p1reset();
plm.settimebase(0,4);
plm.setmode(0,plm.PORT_DIGITAL);
plm.setperiod(0,p1init);plm.out(0,0);
if p1tn==constant.FALSE p1tn=1;
p1state=constant.off;
m1=constant.off;
loop
{

sleep 1450;

wait cap.Capture(2);
kollektor=tempfuehler.solkollektor();
VL=tempfuehler.solvl();
RL=tempfuehler.solrl();
speicherunten=tempfuehler.speicherunten();
cap.Release(2);
if kollektor-speicherunten>=p1pumpenstart p1state=constant.on;
if system.hour()>8 and system.hour()<16 and ! timer.t_v(2,0,0,600000)
   {if ! p1state
       {
        p1state=constant.on;
        timer.t_v(2,-1,0,600000);
       }
   }
if kollektor-speicherunten<p1pumpenstop and p1state
   {
   if  ! s1 {timer.t_v(0,-1,0,30000);s1=constant.on;}
   p1state=timer.t_v(0,0,0,30000);
   m1=p1state;
   }
   else s1=constant.off;
/*
if RL>VL or RL>1000 or speicherunten>850
   {
   if  ! s2 {timer.t_v(1,-1,0,30000);s2=constant.on;}
   p1state=timer.t_v(1,0,0,30000);
   m1=p1state;
   }
   else s2=constant.off;
*/

if p1state != m1 {m1=p1state;pid.es=500;} //pumpenstart mit erhöhter Drehzahl

if p1state
   {
/******************
kollektor=tempfuehler.solvl();speicherunten=tempfuehler.solrl();
/*********************/

   x=kollektor-speicherunten;
   p1y=pid.pid(x,p1pumpenfuehrung,p1tv,p1tn,p1kp);
   plm.out(0,p1y*scale+p1min-1);
   }
else
   {
   p1y=0;plm.out(0,0);
   pid.ea=constant.FALSE;pid.es=constant.FALSE;pid.kd=constant.FALSE;
   }
}}


    Antwort schreiben


Antworten:

Re: Timermodul (von Thomas - 12.11.2004 21:38)
    Re: Timermodul (von reneforster - 12.11.2004 21:59)
        Re: Timermodul (von Thomas - 14.11.2004 23:13)
        Re: Timermodul (von krassos - 13.11.2004 7:42)