Durée : 2h. Notes de cours personnelles (manuscrites, sorties imprimante ou polys), TD et TP autorisés. Calculatrices autorisées. Autres documents (dont livres) interdits. Ce document comporte trois pages.
Remarques : En cas d’informations insuffisantes, vous pouvez faire toute supposition qui vous arrange, à condition qu’elle ne contredise ni ce que j’ai imposé dans le sujet, ni le bon sens.
Ce sujet correspond à un besoin réel, dans une entreprise de la région. Sa production nécessite le remplissage à l'aide d'azote, sous une pression précise, d'une enceinte hyperbare (en clair : récipient supportant les hautes pressions). Auparavant, la pression était réglée manuellement, en actionnant la molette d'un régulateur (dit plus simplement : on ouvre un robinet). L'opérateur tourne la molette (dans le sens trigo) tout en surveillant un manomètre à cadran, jusqu'à ce que la pression désirée soit atteinte. Les produits dans l'enceinte comportant un clapet anti-retour, tout dépassement de la pression prévue entraîne la mise au rebut du lot de produits. Ceci nécessite donc une attention soutenue de l'opérateur, qui pour éviter de dépasser la pression de consigne, ajuste lentement la pression, ce qui ralentit le cycle de production.
Nous avons donc envisagé d'automatiser cette tâche. L'outil de production (la "machine") étant satisfaisant, et vu qu'en recréer une nouvelle, même plus performante, coûterait largement plus que le gain de productivité escompté, il a été décidé de ne pas modifier la "machine" dans son fonctionnement, mais que seule la commande du régulateur se ferait automatiquement. Pour cela, il a suffit d'y installer un moteur pas à pas (et un réducteur), de rajouter un capteur de pression sur l'enceinte, et d’intercaler entre les deux un dispositif de commande : on a choisi d'utiliser un ordinateur (PC), pour son prix (récupéré dans le parc machines de l'entreprise, un modèle un peu ancien suffisant largement), mais aussi pour ses possibilités de traitement, comme on le verra dans la fin du sujet.
Le moteur pas à pas est très facile à commander, en envoyant des impulsions par l'intermédiaire d'une carte d'entrées-sorties. Quelques fonctions permettant de commander le moteur sont définies dans le fichier "moteur.h", voici l'entête de celles qui vous serviront :
Le capteur
de pression quand à lui envoie un signal proportionnel à
la pression sur la carte d'entrée (sur un composant appelé
convertisseur analogique-numérique : CAN). Une fonction, elle
aussi définie dans
Q 1 :
En fait, le CNA ne donne pas la valeur exacte, mais un entier
proportionnel à la pression. Après étalonnage du
capteur, nous avons pu établir la relation permettant de
déterminer la véritable pression : valeur_réelle
= (valeur_lue_cna – 412) / 6.6
Nous avons également
remarqué que la valeur mesurée fluctuait un peu autour
de la valeur réelle, le problème a été
résolu en faisant 10 lectures d’affilée et en en
prenant la moyenne, vous ferez donc pareil.
Ecrivez la fonction mesurer qui retourne la pression réelle (et utilise la fonction lire_cna). Son entête sera obligatoirement : float mesurer(void)
Q 2 : Faites un programme complet de commande du dispositif, utilisant les fonctions décrites ci dessus, et répondant au cahier des charges suivant :
L'opérateur entre la valeur correspondant à la pression désirée (scanf). Puis le programme attend l'appui de la touche 'D' (lecture d'un caractère) et le cycle démarre : on ouvre le régulateur d'un pas à la vitesse maximale, et ce jusqu'à atteindre 90% de la pression désirée. Puis on continue d'ouvrir le régulateur, mais en espaçant chaque impulsion d'environ 10ms jusqu'à atteindre 96% de la valeur désirée, puis on termine en espaçant chaque impulsion de 20ms. On signale à l'écran que la pression est atteinte, et on attend que l'opérateur appuie sur la touche 'R' pour remettre le régulateur en position initiale (on peut tourner à la vitesse maximale), il faut exactement autant d'impulsions pour la fermeture que pour l'ouverture. On peut alors désactiver le moteur. Le programme propose alors soit de refaire un nouveau cycle, soit d'arrêter. La fonction void delay(int durée_en_ms); permet d'attendre pendant la durée donnée en argument.
Q 3 : Pour éviter à l’opérateur de donner la valeur de la pression désirée, on préfère qu’il entre un code (référence) pour le type de pièce à produire, votre programme devra trouver la valeur de pression nécessaire. Pour simplifier, on suppose que la référence est un entier strictement positif (dans la réalité c’est une combinaison de chiffres et de lettres). On utilisera pour cela deux tableaux unidimensionnels, le premier s’appelle ref, le second consig. Le nombre de références sera toujours inférieur à 100 et sera stocké dans la variable nbref.
Le tableau ref contient les références existantes. Exactement en même position, on trouvera dans le tableau consig la consigne de pression correspondant à la référence. Les références ne sont pas triées, mais elles se trouvent dans les nbref premières valeurs du tableau.
On suppose disposer d’une fonction capable de lire les références et consignes sauvées au préalable dans un fichier, et de mettre à jour nbref et les deux tableaux. Cette fonction est écrite dans le fichier “init-ref.h” et son entête est void initialise_tableaux(itab ref, ftab consig, int * nbref). Elle est appelée par la fonction main, dès le début du programme.
Q 3.1 : Déclarez cela en précisant ce qui sera défini globalement et ce qui sera défini dans la fonction main.
Q 3.2 : Ecrivez une fonction qui demande à l’utilisateur une référence, la recherche dans le tableau ref, et s’il la trouve revoie la consigne correspondante. S’il ne la trouve pas, il redemande une référence, et ce jusqu’à ce qu’il obtienne une référence valide. La référence 0 est considérée comme valide : bien que n’étant pas dans le tableau ref, elle correspond aux commandes spéciales, on demande alors à l’opérateur d’entrer la pression désirée, et la fonction retourne directement cette valeur.
Q 4 : On désire analyser la productivité journalière du poste. Pour cela, on va comptabiliser, pour chaque cycle de mise en pression, la durée « perdue » depuis la fin du cycle précédent, la durée de la mise en pression et celle du relâchement de la pression, ainsi que la référence. Les durées sont en secondes (avec précision au 100ème de seconde). On ne fait jamais plus de 2000 cycles dans la journée.
Q 4.1 : Déclarez (sous forme d'une structure) les données d'un cycle, déclarez également l'ensemble des données journalières (sous forme d'un tableau).
Q 4.2 : En supposant que les données d'une journée complète sont dans ce tableau, écrivez le morceau de programme permettant de demander la référence que l'on désire analyser, qui compte combien de cycles ont été effectués pour ce type de pièce, et le temps moyen « utile » (durée de mise en pression + relâchement) pour ce type de pièce. Par « morceau de programme », j'entends qu'il n'est pas nécessaire de définir si c'est une fonction ou un bout du programme principal, qu'il n'est pas obligé de couper en sous-programmes, ni de définir des passages d'arguments, on suppose que tout est connu partout.
pour quelques pistes de solution, cliquez ici, pour retourner au sommaire des sujets d'examen, cliquez là
Patrick
TRAU, ULP - IPST
mars 04