IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Application " Critique ", régulation four éléctrique.


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ();
     
     
                                                                                                                           }

  2. #2
    Membre éprouvé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Chercheur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Par défaut
    Lu'!

    L'indentation de ton code est un peu fantaisiste.

    As-tu vraiment besoin de variables globales ? En C++, on déclare les variables le plus tard possible (pas de pré-déclaration quand ce n'est pas nécessaire). La moitié des includes sont inutiles.

    Là, tu fais quelque chose de pas beau : tu empiles "à l'infini" des appels à alumageHaut/alumageBas (faute d'orthographe) sans jamais en revenir.

    Alors qu'en fait tu as juste besoin d'une boucle dont une des conditions de sorties est que la température soit la bonne.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut
    Oui j'ai besoin d'avoir des variables globales.

    Je suis obligé d'allumer en haut et en bas en alternant, 3 seconde en bas, et 2 seconde en haut, et de ne jamais avoir les deux résistances allumées même temps.

    Par contre j'ai oublie de tester la température en rentrant dans la fonction, j'allume directement, et je teste après, je me suis" trompé".

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Ton programme crashera à cause d'une callstack trop importante tôt ou tard.
    Les variables globales sont clairement évitables dans ton cas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut
    Bien mais alors comment je fais pour dépiler ?

    Je dois allumer la résistance du bas 3 secondes, l'éteindre et allumer la résistance du haut 2 seconde, l'éteindre et ainsi de suite.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une variable globale, c'est au pire un paramètre à donner à des fonctions.

    Il n'y a jamais besoin d'une globale (non constante).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut
    Bien, faire une fonction avec la consigne de température, en paramètre. Et supprimer la variable de l’hystérésis,écrire l’hystérésis en dur dans le code, faire un +0.5 directement..

    Rentrer les deux fonctions en une.

    ______________________________

    " Faire les choses sans le dire, , réparer ce four au moins cher et le faire tourner "

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par défaut
    bonjour une classe C++ toute simple et bête pour commencer ça pourrait être utile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    class cAllumage
    {
    private:
    int consigne ;//--Température de consigne
    int hysteresis ; //--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
     
    public:
    //getter-setters
    int DonneTempeatureResistanceHaut() { return resistanceHaut; };
    cAllumage();
    void alumageBas (); 
    };
    cAllumage :: cAllumage()
    {
    // initialisations.
    }
     
    void cAllumage :: 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 () ;
     
    }
    après il faut voir s'il y a besoin de singletons..etc


    2- les fonctions alumageHaut et alumageBas sont des copier-collers à quelques déclarations près
    J'espère que tu ne travailles pas en entreprise parce que la personne qui fait ça sur un projet en entreprise elle prend un coup de pied aux fesses

    Imagines un projet avec des milliers de copier-collers comme ça !
    Donc soit on utilise l'héritage soit tu fais un banal if (alumage==HAUT).. ou if(aliumage==BAS) et pas des copier-coller de ce genre

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Il me semble qu'il y a un autre problème dans ton code, c'est que temperatureHaut et temperatureBas ne sont jamais initialisées... du coup lorsque tu fais des comparaisons cela peut donner des résultats fantaisistes.

    En tout cas, pour rester simple, tu peux faire une boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while (true) {
       allumerHaut(consigne);
       allumerBas(consigne);
    }
     
    void allumerHaut() {
      for (int i = 0; i < 3; ++i) {
        if (tooHot(temperatureHaut(), consigne)) break;
        sleep(1);
      }
      eteindreHaut();
    }
     
    // et allumerBas sur le même modèle.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut
    Merci
    Je vais regarder j’étais à tout refaire .
    Les saisies de données de température se font avec ces modules, il y a un fonction prendre la température à appeler , fonction fournie dans le fichier . h à intégrer, cela va de soi.
    http://www.yoctopuce.com/FR/products...o-thermocouple

    ------------------------------------------------

    Du sol au plafond je dois tout faire, je ne vois pas comment je pourrai me donner un coup de pied au derrière, vu que je suis le "boss en projet" , sur cette affaire.

    L'important c'est le style, que c'est que ça tourne.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut
    Les saisies de valeur de température, se font avec un appel de fonction, renvoyant la valeur provenant du module thermocouple USB
    http://www.yoctopuce.com/FR/products...o-thermocouple

    La commande sur les relais d'alimentation des résistances se fait avec une fonction "pulse" qui permet de demander au relais de commuter pour une
    durée prédéterminée Ainsi, en cas de plantage de l'application de commande, le four s'éteindra quand
    même. Cependant, si la température est atteinte avant la fin du : "pulse", il faut commuter, et allumer l'autre résistance.
    http://www.yoctopuce.com/FR/products...cto-powerrelay

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Commence par faire un programme naïf, tu verras après pour les X éléments extérieurs à prendre en compte, brancher etc...
    Là il semblerait que les bases de l'algo et du C++ ne soient pas connues.

    grossièrement tu devrais avoir un squelettes comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    main {
    timer
    while (1) {
    timer += dt
    if (haut allumé && timer > durée haut allumé) {
     timer = 0
     allumer bas
    }
    else if (bas allumé && timer > durée bas allumé) {
     timer = 0
     allumer haut
    }
    else if (tout est ok on doit éteindre) {
     eteindre
     break;
    }
    }
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 61
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo