Mini Défi #2 : Le compteur fantôme Résolu

Maitre du Jeu 10/06/2025 Apprentissage PLC > Exercices et projets d'entraînement

🔍 Contexte :

Un opérateur se plaint que le compteur de cycles ne s’incrémente pas correctement à chaque appui sur le bouton.
Parfois il ne compte pas, parfois il compte plusieurs fois pour un seul appui.

Voici l'extrait du programme en Structured Text :

Et sa version en Ladder :

➡️ Mission :

Analyse ce comportement étrange et propose une correction fiable pour que chaque appui soit comptabilisé une seule fois.

💬 Partage ta solution en commentaire, ou propose ta variante !

🧠 Solution officielle révélée jeudi, avec validation d’une réponse et gain d’XP 🔥
💎 N’oublie pas : chaque like sur ta réponse te fait gagner de l’XP, et la meilleure solution est doublée.

Réponses

10/06/2025 13:47

L'utilisation d'une détection de front montant me semble la solution la plus simple...

Comme ça, fini les comptages multiples ! 

10/06/2025 21:31

Bonsoit à tous , 

Ma proposition de code suivant le mini cahier de charge.

if re(bouton) then
compteur :=compteur+1;
End_if;
IF RE (RESET)  then
compteur :=0;
End_if;

10/06/2025 23:32

(* fonction compteur *)

Je vais rester sur ma deuxieme proposition , je n'avais jamais fais attention en st les fonction (RE et FE ne semble faire le job que je souhaite a la pace on a le R_TRIG)

R_TRIG_4 (CLK := (bouton),
          Q => TrigDone);
      if TrigDone  then 
      compteur:= compteur + 1 ;
      End_IF ;

      If reset THEN
      compteur:= 0 ;
        End_IF ;

12/06/2025 06:40

📅 Correction du Mini-Défi

Merci à tous pour vos propositions ! Ce bug est un grand classique en ST (et en Ladder) : un bouton appuyé une seule fois… mais qui fait grimper le compteur plusieurs fois ! 😵‍💫

 

👉 Ce code incrémente le compteur à chaque cycle tant que le bouton reste appuyé.
Or un automate peut exécuter des dizaines de cycles par seconde, donc un seul appui peut faire monter le compteur de 3, 5, voire 20 unités selon le matériel.

 

💡 Solution : utiliser un front montant

Ci-dessous un exemple de gestion d'un front montant sans utiliser de fonction pré-existante.

🔹 bouton_prec mémorise l’état précédent
🔹 front ne vaut TRUE qu’un seul cycle, au moment du changement 0 → 1
✅ Résultat : 1 appui = 1 incrément 👍

 

Et sa version Ladder :

 

🎯 Le bon réflexe ? Toujours isoler l’événement du signal continu pour éviter les bugs liés au cycle de l’automate.