Untitled
unknown
plain_text
2 years ago
3.4 kB
17
Indexable
(* Macchina che modella il funzionamento di un forno industriale *)
(* Dichiarazione delle Variabili *)
VAR
ACCENDI_FORNO: BOOL := FALSE
statoCorrente: ENUM {PreRiscaldamento, Cottura, Monitoraggio, Raffreddamento, FineCiclo};
temperaturaCorrente: INT;
tempoCottura: TIME;
umiditaDesiderata: INT;
tempoPreRiscaldamento: TIME := T#5m;
temperaturaCottura: INT := 220; (* Temperatura di cottura in gradi Celsius *)
umiditaAttuale: INT;
allarmeTemperatura: BOOL := FALSE;
END_VAR
(* Logica di Controllo Principale *)
IF NOT ACCENDI_FORNO THEN
ACCENDI_FORNO := TRUE (* Accendi il forno se non è già acceso *)
statoCorrente := PreRiscaldamento; (* Imposta lo stato iniziale a PreRiscaldamento *)
END_IF
CASE statoCorrente OF
PreRiscaldamento:
SetTemperatura(temperaturaCottura); #################################
Wait(tempoPreRiscaldamento); (* Attendi il tempo di pre-riscaldamento *) #################################
statoCorrente := Cottura; (* Passa allo stato di Cottura *)
Cottura:
CominciaCicloCottura(tempoCottura); (* Avvia il ciclo di cottura *) #################################
statoCorrente := Monitoraggio; (* Passa allo stato di Monitoraggio *)
Monitoraggio:
IF umiditaAttuale < umiditaDesiderata THEN
IncrementaUmidita(umiditaDesiderata); (* Aumenta l'umidità se necessario *)
END_IF
IF umiditaAttuale > umiditaDesiderata THEN
DecrementaUmidita(umiditaDesiderata); (* Diminuisce l'umidità se necessario *)
END_IF
IF temperaturaCorrente > temperaturaCottura + 10 OR temperaturaCorrente < temperaturaCottura - 10 THEN
allarmeTemperatura := TRUE; (* Attiva l'allarme se la temperatura esce dai limiti *)
END_IF
ControllaStatoCottura(); (* Verifica lo stato della cottura *) #################################
IF ControllaseCotto() THEN #################################
statoCorrente := Raffreddamento; (* Passo allo stato di Raffreddamento *)
END_IF
Raffreddamento:
Raffresca(); (* Avvia il processo di raffreddamento *) #################################
statoCorrente := FineCiclo (* Passa allo stato di Fine ciclo *)
FineCiclo:
ACCENDI_FORNO := FALSE; (* Spegni il forno *)
END_CASE
(* Funzioni di Supporto *)
(* Imposta la temperatura del forno *)
FUNCTION SetTemperatura: VOID
VAR_INPUT
TemperaturaDesiderata: INT; (* Temperatura desiderata in gradi Celsius *)
END_VAR
FornoController.TemperaturaSetPoint := TemperaturaDesiderata
END_FUNCTION
(* Attendi un determinato periodo *)
FUNCTION Wait: VOID
VAR_INPUT
TempoAttesa: TIME;
END_VAR
(* Implementazione di un delay, semplice timer *)
DelayTimer(IN:=TRUE, PT:=TempoAttesa);
IF DelayTimer.Q THEN
DelayTimer(IN:=FALSE); (* Reset del timero dopo il completamento *)
END_IF
END_FUNCTION
(* Avvia il ciclo di cottura *)
FUNCTION CominciaCicloCottura: VOID
VAR_INPUT
tempoCottura: TIME;
END_VAR
(* Inizia il ciclo di cottura imposta timer e condizioni di processo *)
CookingTimer(IN:=TRUE, PT:=tempoCottura);
IF CookingTimer.Q THEN
CookingTimer(IN:=FALSE); (* Termina il ciclo di cottura *)
END_IF
END_FUNCTION
Editor is loading...
Leave a Comment