Les sections du Mast

Communication

(* Communication avec le compteur électrique *)
IF Etape_de_comm < 0 OR Etape_de_comm > 999   THEN Etape_de_comm := 0 ;END_IF;

(* Mise à l’écoute *)
IF Etape_de_comm = 0 AND NOT Cr_comm_1.0  THEN
    INPUT_CHAR(ADDR(‘0.0.1.SYS’),1,40,Cr_comm_1_4,Mb220_40);
    INC_INT(INOUT:=Etape_de_comm );
    JMP L999 ;
END_IF;

(* Etape transitoire *)
IF Etape_de_comm = 1 AND Cr_comm_1.0  THEN
    INC_INT(INOUT:=Etape_de_comm );
    JMP L999 ;
END_IF;

(* Attente de réception *)
IF Etape_de_comm = 2 AND NOT Cr_comm_1.0  THEN
    INPUT_CHAR(ADDR(‘0.0.1.SYS’),1,40,Cr_comm_1_4,Mb220_40);
    INC_INT(INOUT:=Etape_de_comm );
    JMP L999 ;
END_IF;

L999:


Sorties

(* Bidouille pour faire tomber le forçage du thermostat *)
(* IF Horodateur_hh_nn = 16#0550  THEN *)
%m12:=Heures_creuses;
if fe(%m12) then
    RESET(Forcage_thermostat_a_1 );
END_IF;

(* Horodateur *)
Bit_de_seconde := %S6;
Horo_jour_de_la_semaine := %SW49 ;
Horo_ss_4 := %SW50:4 ;
Heures_creuses := Horodateur_hh_nn > Fin_heures_pleines OR Horodateur_hh_nn < Debut_heures_pleines   ;(* Dans les heures creuses *)
RRTC_DT(DateHeureActuelle);

(* Couleurs imposées *)
Valeur_de_la_couleur_du_jour := 0 ;    (* Aujourd’hui *)
IF Jour_bleu THEN Valeur_de_la_couleur_du_jour := 1 ;END_IF;
IF Jour_blanc THEN Valeur_de_la_couleur_du_jour := 2 ;END_IF;
IF Jour_rouge THEN Valeur_de_la_couleur_du_jour := 3 ;END_IF;

Valeur_de_la_couleur_du_lendemai := 0 ;(* Demain *)
IF Demain_bleu THEN Valeur_de_la_couleur_du_lendemai := 1 ;END_IF;
IF Demain_blanc THEN Valeur_de_la_couleur_du_lendemai := 2 ;END_IF;
IF Demain_rouge THEN Valeur_de_la_couleur_du_lendemai := 3 ;END_IF;

(* Dimanche Tempo –> toujours bleu *)    IF Horo_jour_de_la_semaine = 7 AND Horodateur_hh_nn > 16#0600   THEN SET(Jour_bleu );RESET(Jour_blanc );RESET(Jour_rouge );END_IF;

(* Samedi Tempo –> si indéfini, alors blanc *)        IF Horo_jour_de_la_semaine = 6 AND Horodateur_hh_nn > 16#0600 AND Valeur_de_la_couleur_du_jour = 0   THEN SET(Jour_blanc );END_IF;

(* En été, tous les jours sont bleus *)
(* SET %MW60:X6;RESET %MW60:X7;RESET %MW60:X8;
SET %MW60:X9;RESET %MW60:X10;RESET %MW60:X11; *)

(* Sinon, on force à blanc *)IF Valeur_de_la_couleur_du_jour = 0  THEN RESET(Jour_bleu );SET(Jour_blanc );RESET(Jour_rouge );END_IF;

(* Sinon, on force à rouge *)(* IF %MW55=0 THEN RESET %MW60:X9;RESET %MW60:X10;SET %MW60:X11;END_IF; *)

(* Changement de jour TEMPO *)
IF (Horodateur_hh_nn AND -256 (*16#FF00*)) = 16#0600 AND NOT Flag_chgt_jour_tempo  THEN
    SET(Flag_chgt_jour_tempo );
    (* Prise en compte de la couleur du lendemain (qui devient du jour *)
    Jour_bleu := Demain_bleu ;
    Jour_blanc := Demain_blanc ;
    Jour_rouge := Demain_rouge ;    

    (* RAZ de la couleur du lendemain *)
    RESET(Demain_bleu );RESET(Demain_blanc );RESET(Demain_rouge );    

    (* RAZ forçages *)
    MOVE_INT_ARINT(0, Forcage_des_sorties_a_1_2);
    Forcage_consigne_temperature := 999 ;
ELSIF (Horodateur_hh_nn AND -256 (*16#FF00*)) <> 16#0600  THEN
    RESET(Flag_chgt_jour_tempo );
END_IF;

(* Détection d’eau trop chaude *)
if fe( %I\4.1\0.0.1) and %Q\4.1\0.0.1 or %m19 then
    set (%m18);
    RRTC_DT(HeureDetectionEauTropChaude);
end_if;

DeltaTemps := SUB_DT_DT (DateHeureActuelle,HeureDetectionEauTropChaude);
if deltatemps>dureeeautropchaude then reset(%m18);end_if;

(* Marche-arret *)

(* Tempo après arrêt des résistances *)
IF RE(Bit_de_seconde )THEN
    IF NOT Contacteur_resistance_1 AND NOT Contacteur_resistance_2 AND NOT Contacteur_resistance_3 AND Cons_temp_moins_1_non_atteinte  THEN
        INC_INT(INOUT:=Nb_sec_depuis_arret_resistances );
    ELSE
        Nb_sec_depuis_arret_resistances := 0 ;
    END_IF;
END_IF;
IF Nb_sec_depuis_arret_resistances / 60 >= 45  THEN RESET(Cons_temp_moins_1_non_atteinte );END_IF;

Marche_general := Cons_temp_moins_1_non_atteinte AND NOT Forcage_marche_generale_a_0 AND NOT Forcage_generale_a_0_malgre_heur;

Marche_general := Marche_general OR Forcage_marche_generale_a_1 OR Forcage_generale_a_1_malgre_heur;

Recopie_sortie_marche_generale := Marche_general;


(* Commande de la résistance 1 (phase 1) *)
Tmp_marche_resistances := Consigne_temp_non_atteinte OR Forcage_thermostat_a_1  ;        (* Consigne température *)
Tmp_marche_resistances := Tmp_marche_resistances OR Forcage_resistance_1_a_1  ;            (* Forçage résistance 1 à 1*)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT %m18;
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_resistance_1_a_0  ;        (* Pas de forçage résistance 1 à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_marche_generale_a_0  ;        (* Pas de forçage général à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND Marche_general  ;        (* Marche générale *)
Marche_resistance_1 := Tmp_marche_resistances ;

(* Récupération de l’état du contacteur *)
Recopie_entree_resistance_1 := Contacteur_resistance_1;


(* Commande de la résistance 2 (phase 2) *)
Tmp_marche_resistances := Jour_bleu;                (* Jour bleu *)
Tmp_marche_resistances := Tmp_marche_resistances OR (Heures_creuses AND Consigne_temp_presque_non_attein)  ;    (* HC et T°<consigne-1° *)
Tmp_marche_resistances := Tmp_marche_resistances AND (Consigne_temp_non_atteinte OR Forcage_thermostat_a_1)  ;    (* Consigne température *)
Tmp_marche_resistances := Tmp_marche_resistances OR Forcage_resistance_2_a_1  ;            (* Forçage résistance 2 à 1*)    
Tmp_marche_resistances := Tmp_marche_resistances AND NOT %m18;
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_resistance_2_a_0  ;        (* Pas de forçage résistance 2 à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_marche_generale_a_0  ;        (* Pas de forçage général à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND Marche_general  ;        (* Marche générale *)

Marche_resistance_2 := Tmp_marche_resistances ;

(* Récupération de l’état du contacteur *)
Recopie_entree_resistance_2 := Contacteur_resistance_2;


(* Commande de la résistance 3 (phase 3) *)
Tmp_marche_resistances := Forcage_resistance_3_a_1;                (* Forçage résistance 3 à 1*)    
Tmp_marche_resistances := Tmp_marche_resistances AND NOT No_cumulus  ;    (* Le cumulus n’est pas en route *)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_resistance_3_a_0  ;        (* Pas de forçage résistance 3 à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_marche_generale_a_0  ;        (* Pas de forçage général à 0*)
Tmp_marche_resistances := Tmp_marche_resistances AND Marche_general  ;        (* Marche générale *)
Marche_resistance_3 := Tmp_marche_resistances ;

(* Récupération de l’état du contacteur *)
Recopie_entree_resistance_3 := Contacteur_resistance_3;


(* Prises des caméras *)
Nf_prise_camera_cuisine := Horodateur_hh_nn >= 16#0720 AND Horodateur_hh_nn <= 16#0730;    (* Cuisine Sortie NF *)


(* Commande du cumulus (Phase 3) *)
Tmp_marche_resistances := Heures_creuses;    (* HC *)
Tmp_marche_resistances := Tmp_marche_resistances AND ((Horodateur_hh_nn >= 16#0400 AND Horodateur_hh_nn <= 16#0600) or Jour_bleu);    (* seulement de 5h00 & 6h00 quand le jour n’est pas bleu *)
Tmp_marche_resistances := Tmp_marche_resistances AND Forcage_cumulus_a_1  ;    (* Forçage cumulus à 1 *)
Tmp_marche_resistances := Tmp_marche_resistances AND NOT Forcage_cumulus_a_0  ;    (* Pas de forçage cumulus à 0*)
No_cumulus := Tmp_marche_resistances ;

(* Récupération de l’état du relais de commande du cumulus *)
Recopie_sortie_cumulus := No_cumulus;


(* Thermostat du salon*)
Thermostat := Thermostat_salon;


Memo_etat_i_o

(* RAZ table complète *)
(* %MW5000:500:=0; *)

(* Mémorisation des ES à chaque changement d’état *)
Res_equal_es := EQUAL_ARINT(Recopie_des_entrees_3,Old_mw60_3,0);
IF Res_equal_es <> -1  THEN
    %MW5010:490 := %MW5000:490 ;
    MOVE_INT_ARINT(0, %MW5000:10);
    %MW5000:4 := %SW50:4 ;
    %MW5004:3 := Recopie_des_entrees_3 ;
    Old_mw60_3 := Recopie_des_entrees_3 ;
END_IF;


Captage_temperat

(* Conversion suivant la formule T°=(%IW-4188)/(-8.3658)
   Cette formule est issue d’une courbe de tendance d’Excel *)
IF RE(Bit_de_seconde )THEN
    Mf_de_travail_iw := INT_TO_REAL(Sonde_thermique);
    Mf_de_travail_iw := (Mf_de_travail_iw – 4188.0) / -8.3658  ;
    Table_temp_2_19 := Table_temp_1_19 ;
    Table_temp_1 := REAL_TO_INT(Mf_de_travail_iw);
    Temperature_en_10e_de_degres := SUM_ARINT(Table_temp_1_20);
    Mf_de_travail_buffer_temp := INT_TO_REAL(Temperature_en_10e_de_degres) / 20.0  ;
    Temperature_en_10e_de_degres := REAL_TO_INT(Mf_de_travail_buffer_temp);
END_IF;

(* Forcage de la consigne si %MW77 <> 999 *)
IF Forcage_consigne_temperature <> 999  THEN Consigne_temperature := Forcage_consigne_temperature ;END_IF;
IF Temperature_en_10e_de_degres < Consigne_temperature  THEN SET(Cons_temp_moins_1_non_atteinte );END_IF;(* On passe sous la consigne: départ accélérateur *)
(* if %MW76>=%MW78+7 THEN RESET %M17;END_IF;(* On passe au dessus de la consigne + 0.7°: arrêt accélérateur *)
IF Temperature_en_10e_de_degres < Consigne_temperature  THEN SET(Consigne_temp_non_atteinte );END_IF;(* On passe sous la consigne: départ chauffage *)
IF Temperature_en_10e_de_degres >= Consigne_temperature + 5   THEN RESET(Consigne_temp_non_atteinte );END_IF;(* On passe au dessus de la consigne + 0.5°: arrêt chauffage *)
IF Temperature_en_10e_de_degres < Consigne_temperature – 20   THEN SET(Consigne_temp_presque_non_attein );END_IF;(* On passe sous la consigne – 2°: départ résistance 2 en HC *)
IF Temperature_en_10e_de_degres >= Consigne_temperature – 10   THEN RESET(Consigne_temp_presque_non_attein );END_IF;(* On passe au dessus de la consigne – 1°: arrêt résistance 2 en HC *)


Consigne_tempera

(* Consigne de température à atteindre (Raffraichi toutes les minutes) *)
IF (%SW50 AND -256 (*16#FF00*)) = 16#0000 AND NOT Flag_mise_a_jour_consigne  THEN
    SET(Flag_mise_a_jour_consigne );
    IF NOT Heures_creuses THEN    (* On est en heures pleines *)
        IF Valeur_de_la_couleur_du_jour = 1  THEN Consigne_temperature := Temp_hp_1 ;
        ELSIF Valeur_de_la_couleur_du_jour = 2  THEN Consigne_temperature := Temp_hp_2 ;
        ELSIF Valeur_de_la_couleur_du_jour = 3  THEN Consigne_temperature := Temp_hp_3 ;
        ELSE Consigne_temperature := Temp_hp_3 ;
        END_IF;
    ELSE    (* On est en heures creuses *)
        IF Valeur_de_la_couleur_du_jour = 1  THEN
            IF Valeur_de_la_couleur_du_lendemai = 1  THEN Consigne_temperature := Temp_hc_1_demain_1 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 2  THEN Consigne_temperature := Temp_hc_1_demain_2 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 3  THEN Consigne_temperature := Temp_hc_1_demain_3 ;
            ELSE Consigne_temperature := Temp_hc_1_demain_3 ;
            END_IF;
        ELSIF Valeur_de_la_couleur_du_jour = 2  THEN
            IF Valeur_de_la_couleur_du_lendemai = 1  THEN Consigne_temperature := Temp_hc_2_demain_1 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 2  THEN Consigne_temperature := Temp_hc_2_demain_2 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 3  THEN Consigne_temperature := Temp_hc_2_demain_3 ;
            ELSE Consigne_temperature := Temp_hc_1_demain_3 ;
            END_IF;
        ELSIF Valeur_de_la_couleur_du_jour = 3  THEN
            IF Valeur_de_la_couleur_du_lendemai = 1  THEN Consigne_temperature := Temp_hc_3_demain_1 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 2  THEN Consigne_temperature := Temp_hc_3_demain_2 ;
            ELSIF Valeur_de_la_couleur_du_lendemai = 3  THEN Consigne_temperature := Temp_hc_3_demain_3 ;
            ELSE Consigne_temperature := Temp_hc_3_demain_3 ;
            END_IF;
        ELSE Consigne_temperature := Temp_hp_3 ;
        END_IF;
    END_IF;
ELSIF (%SW50 AND -256 (*16#FF00*)) <> 16#0000  THEN
    RESET(Flag_mise_a_jour_consigne );
END_IF;