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;