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 logiciel | Fonction de sécurité | |
|---|---|---|
| Chemin | PC, OS, Python, USB, firmware | Contacts, relais de sécurité, contacteurs |
| Comportement en défaut | Peut échouer sans signe (processus bloqué, liaison perdue) | Conçu pour aller vers l'état sûr, défauts détectés |
| Norme | Aucune | ISO 13849-1 (niveau de performance), ISO 13850, ISO 14119 |
| Rôle sur le banc | Donné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 :
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égorie | Comportement | Sur un banc moteur |
|---|---|---|
| 0 | Coupure immédiate de l'énergie | Les contacteurs s'ouvrent aussitôt ; le rotor ralentit en roue libre |
| 1 | Arrêt contrôlé avec énergie disponible, puis coupure | Le 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 :
| Type | Actionneur | Remarques |
|---|---|---|
| Type 1 | Mécanique non codé (came sur charnière, poussoir) | Simple, plus facile à neutraliser |
| Type 2 | Languette mécanique codée | Plus difficile à neutraliser avec un outil |
| Type 4 | Sans 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ée | Signification à l'état haut |
|---|---|
estop_released | L'arrêt d'urgence n'est pas actionné |
guard_closed | L'interrupteur de protecteur est fermé |
power_enabled | Le 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.py19 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.yaml41 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_throttleLa 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.py21 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.py22 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é.
