Mischer.c


1
typedef struct{
2
                  unsigned char AktueleAufgabe;
3
                  unsigned char AusgangStellPlus;
4
                  unsigned char AusgangStellMinus;
5
                  unsigned short ImpulsZeit;
6
                  unsigned short WarteZeitNachImpuls;
7
                  short DiffSollIstAlt;
8
                  unsigned short MinZeitTest;
9
                  }typdef_Mischer;
10
/*Mischer für Heizung steuern*/
11
void MischerSteuern(short SollTemperatur,short IstTemperatur, char MitHandSteuern,typdef_Mischer *Mischer)
12
{
13
 short DiffSoll_Ist;
14
 unsigned short DiffSoll_IstAbsolut;
15
 unsigned long DiffMalVerstaerkung;
16
 #define ToteZone 10
17
 #define Kp_Verstaerkung   256
18
 #define MaxZeit 1200
19
 #define MinZeit 5
20
 #define WarteZeit 150
21
22
    if(FirstFlag)
23
    {
24
      Mischer->AusgangStellPlus = 0;
25
      Mischer->AusgangStellMinus = 0;
26
      Mischer->AktueleAufgabe=0;
27
     return;
28
    }
29
    if(MitHandSteuern)
30
    {
31
       if(MitHandSteuern>0)
32
       {
33
        Mischer->AusgangStellPlus = 1;
34
        Mischer->AusgangStellMinus = 0;
35
       }
36
       else
37
        {
38
        Mischer->AusgangStellPlus = 0;
39
        Mischer->AusgangStellMinus = 1;
40
       }
41
       Mischer->AktueleAufgabe=0;
42
      return;
43
    }
44
  if(Flanke100Ms )
45
  {
46
47
   DiffSoll_Ist= SollTemperatur-IstTemperatur;
48
   if(DiffSoll_Ist>=0)
49
      DiffSoll_IstAbsolut=DiffSoll_Ist;
50
   else
51
    DiffSoll_IstAbsolut=-DiffSoll_Ist;
52
      switch(Mischer->AktueleAufgabe)
53
      {
54
      case 0:
55
       if(DiffSoll_IstAbsolut<=ToteZone)
56
       {
57
         Mischer->AusgangStellPlus = 0;
58
         Mischer->AusgangStellMinus = 0;
59
         return;
60
       }
61
       DiffMalVerstaerkung=(DiffSoll_IstAbsolut*(unsigned long)Kp_Verstaerkung)>>8;
62
       if(DiffMalVerstaerkung>=MaxZeit)
63
       {
64
          Mischer->ImpulsZeit=MaxZeit;
65
       }
66
       else if(DiffMalVerstaerkung<=MaxZeit)
67
       {
68
          Mischer->ImpulsZeit=MinZeit;
69
       }
70
       else
71
       {
72
         Mischer->ImpulsZeit=DiffMalVerstaerkung;
73
       }
74
75
         if(DiffSoll_Ist<0)
76
         {
77
           Mischer->AusgangStellPlus = 1;
78
           Mischer->AusgangStellMinus =0;
79
         }
80
         else
81
         {
82
           Mischer->AusgangStellPlus = 0;
83
           Mischer->AusgangStellMinus =1;
84
         }
85
           Mischer->WarteZeitNachImpuls=WarteZeit;
86
           Mischer->DiffSollIstAlt=DiffSoll_Ist;
87
           Mischer->MinZeitTest=MinZeit;
88
           Mischer->AktueleAufgabe=1;
89
      break;
90
91
      case 1:
92
          if(Mischer->ImpulsZeit)
93
           --Mischer->ImpulsZeit;
94
          if(!Mischer->ImpulsZeit)
95
          {
96
                Mischer->AusgangStellPlus = 0;
97
                Mischer->AusgangStellMinus = 0;
98
                Mischer->AktueleAufgabe=2;
99
          }
100
101
          if(Mischer->MinZeitTest)
102
            --Mischer->MinZeitTest;
103
          if(!Mischer->MinZeitTest)
104
          {
105
            if((((Mischer->DiffSollIstAlt^DiffSoll_Ist)<0))||(DiffSoll_IstAbsolut<=ToteZone));
106
            {
107
                Mischer->AusgangStellPlus = 0;
108
                Mischer->AusgangStellMinus = 0;
109
                Mischer->AktueleAufgabe=2;  // 0 ????
110
            }
111
112
          }
113
114
      break;
115
116
      case 2:
117
         if(Mischer->WarteZeitNachImpuls)
118
            --Mischer->WarteZeitNachImpuls;
119
          if(  ((((Mischer->DiffSollIstAlt^DiffSoll_Ist)<0))||(DiffSoll_IstAbsolut<=ToteZone)) ||  (!Mischer->WarteZeitNachImpuls) )
120
                Mischer->AktueleAufgabe=0;
121
      break;
122
123
      }
124
  }
125
}