Timermodul Kategorie: Programmierung (von krassos - 12.11.2004 12:53) | ||
| ||
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) |