typedef struct{ unsigned char AktueleAufgabe; unsigned char AusgangStellPlus; unsigned char AusgangStellMinus; unsigned short ImpulsZeit; unsigned short WarteZeitNachImpuls; short DiffSollIstAlt; unsigned short MinZeitTest; }typdef_Mischer; /*Mischer für Heizung steuern*/ void MischerSteuern(short SollTemperatur,short IstTemperatur, char MitHandSteuern,typdef_Mischer *Mischer) { short DiffSoll_Ist; unsigned short DiffSoll_IstAbsolut; unsigned long DiffMalVerstaerkung; #define ToteZone 10 #define Kp_Verstaerkung 256 #define MaxZeit 1200 #define MinZeit 5 #define WarteZeit 150 if(FirstFlag) { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus = 0; Mischer->AktueleAufgabe=0; return; } if(MitHandSteuern) { if(MitHandSteuern>0) { Mischer->AusgangStellPlus = 1; Mischer->AusgangStellMinus = 0; } else { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus = 1; } Mischer->AktueleAufgabe=0; return; } if(Flanke100Ms ) { DiffSoll_Ist= SollTemperatur-IstTemperatur; if(DiffSoll_Ist>=0) DiffSoll_IstAbsolut=DiffSoll_Ist; else DiffSoll_IstAbsolut=-DiffSoll_Ist; switch(Mischer->AktueleAufgabe) { case 0: if(DiffSoll_IstAbsolut<=ToteZone) { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus = 0; return; } DiffMalVerstaerkung=(DiffSoll_IstAbsolut*(unsigned long)Kp_Verstaerkung)>>8; if(DiffMalVerstaerkung>=MaxZeit) { Mischer->ImpulsZeit=MaxZeit; } else if(DiffMalVerstaerkung<=MaxZeit) { Mischer->ImpulsZeit=MinZeit; } else { Mischer->ImpulsZeit=DiffMalVerstaerkung; } if(DiffSoll_Ist<0) { Mischer->AusgangStellPlus = 1; Mischer->AusgangStellMinus =0; } else { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus =1; } Mischer->WarteZeitNachImpuls=WarteZeit; Mischer->DiffSollIstAlt=DiffSoll_Ist; Mischer->MinZeitTest=MinZeit; Mischer->AktueleAufgabe=1; break; case 1: if(Mischer->ImpulsZeit) --Mischer->ImpulsZeit; if(!Mischer->ImpulsZeit) { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus = 0; Mischer->AktueleAufgabe=2; } if(Mischer->MinZeitTest) --Mischer->MinZeitTest; if(!Mischer->MinZeitTest) { if((((Mischer->DiffSollIstAlt^DiffSoll_Ist)<0))||(DiffSoll_IstAbsolut<=ToteZone)); { Mischer->AusgangStellPlus = 0; Mischer->AusgangStellMinus = 0; Mischer->AktueleAufgabe=2; // 0 ???? } } break; case 2: if(Mischer->WarteZeitNachImpuls) --Mischer->WarteZeitNachImpuls; if( ((((Mischer->DiffSollIstAlt^DiffSoll_Ist)<0))||(DiffSoll_IstAbsolut<=ToteZone)) || (!Mischer->WarteZeitNachImpuls) ) Mischer->AktueleAufgabe=0; break; } } }