«

»

déc 29

Fonction MultiClick, Click Long, Multi actions sur un poussoir [Codesys]

Beaucoup d’entre vous souhaitent utiliser un même poussoir (interrupteur) pour effectuer diverses actions, par exemple : simple click allume la luniere, double click met en marche la ventilation, et un appui long baisse les volets

 

Je savais que Gilles Sassatelli l’avais deja mis en place, et comme j’avais aussi besoin de cette fonction, et que en plus je suis feignant ;-) je lui ai demander de me faire part de son travail, je l’ai remise en forme (enfin je devrais dire a ma forme, chacun ses habitudes) et j’ai ajouter les commentaires afin que cela soit bien plus facile a comprendre

 

 

Le principe de la fonction est simple :

Quand vous presser le bouton affecté a la fonction (b_in) un timer est lancé et l’on va regarder ce qui ce passe pendant l’écoulement de ce timer

L’inconvénient est que sur une action ne prenant que très peut de temps, comme l’appui simple, il faudra attendre la fin du timer pour que l’action s’exécute ce qui entraine un petit temps mort lors de l’allumage d’une lampe

 

La fonction ne nécessite que la bibliothèque de fonction standart.lib, qui doit déjà être utilisé dans votre programme

 

Voyons comment est cette fonction, enfin plutôt ce bloc fonction

Cliquez sur l’image pour agrandir

 

Les Entrées

 

b_in : c’est la que vous raccorderez votre poussoir principal, celui sur lequel vous voulez affecter plusieurs actions

b_onli_Single : raccordez ici un poussoir optionnel qui permettra d’effectuer une impulsion sur la sortie PULSE_SINGLE, il n’y aura aucun délai

 

b_onli_Double : raccordez ici un poussoir optionnel qui permettra d’effectuer une impulsion sur la sortie PULSE_DOUBLE, il n’y aura aucun délai

 

t_Long : affectez un temps sur cette entrée (t#0.5S), c’est le temps impartie pour effectuer le double click, a partir duquel l’appui long est pris en compte, c’est aussi le temps mort avant l’execution du simple click

Dans mon cas j’ai fixé cette tempo a 0.5 seconde ce qui est largement suffisant pour un double clic et pas trop long au niveau du temps mort

 

Les Sorties

 

PULSE_SINGLE : enverra une impulsion lorsque seulement un seul pulse sur b_in aura été enregistré et que le timer t_long sera écoulé

 

PULSE_DOUBLE : enverra une impulsion lorsque deux pulse sur b_in auront été enregistré et que le timer t_long sera écoulé

 

LONG : Restera maintenue tant que b_in sera maintenue et que le timer t_long sera écoulé

 

PULSE_LONG :  enverra une impulsion lorsque b_in aura été maintenue plus longtemps que le timer t_long

 

 

Bien sur, cela va sans dire que l’utilisation de toute les entrées et de toute les sorties n’est que optionnel, vous utiliserez seulement ce dont vous avez besoin

 

 

Que ce passe t’il dans le bloc fonction

 

 

Variables utilisé dans la fonction, je vous passe le détail des VAR_INPUT et VAR_OUTPUT que l’on vient d’expliquer et que vous retrouverez dans l’exemple

 

VAR

Timer : TP; (* Timer pour effectuer les actions *)

cnt : INT; (* Compte le nombre d’impulsion donnée sur l’entré b_IN *)

last : BOOL; (* *)

END_VAR

 

 

Programme de la fonction

 

timer(in := b_IN, PT := t_LONG); (* Lors du premier appuie sur l’interupteur le timer est lancé *)

IF timer.Q THEN

(* Le timer est en cour d’ecoulent on regarde ce qui ce passe au niveau de l’entrée *)

IF NOT b_IN AND last THEN

cnt := cnt + 1; (* on compte le nombre d’impulsion, si on reste maintenue sur l’entrée le compteur ne change pas *)

END_IF;

ELSE

(* Quand le timer est ecoulé on va regarder ce que l’on a obtenue sur cnt, qui a compté le nombre d’impilsion*)

CASE cnt OF

0: PULSE_SINGLE:= b_onli_Single; PULSE_DOUBLE:=b_onli_Double; (* Le timer est ecoulé ou n’est pas en cour, il y a entré sur b_onli_Single ou b_onli_Double donc on va mettre la sortie SINGLE ou DOUBLE dans le meme état que l’entrée, la sortie est dans le meme état que l’entrée *)

1 : PULSE_SINGLE:= NOT( PULSE_SINGLE); (* On a compté une impulsion la sortie single est a 0 donc on met single a son etat inverse, l’etat restera valable 1 tour *)

2 : PULSE_DOUBLE := NOT( PULSE_DOUBLE); (* Comme pour le precedent *)

END_CASE;

cnt := 0; (* On remet le compteur d’impulsion a 0 *)

END_IF;

last := b_IN; (* last prend la valeur de b_IN *)

(* Le timer est ecoulé *)

PULSE_LONG := NOT timer.Q AND (NOT LONG) AND b_IN; (* Le timer est ecoulé, On a pas encore Long (qui sera activé dans une ligne) et on a toujours l’entrée, on aurat juste une impulsion sur cette sortie pendant un tour d’automate *)

LONG := NOT timer.Q AND b_IN; (* On met LONG a 1 quand le timer est ecoulé et que l’on a toujours l’entrée b_IN a 1 *) (* A utiliser pour un truc dont on a besoin de maintenir l’etat, par exemple descendre un volet roulant *)

 

 

Retrouver dans l’archive Codesys un petit exemple de l’utilisation de la fonction, comme vous pourrez le voir j’ai réutilisé le bloc fonction bascule qui avais deja été détaillé dans cet article

L’utilisation du bloc fonction a été faite en CFC qui est plutôt adapté a l’utilisation de bloc avec beaucoup d’entrée et de sortie comme celui-ci

 

Dans l’exemple vous trouverez une visu qui vous permettra d’effectuer la simulation, pour bien voir ce qui ce passe je vous incite a mettre en perspective la visu et le module PRG_CFC_UTILISATION

J’ai mis la tempo a 2sec vous pouvez ajuster sa valeur en cliquant simplement dessus

 

L’exemple est utilisable tel quel, pas besoin d’automate, charger l’archive dans Codesys qui contient tout ce dont vous avez besoin, puis il vous suffit d’aller dans le menu En Ligne, puis Accéder au système et enfin Démarrer

 

Pour ceux qui veulent récupérer une version de codesys vous pouvez vous rendre sur le site de wago et télécharger la version de démo  WAGO-IO-PRO DEMO en bas de page

 

 

N’hésitez pas a poser vos question dans les commentaires ci-dessous