Test Station Setup

Arrêt d'urgence et verrouillage d'un banc

Câblez un arrêt d'urgence et un dispositif de verrouillage du protecteur sur un banc moteur, puis arrêtez la procédure proprement en traçant la cause.

JJulien Buteau
intermediate10 min de lecture27 octobre 2026

Un banc de test moteur avec des pièces en rotation a besoin de deux fonctions de protection indépendantes du logiciel de test : un arrêt d'urgence qui coupe l'énergie, et un dispositif de verrouillage du protecteur qui empêche le moteur de tourner tant que le protecteur est ouvert. Apprenez à câbler les deux en matériel, pourquoi un arrêt logiciel ne les remplace pas, et comment transmettre leur état à une procédure TofuPilot pour qu'elle refuse de démarrer protecteur ouvert et enregistre un arrêt propre quand l'arrêt d'urgence est actionné.

Pourquoi un arrêt logiciel n'est pas une fonction de sécurité

Un PC de test peut arrêter un moteur en commandant un gaz nul. Cette commande traverse le système d'exploitation, l'interpréteur Python, le processus du plug, une liaison USB ou série, et le firmware du microcontrôleur. N'importe lequel peut se bloquer, planter ou être occupé au moment où l'arrêt est nécessaire. Aucun n'a été conçu ni validé comme partie relative à la sécurité d'un système de commande.

Arrêt logicielFonction de sécurité
CheminPC, OS, Python, USB, firmwareContacts, relais de sécurité, contacteurs
Comportement en défautPeut échouer sans signe (processus bloqué, liaison perdue)Conçu pour aller vers l'état sûr, défauts détectés
NormeAucuneISO 13849-1 (niveau de performance), ISO 13850, ISO 14119
Rôle sur le bancDonnées propres, ralentissement contrôléSupprimer l'énergie dangereuse

Gardez l'arrêt logiciel : il ralentit proprement le moteur et enregistre ce qui s'est passé. Ne le comptez pas comme mesure de protection. L'ISO 13850 traite de la fonction d'arrêt d'urgence, l'ISO 14119 des dispositifs de verrouillage associés aux protecteurs, et l'ISO 13849-1 fixe la fiabilité exigée des parties de commande relatives à la sécurité, exprimée en niveau de performance (PL a à e). Le niveau requis (PLr) découle de l'appréciation du risque de votre banc.

Câbler la chaîne matérielle

La chaîne de protection ouvre le circuit de puissance de l'ESC sans passer par le PC de test. Une architecture courante utilise un relais de sécurité qui surveille deux canaux par dispositif d'entrée et commande deux contacteurs en série :

safety-chain.txt
E-stop (2 NC channels) -------+Guard switch (2 NC channels) -+--> Safety relay --> K1 + K2 (DC contactors in series) --> ESC busReset button (NO) ------------+          ^                                         |           K1/K2 mirror contacts (NC) ---+   feedback loop: relay will not reset if a contactor is weldedAuxiliary contacts (non-safety) --> digital inputs --> test PC (read only)

Chaque élément a un rôle précis :

  • Dispositif d'arrêt d'urgence (ISO 13850). Organe de commande rouge sur fond jaune, à accrochage mécanique, contacts à manœuvre positive d'ouverture, accessible depuis le poste de l'opérateur. Le déverrouiller ne redémarre rien : cela autorise seulement un réarmement.
  • Relais de sécurité. Surveille les deux canaux de chaque dispositif, détecte un court-circuit entre canaux ou un canal qui ne s'ouvre pas, et refuse le réarmement tant que les entrées ne sont pas revenues à l'état sûr et que le bouton de réarmement n'est pas actionné.
  • Contacteurs K1 et K2. Dimensionnés pour couper du continu à la tension et au courant du bus. Un arc en continu ne s'éteint pas au passage par zéro, donc un calibre alternatif n'est pas un calibre continu. Deux en série apportent la redondance ; leurs contacts miroirs (liés mécaniquement aux contacts principaux) sont câblés en retour vers le relais pour qu'un contacteur soudé soit détecté au réarmement suivant.
  • Bouton de réarmement. Placé là où l'opérateur voit la zone dangereuse. Un réarmement rétablit l'énergie ; il ne doit pas démarrer le moteur.

Un canal ou deux, le choix du relais et des contacteurs découlent du PLr. Des entrées à deux canaux avec contacteurs surveillés sont une façon courante d'atteindre les niveaux les plus élevés ; vérifiez le PL atteint avec le calcul de l'ISO 13849-1 (l'outil gratuit SISTEMA de l'IFA l'implémente).

Choisir la catégorie d'arrêt

L'IEC 60204-1 (EN 60204-1) définit des catégories d'arrêt, et l'ISO 13850 exige que l'arrêt d'urgence soit de catégorie 0 ou 1 :

CatégorieComportementSur un banc moteur
0Coupure immédiate de l'énergieLes contacteurs s'ouvrent aussitôt ; le rotor ralentit en roue libre
1Arrêt contrôlé avec énergie disponible, puis coupureLe gaz descend à zéro avec freinage, une sortie temporisée du relais ouvre les contacteurs après un délai fixe

La catégorie 0 est plus simple. Deux conséquences sont à traiter :

  • Le rotor continue de tourner. Avec une hélice, la roue libre dure plusieurs secondes. Le protecteur doit contenir le rotor pendant ce temps, et si le protecteur peut être ouvert avant l'arrêt du rotor, le dispositif de verrouillage doit comporter un blocage du protecteur (ISO 14119) : le protecteur reste bloqué jusqu'à l'écoulement du temps d'arrêt ou la confirmation de l'arrêt.
  • La régénération côté ESC. Une fois les contacteurs ouverts, l'énergie renvoyée par le rotor qui ralentit n'a d'autre destination que les condensateurs d'entrée de l'ESC. Placez la résistance de freinage ou l'écrêteur côté ESC des contacteurs. Voir le guide sur la gestion du freinage régénératif sur un banc de test.

La catégorie 1 freine le rotor plus vite mais suppose que l'ESC reste alimenté pendant le délai ; sa partie commande doit atteindre le même PLr.

Ajouter un dispositif de verrouillage du protecteur

L'ISO 14119 classe les dispositifs de verrouillage selon le codage de l'actionneur :

TypeActionneurRemarques
Type 1Mécanique non codé (came sur charnière, poussoir)Simple, plus facile à neutraliser
Type 2Languette mécanique codéePlus difficile à neutraliser avec un outil
Type 4Sans contact codé (RFID, magnétique)Tolère un désalignement du protecteur, codage élevé ou individuel disponible

Montez l'interrupteur de façon qu'il ne puisse pas être neutralisé avec un objet simple, et que le protecteur ne puisse pas être retiré sans outil pendant que l'interrupteur reste fermé. Le protecteur lui-même (ISO 14120) doit retenir les pièces susceptibles d'être projetées : une pale d'hélice rompue est un projectile. Câblez le dispositif de verrouillage dans le même relais de sécurité que l'arrêt d'urgence, pas dans le PC de test.

Lire l'état de sécurité depuis la procédure

Le logiciel de test lit l'état de la chaîne de sécurité par des contacts auxiliaires : les sorties auxiliaires du relais de sécurité, ou les contacts auxiliaires de l'arrêt d'urgence, de l'interrupteur de protecteur et des contacteurs. Ces signaux ne font pas partie de la fonction de sécurité. Le PC les lit ; il n'écrit jamais dans le circuit de sécurité.

Trois entrées suffisent pour la plupart des bancs :

EntréeSignification à l'état haut
estop_releasedL'arrêt d'urgence n'est pas actionné
guard_closedL'interrupteur de protecteur est fermé
power_enabledLe relais de sécurité est réarmé et les contacteurs sont fermés

Le plug ci-dessous les lit depuis un microcontrôleur qui renvoie ses entrées numériques sous forme de masque binaire. Le protocole est un exemple ; remplacez-le par le pilote de votre module d'E/S :

plugs/safety_inputs.py
19 lines
import serialBITS = {"estop_released": 0, "guard_closed": 1, "power_enabled": 2}class SafetyInputs:    def __init__(self, port):        self._ser = serial.Serial(port, 115200, timeout=0.5)    def read_inputs(self):        # Protocole d'exemple : "IO?" renvoie le masque des entrées sous forme d'entier        self._ser.write(b"IO?")        mask = int(self._ser.readline().decode().strip())        return {name: bool(mask >> bit & 1) for name, bit in BITS.items()}    def __del__(self):        self._ser.close()

La procédure vérifie la chaîne dans une phase de setup, pour que les phases principales ne démarrent jamais protecteur ouvert, et continue de la surveiller pendant que le moteur tourne :

procedure.yaml
41 lines
name: Motor Endurance Runversion: 0.1.0config:  SAFETY_IO_PORT:    required: true  DSHOT_PORT:    required: trueexecution:  workers: 1plugs:  - name: Safety Inputs    key: safety    python: plugs.safety_inputs:SafetyInputs    scope: station    with:      port: "{config.SAFETY_IO_PORT}"  - name: DShot Driver    key: motor    python: plugs.dshot_driver:DshotDriver    with:      port: "{config.DSHOT_PORT}"      motor_index: 0setup:  - name: Check Safety Chain    python: phases.safety:check_safety_chain    timeout: 10smain:  - name: Endurance Run    python: phases.endurance:endurance_run    with:      throttle: 50.0      duration_s: 60teardown:  - name: Zero Throttle    python: phases.endurance:zero_throttle

La phase de setup arrête le run dès qu'une entrée est dans l'état non sûr. phase.stop() termine le run en aborted, pas en fail, donc une condition du banc n'est pas comptée comme un défaut de l'unité ; le CLI sort avec le code 3 pour un run arrêté par la procédure elle-même :

phases/safety.py
21 lines
MESSAGES = {    "estop_released": "E-stop is pressed. Release it, reset the safety relay, then start again.",    "guard_closed": "Guard is open. Close it, then start again.",    "power_enabled": "Safety relay is not reset. Press reset, then start again.",}def first_open_input(state):    for name in ("estop_released", "guard_closed", "power_enabled"):        if not state[name]:            return name    return Nonedef check_safety_chain(phase, log, run, safety):    state = safety.read_inputs()    log.info(f"Safety inputs: {state}")    reason = first_open_input(state)    if reason:        run.metadata["stop_reason"] = f"{reason}_false_at_start"        phase.stop(MESSAGES[reason])

La phase principale interroge les entrées pendant que le moteur tourne. Quand la chaîne s'ouvre, le matériel a déjà coupé l'énergie ; la phase met le gaz à zéro pour que le moteur ne redémarre pas en vitesse après un réarmement, enregistre la raison et l'instant de l'arrêt, puis s'arrête :

phases/endurance.py
22 lines
import timefrom phases.safety import first_open_inputdef endurance_run(phase, log, run, motor, safety, throttle, duration_s):    start = time.monotonic()    motor.set_throttle(throttle)    while (elapsed := time.monotonic() - start) < duration_s:        reason = first_open_input(safety.read_inputs())        if reason:            motor.set_throttle(0.0)            run.metadata["stop_reason"] = f"{reason}_false"            run.metadata["stop_at_s"] = round(elapsed, 2)            log.warning(f"Safety chain opened after {elapsed:.2f} s: {reason} is false")            phase.stop(f"Safety chain opened: {reason} is false")        time.sleep(0.05)    motor.set_throttle(0.0)def zero_throttle(motor):    motor.set_throttle(0.0)

L'échelon de gaz à 50 % est gardé court pour la lisibilité ; appliquez une rampe sur un vrai banc pour éviter les pics de courant. La phase de teardown s'exécute toujours, même après un arrêt, donc la consigne moteur revient à zéro dans tous les cas. Le plug DshotDriver est celui du guide sur le dimensionnement de l'alimentation d'un banc moteur.

Sur le dashboard, les runs interrompus portent les métadonnées stop_reason et stop_at_s : vous pouvez les filtrer et voir à quelle fréquence l'arrêt d'urgence ou le protecteur interrompt un test, sur quel poste et avec quel opérateur. Un nombre croissant sur un poste signale un interrupteur de protecteur mal réglé ou une étape de procédure qui oblige à ouvrir le protecteur.

Pièges courants

Câbler l'arrêt d'urgence uniquement sur une entrée numérique du PC. Le PC lit le bouton, mais rien ne coupe l'énergie si le logiciel se bloque. L'arrêt d'urgence doit ouvrir le circuit de puissance par le relais de sécurité et les contacteurs.

Utiliser des contacteurs alternatifs sur le bus continu. Un arc en continu ne s'éteint pas au passage par zéro. Utilisez des contacteurs dimensionnés pour couper du continu à la tension et au courant de votre bus.

Laisser le retour des contacteurs non câblé. Un contacteur soudé passe inaperçu et l'arrêt d'urgence suivant ne coupe l'énergie que par un seul canal. Câblez les contacts miroirs dans la boucle de retour du relais.

Ouvrir le circuit de puissance en amont de la résistance de freinage. L'énergie régénérée fait alors monter le bus côté ESC. Placez le chemin de freinage côté ESC des contacteurs.

Enregistrer une mesure en échec avant phase.stop(). Une mesure en échec est prioritaire et le run apparaît en fail, compté contre l'unité. Arrêtez d'abord, ou n'enregistrez pas la mesure.

Redémarrer le moteur au réarmement. Un réarmement ne doit que rétablir l'énergie. La procédure remet le gaz à zéro à chaque arrêt, et un opérateur lance un nouveau run.

Points clés

  • L'arrêt d'urgence (ISO 13850) et le dispositif de verrouillage du protecteur (ISO 14119) coupent l'énergie en matériel par un relais de sécurité et des contacteurs continus ; le PC de test ne fait pas partie de la fonction de sécurité.
  • Le niveau de performance requis découle de l'appréciation du risque ; vérifiez le PL atteint avec l'ISO 13849-1.
  • Choisissez délibérément la catégorie d'arrêt 0 ou 1, et traitez la roue libre et la régénération côté ESC.
  • Ramenez les contacts auxiliaires sur des entrées numériques pour que la procédure lise l'état de sécurité, sans jamais le piloter.
  • Une phase de setup qui appelle phase.stop() refuse de démarrer protecteur ouvert ; une phase principale surveillée enregistre un run interrompu avec sa raison au lieu d'un faux défaut de l'unité.

Plus de guides

Mettez ce guide en pratique