Application " Critique ", régulation four éléctrique.
Bonjour.
Voici une partie d'un projet de programme de régulation de four avec hystérésis.
Le cahier des charges est simple. deux résistances, haut et bas chauffent un four .
J’allume la résistance du bas pendant un cycle de 3 secondes, je l'éteint, et j'allume la résistance du haut pendant un cycle 2 secondes je l'éteint, et allume le bas, , et ainsi de suite..
Il ne faut JAMAIS que les deux résistances, haut et bas soient allumés en même temps,
Pendant le cycle de chauffe, si la température est atteinte, je sors du cycle, et passe à l'autre cycle de chauffe.
J'ai conçu deux fonctions qui s'appellent l'une et l'autre. le soucis et de savoir si cet algorithme est stable, notamment avec la fonction : sleep(); qui est très importante pour avoir une minuterie..
Programme complet : Départ dans le Main par : " alumageBas (); "
Il s'agit de gérer un four électrique de boulangerie à trois étage, soit trois algorithme différents tournant simultanément, cet algorithme gère uniquement un étage.
La saisie des valeurs de température et commande sur les résistances électrique ce fait via des modules USB.
Merci pour vos suggestion et remarques.
]
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include <QCoreApplication>
#include <string.h>
#include <unistd.h> /* sleep() */
#include <ctime>
#include <iostream>
//#include <curses.h>
using namespace std;
int consigne = 20 ; //--Température de consigne
int hysteresis = 0.5 ; //--Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
int temperatureHaut ; //-- Saisie de la Température sur Sonde du Haut
int temperatureBas; //-- Saisie de la Température sur Sonde du bas
int resistanceHaut ; //-- Entier de Test: 1 = Résistance allumée sous tension. 0 = Résistance éteinte Hors tension
int resistanceBas ; //-- Entier de Test: 1 = Résistance allumée sous tension. 0 = Résistance éteinte Hors tension
void alumageBas (); //-- Fonction allumage bas
void alumageHaut (); //-- Fonction allumage haut
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
alumageBas ();
return a.exec();
}
void alumageBas ()
{
int ctr;
resistanceBas = 1;
cout<<"Allumage Bas, Resistance Bas mise sur " << resistanceBas ;
cout << endl ;
for (ctr = 0; ctr < 3; ctr++)
{
if (temperatureBas > (consigne + hysteresis))
{ resistanceBas = 0;
alumageHaut () ;
}
cout<<"Bas-Sur" << resistanceBas ;
cout << endl ;
sleep(1);
}
resistanceBas = 0;
cout<<"Coupure contact Bas Resistance Bas mise sur " << resistanceBas ;
cout << endl ;
cout << endl ;
alumageHaut () ;
}
void alumageHaut ()
{
int ctr;
resistanceHaut = 1;
cout<<"Allumage Haut, Resistance haut mise sur " << resistanceHaut ;
cout << endl ;
for (ctr = 0; ctr < 2; ctr++)
{
if (temperatureHaut > (consigne + hysteresis))
{
resistanceHaut = 0;
alumageBas ();
}
cout<<"Haut-Sur" << resistanceHaut ;
cout << endl ;
sleep(1);
}
resistanceHaut = 0;
cout<<"Coupure contact haut Resistance haut mise sur " << resistanceHaut ;
cout << endl ;
cout << endl ;
alumageBas ();
} |
J'ai tout refait Une classe et une fonction récursive
J'utilise des fonctions pour communiquer avec les modules de saisies.
Je me demande si le récursif est tout aussi problématique
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
| #include <QCoreApplication>
#include <unistd.h> /* sleep() */
#include <iostream>
using namespace std;
int temperatureHaut (); //-- Saisie de la Température sur Sonde du Haut
int temperatureBas(); //-- Saisie de la Température sur Sonde du bas
int PulseBas (); //-- Fonction Pulse sur relais résistance haut
int PulseHaut (); //-- Fonction Pulse sur relais résistance bas
class Four
{
private:
int consigneHaut;
int consigneBas;
int On;
public:
Four(int,int,int);
int allumage ();
};
// ---------- constructeur
Four::Four(int regulHaut, int regulBas, int marche)
{
consigneHaut = regulHaut;
consigneBas = regulBas;
On = marche;
}
// -------- Fonction récurcive de chauffe
int Four:: allumage()
{
int ctr;
int ctre;
if (temperatureHaut ()< consigneHaut) ;
PulseHaut() ;
for (ctr = 0; ctr < 3; ctr++)
{
sleep(1);
if (temperatureHaut ()< consigneHaut) ;
break;
}
PulseHaut() ;
cout << endl ;
// --------Fin premier cycle
if (temperatureBas()< consigneBas)
PulseBas() ;
for (ctre = 0; ctr < 3; ctr++)
{
sleep(1);
if (temperatureBas()< consigneBas)
break;
}
PulseBas() ;
cout << endl ;
allumage ();
}
// --------
int main(int argc, char *argv[])
{
Four Baguettes(260,260,1);
Baguettes.allumage();
}
// --------Fin Main
int temperatureHaut ()
{
int a = 10;
return a;
}
int temperatureBas ()
{
int a = 12;
return a;
}
int PulseHaut ()
{
cout<<"Haut en Pulse" ;
cout << endl ;
}
int PulseBas ()
{
cout<<"Bas en Pulse" ;
cout << endl ;
} |
----------*
Le temps me manque...
Faire des petits exercices certes mais des exercices factuels, mettre en place un algorithme de régulation, Être au pied du mur en quelque sorte.