Il seguente programma è di un progetto reale in cui occorreva definire due tipi di strutture dati.
Più avanti troverai anche la parte nello start.c.
Il codice è stato scritto in un file chiamato "ricettario.h" che è stato incluso nel common.
// ------------------------------------"ricettario.h"------------------------------------ //
#define numeroRicetteMax 10
#define coeffDecimali 1000 // ogni decimale è un x10 (quindi 3 decimali equaivale a 1000)
#define minutiAvvertimento 30
#define decimiAttesa 2
char pathProg[15] = "C:\\MW30632.fis"; // array relativo al file della prima serie di dati fissi
char pathAll[15] = "C:\\Allarm.fis"; // array relativo al file della seconda serie di dati fissi
// funzioni prima serie di dati fissi
void carica_fissiRic(void);
char salva_fissiRic(void);
void reset_fissiRic(void);
// primo tipo di struttura dati
typedef struct datifissiRic
{
U16 first_time_df; // condizione di primo avvio
unsigned char tipoLavoro_dfRic; // 0 modalità start/stop - 1 modalità ciclo aperto/chiuso
unsigned char livelloAperturaY2_dfRic; // percentuale di apertura della valvola Y2 durante il normale esercizio
unsigned char ritardoAperturaY2_dfRic; // ritardo apertura valvola di Y2 nella fase di start
unsigned char pressioneMinima_dfRic; // pressione minima aria
unsigned char pressioneMassima_dfRic; // pressione massima aria
unsigned char livelloChiusuraY2_dfRic; // percentuale apertura valvola Y2 durante pulizia impianto in fase di stop
unsigned char ritardoChiusuraY1Y3_dfRic; // ritardo chiusura valvole Y1 e Y3
// dalità ciclo
char selLivelli_ric[numeroRicetteMax]; // numero ionizzatori attivi
char modaLavoro_ric[numeroRicetteMax]; // 0 ciclo aperto - 1 ciclo chiuso
unsigned char powerTimerEnable_dfRic[numeroRicetteMax]; // abilitazione fascia oraria
unsigned long int powerOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata
unsigned long int powerOff_dfRic[numeroRicetteMax]; // orari di spegnimento
unsigned long int TOn_dfRic[numeroRicetteMax]; // orari di avvio in modalità temporizzata
unsigned long int TOff_dfRic[numeroRicetteMax]; // orari di spegnimento
// modalità start stop
char selLivello_dfRic; // numero ionizzatori attivi
// tipo macchina
unsigned char tipoMacchina_dfRic; // 0 = versione expensive , 1 = versione cheap
// linearizzazione pressostato
char P_max_dfRic;
char P_min_dfRic;
long int V_max_dfRic;
long int V_min_dfRic;
// ore utilizzo
long int oreLavorate1_Ric;
long int oreLavorate2_Ric;
long int oreLavorate3_Ric;
long int oreSoglia1_Ric;
long int oreSoglia2_Ric;
long int oreSoglia3_Ric;
long int oreMax1_Ric;
long int oreMax2_Ric;
long int oreMax3_Ric;
// warnings
unsigned char tensioneAria_warning_Enable_Ric;
unsigned char alimentazioneIonizzatori_warning_Enable_Ric;
unsigned char tensioneMinMax_warning_Enable_Ric;
unsigned char sicurezzaPorta_warning_Enable_Ric;
unsigned char presenzaAcquaSerbatoio_warning_Enable_Ric;
unsigned char OnOffRemoto_warning_Enable_Ric;
unsigned char presenzaAria_warning_Enable_Ric;
unsigned char Giorno_dfRic[numeroRicetteMax][7];
unsigned char superadmin_password_Ric[32];
unsigned char manutentore_password_Ric[32];
} datifissiRic __attribute__ ((PACKET));
// dichiara una struttura dati dfRic
datifissiRic dfRic;
// dichiara il file che servirà nelle funzioni
FILE *fpRic;
// funzione di caricamento dati della prima serie di dati fissi
void carica_fissiRic(void)
{
fpRic = fopen(pathProg, "r"); // apertura di pathProg in modalità lettura in fpRic
if (fpRic == 0) // se fpRic == 0 --> l' operazione fopen non ha avuto successo
reset_fissiRic(); // resetta i dati con i valori di default
fread(&dfRic, sizeof(dfRic), 1, fpRic); // legge i valori dei dati in fpRic e li carica in dfRic
fclose(fpRic); // chiude fpRic
}
// funzione di salvataggio dati relativo alla prima serie di dati
char salva_fissiRic(void)
{
dfRic.first_time_df = 0xAAAA; // condizione di primo avvio, servirà in start.c
fpRic = fopen(pathProg,"w"); // apertura di pathProg in modalità scrittura
if (fpRic == 0) // se fpRic == 0 --> fopen non ha avuto successo
return 0;
fwrite(&dfRic, sizeof(dfRic), 1, fpRic); // scrive i valori dei dati fissi da dfRic in fpRic
fclose(fpRic); // chiude fpRic
return 1;
}
// funzione di reset relativa alla prima serie di dati
void reset_fissiRic(void)
{
// i valori vengono resettati impostando i valori di default
int i;
for (i = 0 ; i < numeroRicetteMax ; i++) {
dfRic.selLivelli_ric[i] = 1;
dfRic.modaLavoro_ric[i] = 0;
dfRic.powerTimerEnable_dfRic[i] = 0;
dfRic.powerOn_dfRic[i] = 0;
dfRic.powerOff_dfRic[i] = 0;
dfRic.TOn_dfRic[i] = 0;
dfRic.TOff_dfRic[i] = 0;
int j;
for (j = 0 ; j < 7 ; j++) {
dfRic.Giorno_dfRic[i][j] = 0;
}
}
dfRic.tipoLavoro_dfRic = 0;
dfRic.livelloAperturaY2_dfRic = 5;
dfRic.ritardoAperturaY2_dfRic = 5;
dfRic.pressioneMinima_dfRic = 9;
dfRic.pressioneMassima_dfRic = 15;
dfRic.livelloChiusuraY2_dfRic = 60;
dfRic.ritardoChiusuraY1Y3_dfRic = 20;
dfRic.selLivello_dfRic = 1;
dfRic.tipoMacchina_dfRic = 1;
dfRic.P_max_dfRic = 100;
dfRic.P_min_dfRic = 0;
dfRic.V_max_dfRic = 5000;
dfRic.V_min_dfRic = 1620;
dfRic.oreLavorate1_Ric = 0;
dfRic.oreLavorate2_Ric = 0;
dfRic.oreLavorate3_Ric = 0;
dfRic.oreSoglia1_Ric = 3500;
dfRic.oreSoglia2_Ric = 3500;
dfRic.oreSoglia3_Ric = 3500;
dfRic.oreMax1_Ric = 4000;
dfRic.oreMax2_Ric = 4000;
dfRic.oreMax3_Ric = 4000;
dfRic.tensioneAria_warning_Enable_Ric = 1;
dfRic.alimentazioneIonizzatori_warning_Enable_Ric = 1;
dfRic.tensioneMinMax_warning_Enable_Ric = 1;
dfRic.sicurezzaPorta_warning_Enable_Ric = 1;
dfRic.presenzaAcquaSerbatoio_warning_Enable_Ric = 1;
dfRic.OnOffRemoto_warning_Enable_Ric = 1;
dfRic.presenzaAria_warning_Enable_Ric = 1;
snprintf(dfRic.superadmin_password_Ric, sizeof(dfRic.superadmin_password_Ric), "1018");
snprintf(dfRic.manutentore_password_Ric, sizeof(dfRic.manutentore_password_Ric), "118");
// salva i dati impostati con i valori di default
salva_fissiRic();
}
// -----------------------
// gestione elenco allarmi
// -----------------------
#define allarmiMax 100
// tipo di struttura dati relativa alla seconda serie di dati fissi
typedef struct elencoAllarmi
{
U16 first_time_df; // condizione di primo avvio
char theData_All[allarmiMax][11];
char thetime_All[allarmiMax][9];
char theday[allarmiMax];
char type_All[allarmiMax];
} elencoAllarmi __attribute__ ((PACKET));
// dichiara una struttura dati dfAll
elencoAllarmi dfAll;
// dichiara il file che ci servirà nelle funzioni
FILE *fpAll;
// funzione di caricamento relativa alla seconda serie di dati
void carica_fissiAll(void)
{
fpAll = fopen(pathAll, "r");
if (fpAll == 0)
reset_fissiAll();
fread(&dfAll, sizeof(dfAll), 1, fpAll);
fclose(fpAll);
}
// funzione di salvataggio relativa alla seconda serie di dati
char salva_fissiAll(void)
{
dfAll.first_time_df = 0xAAAA;
fpAll = fopen(pathAll,"w");
if (fpAll == 0)
return 0;
fwrite(&dfAll, sizeof(dfAll), 1, fpAll);
fclose(fpAll);
return 1;
}
// funzione di reset realtiva alla seconda serie di dati
void reset_fissiAll(void)
{
// imposta i valori di default
int i;
for (i = 0 ; i < allarmiMax ; i++) {
snprintf(dfAll.theData_All[i], sizeof(dfAll.theData_All[0]), "%s", " ");
snprintf(dfAll.thetime_All[i], sizeof(dfAll.thetime_All[0]), "%s", " ");
dfAll.theday[i] = 8;
dfAll.type_All[i] = 0;
}
// salva i dati impostati con i valori di default
salva_fissiAll();
}
Nello start.c:
// Nello start.c sono presenti anche variabili e funzioni del progetto originale la cui
// dichiarazzione è stata omessa perchè non riguradante la gestione dei dati fissi
carica_fissiRic(); // carica i dati fissi nella struttura dati
if (dfRic.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio
sostituzioneAlimentatori = 0;
num_lingua = 1;
gestioneLingua();
reset_fissiRic(); // imposta i valori di default
}
carica_fissiAll(); // carica i dati fissi della seconda serie (allarmi)
if (dfAll.first_time_df !=0xAAAA) { // se è il primo ciclo di avvio
reset_fissiAll(); // imposta i valori di default
}