programmer un débimètre !!

programmer un débimètre !! - C - Programmation

Marsh Posté le 27-05-2006 à 12:47:45    

Bonjour, je suis actuellement en stage et je fais un petit bloquage sur  
cet exercice donc jvous joint l'énoncé ci-dessous en espérant que quelqu'un
puisse m'aider à le résoudre ou a me faire comprendre qu'elle démarche je dois
suivre.
Toutes les remarques concernant cet exercices sont les bienvenues.
Merci.
 
 
 
 
Module de simulation de pulses de comptage de fluides.
 
Objectif:
Ecrire et mettre au point un module qui puisse émuler un débimètre cad un
compteur qui délivre des impulsions au passage d'un fluide,
cela dans le cadre du développement d'un outil de test en fin de production
des matériels A3B.
 
Spécifications:
Ce module écrit en C devra tourner en tache de fond sur la carte MULTIFONCTIONs,
au sein du programme chargé sur UPSD_ES.
Pour produire les pulses, il devra actionner un relais(ON/OFF) selon:
une fréquence, un rapport cyclique et une quantité.
Le mieux serait que l'initialisation et la conclusion se fasse en tache d'avant  
plan et que le décomptage se fasse en routine d 'interruption timers.
 
BASEs  
a/ actionner un relais  
// Port B ( non bit adressable )
# define RELAIS_1_ON 0x01
# define RELAIS_2_ON 0x02
# define RELAIS_3_ON 0x04
# define RELAIS_4_ON 0x08
# define RELAIS_5_ON 0x10
# define RELAIS_6_ON 0x20
 
exemple :
 
PORT_B_OUT | = RELAIS_3_ON; // relais 3 ON
PORT_B_OUT & = ~RELAIS_3_ON // relais 3 OFF
 
b/ parametres statistiques de génération de pulses :
 
# define NB_VOIES_A_SCRUTER 6
 
struct typ_generation_pulses {
  MOT PPL; // type débimètre  
  OCTET RAPPORT CYCLIQUE; // de 1 à 100
  MOT DEBIT_SIMULE; // en pulse/minutes de 1 à 65535 PPM
  (et autres si nécessaires)
}GENERATION_PULSES [NB_VOIES_A_SCRUTER];
 
Valeurs des débimètres ( pulse par litres) :
 
#define PPL_10   10
#define PPL_14   14
#define PPL_16   16
#define PPL_26   26
#define PPL_35   35
#define PPL_52   52
#define PPL_72   72
#define PPL_100   100
#define PPL_328   328
#define PPL_1400  1400
 
c/ paramètres dynamiques pour la livraison  
 
struct demande_ivraison
 {
  OCTET no_livraison;
  OCTET code_retour_fdl;
  DBL_MOT DEMANDE_LIVR;  //quantité à livrer en 1/100 de litres
  DBL_MOT QTE_LIVREE;
  int timer;
  OCTET general;
  OCTET bascule_faite;
 }LIVRAISON_EN_COURS;
 
=> il y a un lien entre la qté demandée et le nombre de pulses à générer :
nb_pulses = (DEMANDE_LIVR /100) * PPL
 
d/ Timers :
La machine dispose d'interruptions où on peut gérer des timers qui  
battent au choix : 1/4 ms, 1ms, 10ms, 256ms
par exemple LIVRAISON_EN_COURS.timer bat la 10ms
 
4/ appel de fonction et code retour :
 
prototype : OCTET genere_pulses (OCTET voie):
 
le parametre voie vaut de 1 à 6 code pour la voie actionnée
le code retour vaut :
 0 si OK
 autre valeur code erreur .(à definir)

Reply

Marsh Posté le 27-05-2006 à 12:47:45   

Reply

Marsh Posté le 27-05-2006 à 12:55:18    

romain78420 a écrit :

Bonjour, je suis actuellement en stage et je fais un petit bloquage sur  
cet exercice donc jvous joint l'énoncé ci-dessous en espérant que quelqu'un
puisse m'aider à le résoudre ou a me faire comprendre qu'elle démarche je dois
suivre.


Tu as oublié de poster le code avec lequel tu as un problème...
 
Quand à la démarche, elle  n'est pas nouvelle :  
 
1 - Spécification.  
 
OK, c'est fait et c'est assez clair)
 
2 - Conception
 
Il y a des éléments dans l'énoncé, à toi de les compléter, d'imaginer une architecture logicielle (threads, peut être...), des fonctions, des interfaces, des comportements (algorithmes, machines à états...).
 
3 - Réalisation
 
Codage et tests unitaire... A toi de jouer
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-05-2006 à 21:25:24    

euh donc pour realiser mon debimetre jai realisé ce ptit programme mais je sais pas quoi mettre dans les deux boucles do/while donc si vous pouvez me donner un ptit coup de main et me dire si le reste est faux par la meme occase merci davance ...
 
 
 
/***********************************************************************************
*                   SIMULATEUR DE PULSES POUR COMPTAGE DE FLUIDES       *
***********************************************************************************/
 
 #include <alarme.h>
 #include <upsd.h>
 #include <stdio.h>    //  define I/O functions  
 #include <string.h>
 
// externes
 extern struct demande_livraison idata LIVRAISON_EN_COURS;
 extern struct typ_generation_pulses xdata GENERATION_PULSES [6];
 
// Port B ( non bit adressable )
 #define RELAIS_1_ON  0x01
 #define RELAIS_2_ON  0x02
 #define RELAIS_3_ON  0x04
 #define RELAIS_4_ON  0x08
 #define RELAIS_5_ON  0x10
 #define RELAIS_6_ON  0x20
 
// Valeur des débimètres  (pulses par litres)
 #define PPL_10   10
 #define PPL_14   14
 #define PPL_16   16
 #define PPL_26   26
 #define PPL_35   35
 #define PPL_52   52
 #define PPL_72   72
 #define PPL_100   100
 #define PPL_328   328
 #define PPL_1400  1400
 
 
 #define NB_VOIES_A_SCRUTER  6
   
 struct typ_generation_pulses {
       MOT PPL;           // type debimètre  
       OCTET RAPPORT_CYCLIQUE;     // de 1 à 100
      MOT DEBIT_SIMULE;      // en pulse/minutes de 1 à 65535 PPM
  }GENERATION_PULSES [NB_VOIES_A_SCRUTER];
 
 struct demande_livraison {
   OCTET no_livraison;
   OCTET code_retour_fdl;
   DBL_MOT DEMANDE_LIVR;  //quantité à livrer en 1/100 de litres
   DBL_MOT QTE_LIVREE;
   int timerZ;
   OCTET general;
   OCTET bascule_faite;
  }LIVRAISON_EN_COURS;
 
   
  OCTET genere_pulses (OCTET voie)
 {
 
/************************
 *Numéro de voie (1 à 6)*
 ************************/
 
 N = no_livraison; ?????       // permet d'identifier la voie à tester
 
/***********
 *LIVRAISON*
 ***********/
 
   nb_pulses = (DEMANDE_LIVR /100) * PPL          // Formule de conversion litres/pulsations
 
/**************************
 *DEBIT / RAPPORT CYCLIQUE*
 **************************/
 for( ij;ij<nb_pulses;ij++)
 {
  int timerZ  = ton = 128ms;   // valeur maximale du temps haut
  PORT_B_OUT |= RELAIS_N_ON; // RELAIS N EN MARCHE
 
// Boucle qui va permettre de réduire le temps haut
 
  do
  {
  //on doit produire des temps haut des plus en plus petit                    
  timerZ-- ;  ???????  // décrémente de 1 le timer pour diminuer le temps haut
 
  }while(timerZ > 0);
 
  int timerZ  = toff = 128ms;  // Valeur maximal du temps bas
  PORT_B_OUT &= ~RELAIS_N_OFF; // RELAIS N EN ARRET
 
// Boucle qui va permettre de réduire le temps bas
 
  do
  {
  // on doit produire des temps bas de plus en plus petit ...
  timerZ-- ; ???????   // décrémente de 1 le timer pour diminuer le temps bas
 
  }while(timerZ > 0);
 }
return(0);
}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed