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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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).

+ 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