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 | }
|