81a573b8108e2b3319d556478a7883edf743cf9d
howto/come_gestire_dati_fissi/esempio_reale.md
... | ... | @@ -0,0 +1,253 @@ |
1 | +Il seguente programma è di un progetto reale in cui occorreva definire due tipi di strutture dati. |
|
2 | + |
|
3 | +Più avanti troverai anche la parte nello **start.c**. |
|
4 | + |
|
5 | +Il codice è stato scritto in un file chiamato **"ricettario.h"** che è stato incluso nel common. |
|
6 | + |
|
7 | + // ------------------------------------"ricettario.h"------------------------------------ // |
|
8 | + #define numeroRicetteMax 10 |
|
9 | + #define coeffDecimali 1000 // ogni decimale è un x10 (quindi 3 decimali equaivale a 1000) |
|
10 | + #define minutiAvvertimento 30 |
|
11 | + #define decimiAttesa 2 |
|
12 | + |
|
13 | + char pathProg[15] = "C:\\MW30632.fis"; // array relativo al file della prima serie di dati fissi |
|
14 | + char pathAll[15] = "C:\\Allarm.fis"; // array relativo al file della seconda serie di dati fissi |
|
15 | + |
|
16 | + // funzioni prima serie di dati fissi |
|
17 | + void carica_fissiRic(void); |
|
18 | + char salva_fissiRic(void); |
|
19 | + void reset_fissiRic(void); |
|
20 | + |
|
21 | + // primo tipo di struttura dati |
|
22 | + typedef struct datifissiRic |
|
23 | + { |
|
24 | + U16 first_time_df; // condizione di primo avvio |
|
25 | + |
|
26 | + unsigned char tipoLavoro_dfRic; // 0 modalità start/stop - 1 modalità ciclo aperto/chiuso |
|
27 | + unsigned char livelloAperturaY2_dfRic; // percentuale di apertura della valvola Y2 durante il normale esercizio |
|
28 | + unsigned char ritardoAperturaY2_dfRic; // ritardo apertura valvola di Y2 nella fase di start |
|
29 | + unsigned char pressioneMinima_dfRic; // pressione minima aria |
|
30 | + unsigned char pressioneMassima_dfRic; // pressione massima aria |
|
31 | + unsigned char livelloChiusuraY2_dfRic; // percentuale apertura valvola Y2 durante pulizia impianto in fase di stop |
|
32 | + unsigned char ritardoChiusuraY1Y3_dfRic; // ritardo chiusura valvole Y1 e Y3 |
|
33 | + |
|
34 | + // dalità ciclo |
|
35 | + char selLivelli_ric[numeroRicetteMax]; // numero ionizzatori attivi |
|
36 | + char modaLavoro_ric[numeroRicetteMax]; // 0 ciclo aperto - 1 ciclo chiuso |
|
37 | + unsigned char powerTimerEnable_dfRic[numeroRicetteMax]; // abilitazione fascia oraria |
|
38 | + unsigned long int powerOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata |
|
39 | + unsigned long int powerOff_dfRic[numeroRicetteMax]; // orari di spegnimento |
|
40 | + unsigned long int TOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata |
|
41 | + unsigned long int TOff_dfRic[numeroRicetteMax]; // orari di spegnimento |
|
42 | + |
|
43 | + // modalità start stop |
|
44 | + char selLivello_dfRic; // numero ionizzatori attivi |
|
45 | + |
|
46 | + // tipo macchina |
|
47 | + unsigned char tipoMacchina_dfRic; // 0 = versione expensive , 1 = versione cheap |
|
48 | + |
|
49 | + // linearizzazione pressostato |
|
50 | + char P_max_dfRic; |
|
51 | + char P_min_dfRic; |
|
52 | + long int V_max_dfRic; |
|
53 | + long int V_min_dfRic; |
|
54 | + |
|
55 | + // ore utilizzo |
|
56 | + long int oreLavorate1_Ric; |
|
57 | + long int oreLavorate2_Ric; |
|
58 | + long int oreLavorate3_Ric; |
|
59 | + long int oreSoglia1_Ric; |
|
60 | + long int oreSoglia2_Ric; |
|
61 | + long int oreSoglia3_Ric; |
|
62 | + long int oreMax1_Ric; |
|
63 | + long int oreMax2_Ric; |
|
64 | + long int oreMax3_Ric; |
|
65 | + |
|
66 | + // warnings |
|
67 | + unsigned char tensioneAria_warning_Enable_Ric; |
|
68 | + unsigned char alimentazioneIonizzatori_warning_Enable_Ric; |
|
69 | + unsigned char tensioneMinMax_warning_Enable_Ric; |
|
70 | + unsigned char sicurezzaPorta_warning_Enable_Ric; |
|
71 | + unsigned char presenzaAcquaSerbatoio_warning_Enable_Ric; |
|
72 | + unsigned char OnOffRemoto_warning_Enable_Ric; |
|
73 | + unsigned char presenzaAria_warning_Enable_Ric; |
|
74 | + |
|
75 | + unsigned char Giorno_dfRic[numeroRicetteMax][7]; |
|
76 | + |
|
77 | + unsigned char superadmin_password_Ric[32]; |
|
78 | + unsigned char manutentore_password_Ric[32]; |
|
79 | + } datifissiRic __attribute__ ((PACKET)); |
|
80 | + |
|
81 | + // dichiara una struttura dati dfRic |
|
82 | + datifissiRic dfRic; |
|
83 | + |
|
84 | + // dichiara il file che servirà nelle funzioni |
|
85 | + FILE *fpRic; |
|
86 | + |
|
87 | + // funzione di caricamento dati della prima serie di dati fissi |
|
88 | + void carica_fissiRic(void) |
|
89 | + { |
|
90 | + fpRic = fopen(pathProg, "r"); // apertura di pathProg in modalità lettura in fpRic |
|
91 | + |
|
92 | + if (fpRic == 0) // se fpRic == 0 --> l' operazione fopen non ha avuto successo |
|
93 | + reset_fissiRic(); // resetta i dati con i valori di default |
|
94 | + |
|
95 | + fread(&dfRic, sizeof(dfRic), 1, fpRic); // legge i valori dei dati in fpRic e li carica in dfRic |
|
96 | + fclose(fpRic); // chiude fpRic |
|
97 | + } |
|
98 | + |
|
99 | + // funzione di salvataggio dati relativo alla prima serie di dati |
|
100 | + char salva_fissiRic(void) |
|
101 | + { |
|
102 | + dfRic.first_time_df = 0xAAAA; // condizione di primo avvio, servirà in start.c |
|
103 | + |
|
104 | + fpRic = fopen(pathProg,"w"); // apertura di pathProg in modalità scrittura |
|
105 | + |
|
106 | + if (fpRic == 0) // se fpRic == 0 --> fopen non ha avuto successo |
|
107 | + return 0; |
|
108 | + |
|
109 | + fwrite(&dfRic, sizeof(dfRic), 1, fpRic); // scrive i valori dei dati fissi da dfRic in fpRic |
|
110 | + fclose(fpRic); // chiude fpRic |
|
111 | + return 1; |
|
112 | + } |
|
113 | + |
|
114 | + // funzione di reset relativa alla prima serie di dati |
|
115 | + void reset_fissiRic(void) |
|
116 | + { |
|
117 | + // i valori vengono resettati impostando i valori di default |
|
118 | + int i; |
|
119 | + for (i = 0 ; i < numeroRicetteMax ; i++) { |
|
120 | + dfRic.selLivelli_ric[i] = 1; |
|
121 | + dfRic.modaLavoro_ric[i] = 0; |
|
122 | + dfRic.powerTimerEnable_dfRic[i] = 0; |
|
123 | + dfRic.powerOn_dfRic[i] = 0; |
|
124 | + dfRic.powerOff_dfRic[i] = 0; |
|
125 | + dfRic.TOn_dfRic[i] = 0; |
|
126 | + dfRic.TOff_dfRic[i] = 0; |
|
127 | + int j; |
|
128 | + for (j = 0 ; j < 7 ; j++) { |
|
129 | + dfRic.Giorno_dfRic[i][j] = 0; |
|
130 | + } |
|
131 | + } |
|
132 | + |
|
133 | + dfRic.tipoLavoro_dfRic = 0; |
|
134 | + dfRic.livelloAperturaY2_dfRic = 5; |
|
135 | + dfRic.ritardoAperturaY2_dfRic = 5; |
|
136 | + dfRic.pressioneMinima_dfRic = 9; |
|
137 | + dfRic.pressioneMassima_dfRic = 15; |
|
138 | + dfRic.livelloChiusuraY2_dfRic = 60; |
|
139 | + dfRic.ritardoChiusuraY1Y3_dfRic = 20; |
|
140 | + dfRic.selLivello_dfRic = 1; |
|
141 | + dfRic.tipoMacchina_dfRic = 1; |
|
142 | + dfRic.P_max_dfRic = 100; |
|
143 | + dfRic.P_min_dfRic = 0; |
|
144 | + dfRic.V_max_dfRic = 5000; |
|
145 | + dfRic.V_min_dfRic = 1620; |
|
146 | + dfRic.oreLavorate1_Ric = 0; |
|
147 | + dfRic.oreLavorate2_Ric = 0; |
|
148 | + dfRic.oreLavorate3_Ric = 0; |
|
149 | + dfRic.oreSoglia1_Ric = 3500; |
|
150 | + dfRic.oreSoglia2_Ric = 3500; |
|
151 | + dfRic.oreSoglia3_Ric = 3500; |
|
152 | + dfRic.oreMax1_Ric = 4000; |
|
153 | + dfRic.oreMax2_Ric = 4000; |
|
154 | + dfRic.oreMax3_Ric = 4000; |
|
155 | + dfRic.tensioneAria_warning_Enable_Ric = 1; |
|
156 | + dfRic.alimentazioneIonizzatori_warning_Enable_Ric = 1; |
|
157 | + dfRic.tensioneMinMax_warning_Enable_Ric = 1; |
|
158 | + dfRic.sicurezzaPorta_warning_Enable_Ric = 1; |
|
159 | + dfRic.presenzaAcquaSerbatoio_warning_Enable_Ric = 1; |
|
160 | + dfRic.OnOffRemoto_warning_Enable_Ric = 1; |
|
161 | + dfRic.presenzaAria_warning_Enable_Ric = 1; |
|
162 | + |
|
163 | + snprintf(dfRic.superadmin_password_Ric, sizeof(dfRic.superadmin_password_Ric), "1018"); |
|
164 | + snprintf(dfRic.manutentore_password_Ric, sizeof(dfRic.manutentore_password_Ric), "118"); |
|
165 | + |
|
166 | + // salva i dati impostati con i valori di default |
|
167 | + salva_fissiRic(); |
|
168 | + } |
|
169 | + |
|
170 | + |
|
171 | + // ----------------------- |
|
172 | + // gestione elenco allarmi |
|
173 | + // ----------------------- |
|
174 | + |
|
175 | + #define allarmiMax 100 |
|
176 | + |
|
177 | + // tipo di struttura dati relativa alla seconda serie di dati fissi |
|
178 | + typedef struct elencoAllarmi |
|
179 | + { |
|
180 | + U16 first_time_df; // condizione di primo avvio |
|
181 | + char theData_All[allarmiMax][11]; |
|
182 | + char thetime_All[allarmiMax][9]; |
|
183 | + char theday[allarmiMax]; |
|
184 | + char type_All[allarmiMax]; |
|
185 | + } elencoAllarmi __attribute__ ((PACKET)); |
|
186 | + |
|
187 | + // dichiara una struttura dati dfAll |
|
188 | + elencoAllarmi dfAll; |
|
189 | + |
|
190 | + // dichiara il file che ci servirà nelle funzioni |
|
191 | + FILE *fpAll; |
|
192 | + |
|
193 | + // funzione di caricamento relativa alla seconda serie di dati |
|
194 | + void carica_fissiAll(void) |
|
195 | + { |
|
196 | + fpAll = fopen(pathAll, "r"); |
|
197 | + |
|
198 | + if (fpAll == 0) |
|
199 | + reset_fissiAll(); |
|
200 | + |
|
201 | + fread(&dfAll, sizeof(dfAll), 1, fpAll); |
|
202 | + fclose(fpAll); |
|
203 | + } |
|
204 | + |
|
205 | + // funzione di salvataggio relativa alla seconda serie di dati |
|
206 | + char salva_fissiAll(void) |
|
207 | + { |
|
208 | + dfAll.first_time_df = 0xAAAA; |
|
209 | + |
|
210 | + fpAll = fopen(pathAll,"w"); |
|
211 | + |
|
212 | + if (fpAll == 0) |
|
213 | + return 0; |
|
214 | + |
|
215 | + fwrite(&dfAll, sizeof(dfAll), 1, fpAll); |
|
216 | + fclose(fpAll); |
|
217 | + return 1; |
|
218 | + } |
|
219 | + |
|
220 | + // funzione di reset realtiva alla seconda serie di dati |
|
221 | + void reset_fissiAll(void) |
|
222 | + { |
|
223 | + // imposta i valori di default |
|
224 | + int i; |
|
225 | + for (i = 0 ; i < allarmiMax ; i++) { |
|
226 | + snprintf(dfAll.theData_All[i], sizeof(dfAll.theData_All[0]), "%s", " "); |
|
227 | + snprintf(dfAll.thetime_All[i], sizeof(dfAll.thetime_All[0]), "%s", " "); |
|
228 | + dfAll.theday[i] = 8; |
|
229 | + dfAll.type_All[i] = 0; |
|
230 | + } |
|
231 | + |
|
232 | + // salva i dati impostati con i valori di default |
|
233 | + salva_fissiAll(); |
|
234 | + } |
|
235 | + |
|
236 | +Nello **start.c**: |
|
237 | + |
|
238 | + // Nello start.c sono presenti anche variabili e funzioni del progetto originale la cui |
|
239 | + // dichiarazzione è stata omessa perchè non riguradante la gestione dei dati fissi |
|
240 | + |
|
241 | + carica_fissiRic(); // carica i dati fissi nella struttura dati |
|
242 | + if (dfRic.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio |
|
243 | + sostituzioneAlimentatori = 0; |
|
244 | + num_lingua = 1; |
|
245 | + gestioneLingua(); |
|
246 | + reset_fissiRic(); // imposta i valori di default |
|
247 | + } |
|
248 | + |
|
249 | + carica_fissiAll(); // carica i dati fissi della seconda serie (allarmi) |
|
250 | + if (dfAll.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio |
|
251 | + reset_fissiAll(); // imposta i valori di default |
|
252 | + } |
|
253 | + |