Mini Défi #4 : Bloc fonction pour clapet motorisé Résolu

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

🧠 Aujourd’hui, on passe à la création de logique propre et réutilisable.

 

🎯 Objectif :

Créer un bloc fonction (FB) en Structured Text ou Ladder, permettant de piloter un clapet motorisé à 2 positions avec :

🔸 Un ordre d’ouverture.
🔸 Un ordre de fermeture.
🔸 Un fin de course ouvert.
🔸 Un fin de course fermé.
🔸 Et une ou deux sorties moteur.

 

🛠️ Contraintes :

🔸 Ne pas permettre les deux ordres simultanés.
🔸 Gérer les fins de course pour ne pas surcommander un moteur arrivé en butée.
🔸 Bonus : prévoir une priorité ou une sécurité.

Réponses

18/06/2025 22:41

Allez, on se lance pour ce nouveau défi, en attendant commentaires et correction wink

//4 variables en entrées correspondant aux ordres externes rentrant dans le FB, à savoir  la commande TC d'ouverture/fermeture du clapet ainsi que le report TS de l'état des fins de course :
VAR_INPUT
    Cmd_Ouvrir     : BOOL;   // commande TC d’ouverture
    Cmd_Fermer     : BOOL;   // commande TC de fermeture
    FC_Ouvert     : BOOL;   // report TS de l'etat du fin de course ouvert
    FC_Ferme      : BOOL;   // report TS de fin de  course fermé
END_VAR

//2 variables en sortie du FB transmettant l'ordre d'ouverture/fermeture au moteur :
VAR_OUTPUT
    Moteur_Ouvrir  : BOOL;   // Sortie moteur pour ouverture
    Moteur_Fermer  : BOOL;   // Sortie moteur pour fermeture
END_VAR

//1 variable "integer" pour connaître la position du clapet :
VAR
    Etat_Clapet    : INT;    // 0 = Inconnu, 1 = Ouvert, 2 = Fermé, 3 = En mouvement
END_VAR

// Logique principale :
IF Cmd_Ouvrir AND NOT Cmd_Fermer THEN
    // On ne permet pas de rouvrir le clapet si déjà ouvert :
    IF NOT FC_Ouvert THEN
        Moteur_Ouvrir := TRUE;
        Moteur_Fermer := FALSE;
    ELSE
        Moteur_Ouvrir := FALSE;
    END_IF;

ELSIF Cmd_Fermer AND NOT Cmd_Ouvrir THEN
    // On ne permet pas de refermer le clapet si déjà fermé :
    IF NOT FC_Ferme THEN
        Moteur_Ouvrir := FALSE;
        Moteur_Fermer := TRUE;
    ELSE
        Moteur_Fermer := FALSE;
    END_IF;

ELSE
    //Si aucun ordre émis ou si double ordre alors pour sécurité :
    Moteur_Ouvrir := FALSE;
    Moteur_Fermer := FALSE;
END_IF;

19/06/2025 06:13

C'est un bon départ mais je pense que l'on pourrait factoriser certaines conditions.

21/06/2025 22:34

Je vais declare un UDT comme suit :

Apres dans mon FB :

et pour le code je peux ajouter plusieur ameliorations tel que lanimation du clapet dans la supervision ..... :

22/06/2025 15:24

Et si on commencait par quelque chose de simple ?
Les entrées :

Les sorties :

Le code :

A+

22/06/2025 19:32

Myda, si je comprends bien peut-on aussi rajouter un ordre ouverture en dessous du fdc fermeture pour reset la fermeture ? 🤔 

23/06/2025 07:34

📅 Correction du Mini-Défi #4 : Bloc fonction pour clapet motorisé

Bravo à toutes et tous pour vos propositions 👏 Ce défi était un vrai exercice de structuration logique, au cœur de ce qu'on attend d’un automaticien : créer des blocs fiables, lisibles et réutilisables.

 

🎯 Objectif rappelé :

Créer un bloc fonction (FB) pour piloter un clapet avec :

  • Ordre d’ouverture / fermeture
  • Fin de course ouvert / fermé

  • Sorties moteur

  • Protection contre ordres simultanés

 

✅ Exemple de solution en Structured Text :

 

🧠 Résultat :

  • On ne peut jamais activer les deux sorties moteur en même temps

  • Les fins de course bloquent les ordres inutiles

  • Le bloc est modulable et réutilisable

24/06/2025 07:17

@Koala097 : on pourrait ajouter l'ordre d'ouverture dans les conditions de reset de la fermeture. Ne pas le faire permet de garder la fermeture prioritaire dans le cas où on a les deux commandes en même temps.

26/06/2025 18:55

Bonsoir à tous , 

En espérant que vous allez tous bien ?

Y'a pas de mini defi cette semaine ?