Log in Register

Login to your account

Username
Password *
Remember Me

Create an account

Fields marked with an asterisk (*) are required.
Name
Username
Password *
Verify password *
Email *
Verify email *
Captcha *
Welcome, Guest
Username: Password: Remember me

TOPIC: Programmation cyclique

Programmation cyclique 10 Feb 2014 13:22 #1

Bonjour à tous, besoin de votre aide….
Si j’appuie sur bouton 1 ou (si heure=xx et compteur eau a mesuré un certain volume) je souhaite déclancher une série d’actions avec 3 relais de la carte in8R8.
-R1 « on » pendant 57mn
-R2 « on » pendant 5mn, puis « off », puis à nouveau « on » 52mn après avoir été off, et ceci pendant 3mn
-R3 « on » au bout de 60mn, pendant 8 secondes.
-RAZ compteur d’eau au bout de 60mn, et le cycle recommence..

Pour réaliser ce cycle, j’ai théoriquement 3 options :
- La plus simple serait de prendre l’heure pour référence : ex : 10h00 R1 et R2 « on », 10h05 R2 « off » 10h57 R1 « off », etc….mais impossible car je dois pouvoir le faire aussi en appuyant sur un bouton, à n’importe quelle heure…
- donc l’alternative serait une fonction du genre (en secondes) : get.time()=x ; if (get.time)=(x+5*60) clear_in8R8(0,1), etc…mais je ne sais comment faire pratiquement
-la 3éme solution que j’imagine serait d’utiliser la fonction « timer » et il faudrait que j’associe les sorties de la carte in8R8 à un timer :
R1 à un timer qui mette off au bout de 60mn (ça c’est ok pour le programmer)
R2 à un timer qui mette off au bout de 5mn (ok pour programmer) puis « on » après 52mn, et ceci pendant 3mn (pas du tout ok pour programmer ça…)
R3 à un timer qui mette ce relais à on pendant 8secondes au bout de 60mn…

Bref, comment fait on pour programmer des actions cycliques comme celle que j’essaie de réaliser ?
Comment fait on pour programmer un relais (on ou off) au bout d’un temps d’attente de x ET pendant une durée y ?
Merci de me mettre sur la bonne voie MAIS de ne pas me donner la solution toute faire car il faut que j’y arrive !!

J’espère qu’on retrouvera ces fonctions dans le manager : que peut on faire avec un relais ? Il peut être on, off, on ou off pendant un certain temps, on ou off au bout d’un certain temps Et pour une certaine durée, on ou off toutes les Xmn pendant Ymn sur un cycle de Zmn (ex : R1 « on » toutes les 10mn pendant 3mn sur un cycle de 2 heures)
Voilà des fonctions qui simplifieraient bien la vie aux ( ! surdoués) de la programmation comme moi….

J’ai défini un compteur d’eau rapide sur in7, un switch en entrée 0 et des timers
void scenario(){
 if(on_ons(traitement_eau))||(((get_time()==1050)&&((compteur7)>=93000))){        
        if(! oneshot_0){ 
Serial.println("Lavage");
set_in8R8(0,0);
set_in8R8(0,1);
timer_0.q_ons et après ??
 
oneshot_0=true;
     }else
oneshot_0=false; // on reset le flag
  • jean-marc
  • Nophoto
  • OFFLINE
  • Senior Boarder
  • Rank2
  • Posts: 60
  • Thank you received: 1
  • Karma: 0
Last Edit: 11 Feb 2014 16:46 by gromain. Reason: balise code
The administrator has disabled public write access.

Programmation cyclique 11 Feb 2014 17:26 #2

Bonjour JM,

une approche simple serait la méthode du graphcet (G7), particulièrement pour piloter R2 et R3.

tu dessines sur papier un G7 qui décrit le besoin.
Par convention, on désignera une étape "x"

x0 (=étape 0=étape initiale):
action: aucune
x0 -> x1 si appui sur bouton ou heure atteinte

x1
action: R2 à 1 et attendre 5 min
x1 -> x2 si tempo1=5 min

x2
action: R2 à 0 et attendre 3 min
x2 -> x3 si tempo2=3 min

x3
action: R2 à 1 et attendre 52 min
x3 -> x0 si tempo3=52 min

ensuite, yapluka traduire ça en code.

Donc:
- créer les instances de tempos dans le customer
NUMBER_OF_TIMER 3 // number of TIMER instances

- initialiser les tempos
    TIMER[0].init(MINUTE,TON, 5);
    TIMER[1].init(MINUTE,TON, 3);
    TIMER[2].init(MINUTE,TON, 52);
- définir les variables étapes juste avant void scenario()
 
byte x0=true; // il faut initialiser le graphcet pour qu'il "attende" à l'étape 0
byte x1=false; // les autres étapes sont à faux
byte x2=false;
byte x3=false;
 
void scenario(){
(...)
}
 



- coder l'ossature du G7 (étape/transition)
 
void scenario(){
 
if(x0 && (appui sur le bouton || c'est l'heure)){ // on est à l'étape 0 et les conditions sont remplies, transition vers x1
	x0=false;
	x1=true;
}
 
if(TIMER[0].q_ons(x1)){ // on est à l'étape 1 depuis 5 min, transition vers x2
	x1=false;
	x2=true;
}
 
if(TIMER[1].q_ons(x2)){ // on est à l'étape 2 depuis 3 min, transition vers x3
	x2=false;
	x3=true;
}
 
if(TIMER[2].q_ons(x3)){ // on est à l'étape 3 depuis 52 min, retour à x0
	x3=false;
	x0=true;
}
 
(...)
}

- associer des actions aux étapes
 
void scenario(){
 
(...)
 
 
if(x0 || x2)
	mettre sortie R2 à 0
 
if(x1 || x3)
	mettre sortie R2 à 1
 
}

voilà dans les grandes lignes Wink

Romain
  • gromain
  • Avatar 2013 01 07
  • OFFLINE
  • Administrateur
  • Administrateur
  • Posts: 153
  • Thank you received: 10
  • Karma: 3
The administrator has disabled public write access.

Programmation cyclique 12 Feb 2014 21:08 #3

Merci Romain!

Ce graphcet, et la façon de le programmer, répond tout à fait à mes attentes Smile

Merci encore pour tes explications très claires, pour une fois j'ai tout compris et vais pouvoir avancer!
  • jean-marc
  • Nophoto
  • OFFLINE
  • Senior Boarder
  • Rank2
  • Posts: 60
  • Thank you received: 1
  • Karma: 0
The administrator has disabled public write access.
Backtotop