Automatisme / API

Pourquoi votre automate Siemens a des comportements fantômes ? (Et comment y remédier)

F
Franck G♥INI
1 juillet 202612 MIN READ
34
Pourquoi votre automate Siemens a des comportements fantômes ? (Et comment y remédier)

Cet article explore les "bugs fantômes" dans les automates programmables industriels (PLC), souvent causés par des situations de compétition (race conditions). Il explique le mécanisme de ces erreurs, leur lien avec le cycle scan du PLC et les interactions IHM/SCADA/tâches d'interruption. Des solutions pratiques pour TIA Portal (Siemens) sont présentées pour garantir la robustesse du code.

L'énigme du bug fantôme à l'usine 👻

Imaginez la scène : votre ligne de production tourne à merveille, ronronnante de précision pendant des semaines. Les capteurs s'activent, les moteurs démarrent, les vérins s'étendent avec la régularité d'une horloge suisse. Puis, sans crier gare, un événement inattendu se produit. Un vérin sort au mauvais moment, un moteur refuse obstinément de démarrer, ou une vanne s'ouvre alors qu'elle devrait rester fermée. Le coupable ? Invisible. Le symptôme ? Fugace. Un simple redémarrage de l'automate, et le problème disparaît, comme par magie. Impossible de le reproduire, de l'isoler, de le pister.

Cette situation frustrante est le cauchemar de tout automaticien. On soupçonne la mécanique, l'électricité, puis finalement, le désespoir s'installe. Mais si je vous disais que bien souvent, ce n'est ni la mécanique fatiguée, ni un composant électrique défaillant ? Le véritable coupable est bien plus insidieux : c'est un problème logique, un dysfonctionnement de la temporalité dans l'exécution de votre programme. Bienvenue dans le monde des situations de compétition, plus connues sous leur nom anglais de « race conditions ».

C'est quoi une "Race Condition" ? La théorie simple 🏃‍♂️💨

Pour comprendre une race condition, pensons à une situation simple de la vie courante. Imaginez que deux personnes tentent d'écrire sur le même tableau blanc exactement au même moment, sans coordination. La première personne efface un message, la seconde essaie d'écrire par-dessus. Le résultat final sur le tableau sera imprévisible : un mélange illisible, une partie du message manquant, ou l'une des écritures écrasant l'autre. C'est exactement ce qui se passe lorsqu'un système informatique tente d'accéder et de modifier une même donnée partagée par plusieurs entités concurrentes (tâches, programmes, processus) en même temps et sans synchronisation adéquate. Le résultat dépend alors de l'ordre d'exécution, qui est aléatoire, rendant le comportement non déterministe.

Il est important de distinguer rapidement la race condition du « deadlock » (interblocage). Dans un deadlock, deux ou plusieurs processus attendent indéfiniment l'un sur l'autre pour libérer une ressource, ce qui a pour effet de figer complètement le système. Un automate en deadlock sera figé, sans mouvement. Une race condition, elle, ne bloque pas forcément le système ; elle conduit plutôt à des résultats incorrects, imprévisibles, et souvent intermittents. L'automate continue de tourner, mais fait des bêtises, le rendant bien plus difficile à diagnostiquer.

Pourquoi le monde du PLC est-il concerné ? 🏭

Les automates programmables industriels (PLC) sont conçus pour être robustes et déterministes. Leur fonctionnement repose sur un principe fondamental : le cycle scan. Ce cycle se déroule en trois étapes principales et répétitives : Lecture des entrées physiques, Traitement du programme utilisateur avec ces entrées et les mémoires internes, puis Écriture des sorties physiques. Ce mécanisme, via la « mémoire image » des entrées/sorties (PII/PQI), offre une protection intrinsèque : pendant que le programme est exécuté, les valeurs des entrées sont figées, et les sorties ne sont mises à jour qu'à la fin du cycle, garantissant une cohérence interne du programme face aux fluctuations du monde réel.

Cependant, cette belle protection montre ses limites dès que l'on introduit des sources d'accès aux données hors du cycle scan principal ou qui le coupent. Deux scénarios classiques créent des fenêtres de vulnérabilité où des race conditions peuvent apparaître : premièrement, lorsqu'un écran IHM (Interface Homme-Machine) ou un système SCADA (Supervisory Control And Data Acquisition) écrit dans un bloc de données (DB) de l'automate au milieu du cycle de balayage du programme principal. Le programme peut alors lire une donnée partielle ou modifiée pendant qu'il l'utilise. Deuxièmement, les tâches d'interruption (comme les OB30, OB35, OB40 chez Siemens), qui coupent littéralement la parole au programme principal pour exécuter des routines prioritaires. Si cette tâche d'interruption modifie une variable que le programme principal était en train de lire ou de calculer, c'est la porte ouverte aux incohérences et aux comportements fantômes. Pour plus de détails sur le fonctionnement général des automates, vous pouvez consulter des ressources comme la page du support Siemens Industry Online.

Comment s'en protéger sur TIA Portal (Siemens) ? 🛠️

La bonne nouvelle, c'est que des stratégies existent pour blinder votre code face aux race conditions, notamment dans l'environnement TIA Portal de Siemens. L'une des astuces les plus efficaces est le concept de « buffer » pour les variables venant d'une IHM ou d'un SCADA. Au lieu d'utiliser directement la variable IHM dans votre logique, recopiez-la dans une variable locale (une sorte de copie figée pour le cycle) au tout début de votre OB1 ou de la fonction qui va l'utiliser. Cela garantit que toutes les lectures et calculs de ce cycle se feront sur une donnée cohérente, même si l'IHM la modifie en arrière-plan pendant l'exécution du cycle.

CODE
// Exemple SCL : Utilisation d'un buffer pour une variable IHM
FUNCTION_BLOCK "FB_GestionMoteur"
VAR_INPUT
Moteur_Commande_IHM : Bool; // Variable IHM, susceptible de changer à tout moment
END_VAR
VAR_OUTPUT
Moteur_Actif : Bool;
END_VAR
VAR
Moteur_Commande_Local : Bool; // Buffer local, lu une fois par cycle
END_VAR
BEGIN
// Étape 1 : Bufférisation de la variable IHM au début du cycle
// Cette variable locale est lue une seule fois et reste stable pour ce cycle.
Moteur_Commande_Local := Moteur_Commande_IHM;

// Étape 2 : Utilisation de la variable locale pour la logique du moteur
IF Moteur_Commande_Local THEN
// Logique de démarrage du moteur
Moteur_Actif := TRUE;
ELSE
// Logique d'arrêt du moteur
Moteur_Actif := FALSE;
END_IF;

// Autres logiques de sécurité, interverrouillage, etc., utilisant Moteur_Commande_Local
END_FUNCTION_BLOCK

Une autre technique pour protéger les sections critiques de votre code contre les interruptions est l'utilisation des instructions de masquage d'interruptions. Chez Siemens, vous pouvez utiliser les fonctions `DIS_INT` (Disable Interrupts) et `EN_INT` (Enable Interrupts) autour d'un bloc de code sensible. Cela garantit que pendant l'exécution de ces lignes, aucune tâche d'interruption (OB3x, OB4x, etc.) ne pourra s'exécuter et potentiellement corrompre les données sur lesquelles vous travaillez. Cependant, ces instructions sont à utiliser avec parcimonie et discernement, car elles peuvent affecter le temps de réponse global de l'automate si elles sont utilisées trop largement ou trop longtemps. Pour comprendre le fonctionnement du cycle scan de manière plus générale, vous pouvez consulter des explications comme celles fournies par AutomationDirect.

Enfin, un piège classique du débutant à éviter absolument pour ne pas court-circuiter la sécurité du cycle scan est l'accès direct aux périphériques (le fameux `%I0.0:P` ou `%Q0.0:P`). Cette syntaxe force la lecture ou l'écriture directe d'une entrée/sortie physique, en contournant la mémoire image. Bien que cela puisse sembler offrir une lecture plus "fraîche" d'une entrée, cela supprime la protection temporelle et la cohérence offerte par le cycle scan, rendant votre programme vulnérable à des lectures intermittentes et erronées si l'état de l'entrée change pile au moment de la lecture directe. Préférez toujours l'accès via la mémoire image (par exemple, `%I0.0`) qui est mise à jour de manière cohérente au début et à la fin de chaque cycle.

Conclusion : Le secret d'un code industriel robuste 🔒

En somme, un bon automaticien ne se contente pas d'écrire un programme qui fonctionne sur le banc d'essai ou lors des premiers tests. Il conçoit un code qui est résilient au facteur temps, qui anticipe les asynchronismes et les accès concurrents. Comprendre les race conditions et savoir comment les mitiger est la marque d'un code industriel mature et fiable. C'est la garantie que votre machine ne se contentera pas de tourner, mais qu'elle le fera avec la prévisibilité et la robustesse attendues d'un système industriel.

Éliminer les bugs fantômes, c'est transformer l'aléatoire en déterministe, et l'angoisse de la panne inexplicable en la satisfaction d'une production fluide et sans surprise. C'est le véritable secret d'un code industriel robuste, capable de résister aux assauts des imprévus temporels.

34

Commentaires

Laisser un commentaire

0/2000

* Les commentaires sont modérés avant publication.

Chargement des commentaires...