Untitled

 avatar
unknown
plain_text
a year ago
3.4 kB
7
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