Mini Défi 13 : Anti-rebond logiciel fiable
🔧 Contexte :
Tu travailles sur un pupitre de commande dans un atelier de convoyage.
Un bouton poussoir mécanique est utilisé pour activer une fonction importante (changement de mode, validation, etc.).
❗ Mais ce bouton rebondit :
À l’appui, son signal passe de 0 à 1 plusieurs fois en quelques millisecondes, provoquant des comportements imprévisibles (exécution multiple, clignotement…).
Problème :
➡️ Le bouton rebondit lors de l'appui.
➡️ Résultat : un seul appui génère parfois 2, 3, 4 signaux…
🎯 Objectif du défi :
Créer une solution logicielle robuste pour filtrer les rebonds et n’autoriser qu’un seul front montant par appui.
📜 Données :
-
Entrée numérique :
BP
(BOOL) -
Temps de filtrage recommandé :
50 ms
-
Aucun front parasite ne doit être pris en compte
-
Seul un appui net doit être validé
✅ Contraintes :
-
Le front rising (0→1) doit être détecté une seule fois par appui
-
L’anti-rebond doit être adaptable à d’autres entrées
-
Pas d’usage de blocs propriétaires de filtrage (genre
R_TRIG
avec délai interne) -
Le défi doit être portable entre marques/automates
💡 Bonus :
-
Écrire un FB
AntiRebond()
-
Ajouter une visualisation
etat_bouton
(Inactif, En Attente, Validé) -
Gérer les appuis prolongés ou rebonds inversés
-
Prévoir une protection contre le maintien prolongé
Réponses
IF BP THEN
TON_0(IN := TRUE, PT := T#50ms);
ELSE
TON_0(IN := FALSE);
END_IF;
IF TON_0.Q THEN
BP_Stable := TRUE;
ELSE
BP_Stable := FALSE;
END_IF;
BP_OK := BP_Stable AND NOT BP_Old;
BP_Old := BP_Stable;
BP := TEEST;