:lang: fr
:toc:

= LinuxCNC et HAL

[[cha:LinuxCNC-et-HAL]]

Voir également la man page 'motion(9)'.

[[sec:Motion]]
== motion (temps réel)
(((Motion)))

Ces pins et paramètres sont créés par le module temps réel 'motmod'.
Ce module fourni une interface vers HAL pour le planificateur de mouvements de
 LinuxCNC. En gros, motmod prends dans une liste de points de cheminement
et génère un flux de positions respectant les limites de contrainte des 
articulations. Ce flux sera reçu simultanément par tous les pilotes de moteurs.

Optionnellement le nombre d'E/S numériques est fixé avec 'num_dio'.
Le nombre d'E/S analogiques est fixé avec 'num_aio'. Le nombre par défaut est 4
de chaque.

Les noms de pin commençant par 'axis' sont actuellement des valeurs 
d'articulations, mais les pins et les paramètres sont également appelés 'axis.N'.
Ils sont lus et mis à jour par la fonction 'motion-controller'.

'motion' est chargé par la commande 'motmod'.
La cinématique doit être chargée avant motion.

----
loadrt motmod [base_period_nsec=period] [servo_period_nsec=period] \
[traj_period_nsec=period] [num_joints=[0-9] ([num_dio=1-64] num_aio=1-16])]
----

* 'base_period_nsec = 50000' - période de 'Base' des tâches, en nanosecondes.
  C'est le 'thread' le plus rapide de la machine.

[NOTE]
Sur les systèmes à base de servomoteurs, il n'y a généralement aucune raison 
d'avoir une valeur 'base_period_nsec' inférieure à celle de 'servo_period_nsec'.
Sur les machines avec une génération de pas logicielle, la valeur de
'base_period_nsec' détermine le nombre maximum de pas par seconde. En l'absence
de la nécessité d'une grande durée de pas ou d'un grand écart entre pas, le
taux maximum de pas est de un pas par 'base_period_nsec'. Ainsi, la
_base'period'nsec_ ci-dessus donnera un taux maximum absolu de 20000 pas
par seconde. 50000ns (50 µs) est une valeur assez prudente. La plus petite
valeur utilisable est relative au résultat du test de latence, à la
longueur de pas nécessaire et à la vitesse du processeur.
Choisir une 'base_period_nsec' trop basse peut entrainer l'arrivée du message
"Unexpected real time delay" ou "délai temps réel inattendu", le blocage de la
machine ou son redémarrage spontané.

* 'servo_period_nsec = 1000000' - C'est la période de la tâche 'Servo' en
  nanosecondes. Cette valeur doit être arrondie à un entier multiple de 
  'base_period_nsec'. Cette période est utilisée même sur les systèmes à
  moteurs pas à pas.
+
C'est la vitesse à laquelle sont calculées les nouvelles positions des moteurs,
que l'erreur de suivi est calculée, que les valeurs de sortie des PID sont
rafraichies et ainsi de suite. Les valeurs par défaut conviennent pour la
plupart des systèmes. C'est le taux de rafraichissement du planificateur de 
mouvement de bas niveau.

* 'traj_period_nsec = 100000' - C'est la période, en nanosecondes, du
  planificateur de mouvement. Cette valeur doit être arrondie à un entier
  multiple de 'servo_period_nsec'. Excepté pour les machines ayant une 
  cinématique particulière (ex: hexapodes) cette valeur n'a pas de raison
  d'être supérieure à celle de 'servo_period_nsec'.

=== Options

Si le nombre d'entrées/sorties numériques demandées est supérieur à la valeur
par défaut de 4, il est possible d'en ajouter jusqu'à 64 en utilisant
l'option num_dio au chargement de motmod.

Si le nombre d'entrées/sorties analogiques demandées est supérieur à la
valeur par défaut de 4, il est possible d'en ajouter jusqu'à 16 en utilisant
l'option num_aio au chargement de motmod.

=== Pins (((motion (hal pins))))

* 'motion.adaptive-feed' - 
     (float, in) Quand la vitesse est placée en mode adaptatif avec
    'M52 P1' la vitesse commandée est multipliée par cette valeur. Cet
    effet est
     multiplicatif avec 'motion.feed-hold' et la valeur du correcteur de
    vitesse du niveau NML.
    Les valeurs de 'motion.adaptive-feed' doivent être dans comprises
    entre -1 (pleine vitesse arrière) et 1 (pleine vitesse). Une valeur du nulle
    correspond à l'arrêt du mouvement.

* 'motion.analog-in-00' - 
     (float, in) Ces pins (00, 01, 02, 03 ou plus si configurées) sont
    contrôlées par 'M66'.

* 'motion.analog-out-00' - 
     (float, out) Ces pins (00, 01, 02, 03 ou plus si configurées) sont contrôlées par 'M67' ou 'M68'. 

* 'motion.coord-error' - 
     (bit, out) TRUE quand le mouvement est en erreur, ex: dépasser une
    limite logicielle.

* 'motion.coord-mode' - 
     (bit, out) TRUE quand le mouvement est en 'mode coordonnées' par
    opposistion au 'mode téléopération'.

* 'motion.current-vel' - 
    (float, out) La vitesse courante de l'outil.

* 'motion.digital-in-00' - 
     (bit, in) Ces pins (00, 01, 02, 03 ou plus si configurées) sont contrôlées par 'M62' à 'M65'. 

* 'motion.digital-out-00' - 
    (bit, out) Ces pins (00, 01, 02, 03 ou plus si configurées) sont controlées par 'M62' à 'M65'.

* 'motion.distance-to-go' - 
    (float, out) Distance restante pour terminer le mouvement courant.

* 'motion.enable' - 
     (bit, in) Si ce bit devient FALSE, les mouvements s'arrêtent, la
    machine est placée dans l'état “machine arrêtée” et un message est
    affiché pour l'opérateur. En fonctionnement normal, ce bit devra être
    mis TRUE.

* 'motion.feed-hold' - 
     (bit, in) Quand la vitesse est placée en mode arrêt contrôlé avec
    'M53 P1' et que ce bit est TRUE, la vitesse est fixée à 0.

* 'motion.motion-inposition' - 
    (bit, out) TRUE si la machine est en position.

* 'motion.motion-enabled' - 
    (bit, out) TRUE quand l'état de la machine est 'machine on'.

* 'motion.on-soft-limit' - 
    (bit, out) TRUE quand la machine est sur une limite logicielle.

* 'motion.probe-input' - 
     (bit, in) 'G38.x' utilise la valeur de cette pin pour déterminer
    quand la sonde de mesure a touché. TRUE le contact de la sonde est fermé
    (touche), FALSE le contact de la sonde est ouvert.

* 'motion.program-line' - 
     (s32, out) La ligne en cours d'exécution pendant le déroulement du programme. 
    Zéro si pas en marche ou entre deux lignes, pendant le changement de pas de programme.

* 'motion.requested-vel' - 
     (float, out) La vitesse courante requise en unités utilisateur par seconde selon le réglage F=n du fichier G-code. Les correcteurs de vitesse et autres ajustements ne s'appliquent pas à cette pin.

* 'spindle.N.at-speed' - 
     (bit, in) Les mouvements passent en pause tant que cette pin est TRUE,
    sous les conditions suivantes: avant le premier mouvement d'avance
    suivant chaque démarrage de broche ou changement de vitesse; après le
    démarrage de tout enchainement de mouvements avec broche synchronisée;
    et si en mode CSS, à chaque transition avance rapide -> avance travail.
    Cette entrée peut être utilisée pour s'assurer que la broche a atteint
    sa vitesse, avant de lancer un mouvement d'usinage. Elle peut également
    être utilisée sur un tour travaillant en mode CSS, au passage d'un
    grand diamètre à un petit, pour s'assurer que la vitesse a été
    suffisamment réduite avant la prise de passe sur le petit diamètre et
    inversement, lors du passage d'un petit diamètre vers un grand, pour
    s'assurer que la vitesse a été suffisamment augmentée. Beaucoup de
    variateurs de fréquence disposent d'une sortie 'vitesse atteinte'.
    Sinon, il est facile de générer ce signal avec le composant 'near', par
    comparaison entre la vitesse de broche demandée et la vitesse actuelle.

* 'spindle.N.brake' - 
    (bit, out) TRUE quand le frein de broche doit être activé.

* 'spindle.N.forward' - 
    (bit, in) TRUE quand la broche doit tourner en sens horaire.

* 'spindle.N.index-enable' - 
     (bit, I/O) Pour les mouvements avec broche synchronisée, ce signal
    doit être raccordé à la pin 'index-enable' du codeur de broche.

* 'spindle.N.on' - 
    (bit, out) TRUE quand la broche doit tourner.

* 'spindle.N.reverse' - 
    (bit, out) TRUE quand la broche doit tourner en sens anti-horaire.

* 'spindle.N.revs' - 
     (float, in) Pour le bon fonctionnement des mouvements avec broche
    synchronisée, ce signal doit être raccordé à la broche 'position' du
    codeur de broche. La position donnée par le codeur de broche doit être
    étalonnée pour que 'spindle-revs' augmente de 1.0 pour chaque tour de
    broche dans le sens horaire ('M3').

* 'spindle.N.speed-in' - 
     (float, in) Donne la vitesse actuelle de rotation de la broche
    exprimée en tours par seconde. Elle est utilisée pour les mouvements en
    unités par tour ('G95'). Si le pilote du codeur de broche ne dispose pas
    d'une sortie 'vitesse', il est possible d'en générer une en passant la
    position de la broche au travers d'un composant ddt. Si la machine n'a pas de
    codeur de broche, il est possible d'utiliser 'spindle.N.speed-out-rps'.

* 'spindle.N.speed-out' - 
     (float, out) Consigne de vitesse de rotation de la broche, exprimée en
    tours par minute. Positive pour le sens horaire ('M3'), négative pour le
    sens anti-horaire ('M4').

* 'spindle.N.speed-out-abs' - 
     (float, out) Consigne de vitesse absolue de rotation de la broche, exprimée
    en tours par minute. Toujours positive, quel que soit le sens de rotation.

* 'spindle.N.speed-out-rps' - 
     (float, out) Consigne de vitesse de rotation de la broche, exprimée en
    tours par seconde. Positive pour le sens horaire ('M3'), négative pour le
    sens anti-horaire ('M4').

* 'spindle.N.speed-out-rps-abs' - 
     (float, out) Consigne de vitesse absolue de rotation de la broche, exprimée
    en tours par seconde. Toujours positive, quel que soit le sens de rotation.

* 'motion.teleop-mode' - 
     (bit, out) TRUE quand motion est en 'mode téléopération', par opposition au
    'mode coordonné'.

* 'motion.tooloffset.x à motion.tooloffset.w' - 
     (float, out; un par axe) montre l'offset d'outil courant. Il peut provenir
    de la table d'outils ('G43 actif'), ou du G-code ('G43.1 actif')

* 'spindle.N.orient-angle' - 
     (float,out) Orientation souhaitée par M19. Contient la valeur du paramètre
    R du M19 plus la valeur du paramètre [RS274NGC]ORIENT_OFFSET du fichier ini.

* 'spindle.N.orient-mode' - 
	(s32,out) Broche en mode 'recherche d'orientation' par M19. Par défaut 0.

* 'spindle.N.orient' - 
     (out,bit) Indique le début d'un cycle d'orientation de la broche.
    Activé par M19. Révoqué par M3, M4 ou M5.
    Si 'spindle-orient-fault' est différent de zéro pendant que 'spindle-orient'
    est vrai, la commande M19 échoue avec un message d'erreur.

* 'spindle.N.is-oriented' - 
     (in, bit) Pin d'acquittement pour 'spindle-orient'. Achève le cycle
    d'orientation. Si 'spindle-orient' est vraie quand 'spindle-is-oriented' est
    actif, la pin 'spindle-orient' est relâchée et les pins 'spindle-locked' et
    'spindle-brake' sont activées.

* 'spindle.N.orient-fault' - 
     (s32, in) Entrée d'erreur du cycle d'orientation. Toute valeur autre que
    zéro produira l'abandon du cycle d'orientation.

* 'spindle.N.lock' - 
     (bit, out) Pin indiquant que l'orientation est atteinte et le cycle achevé.
    Relâchée par M3, M4 ou M5.

==== Utilisation des pins de HAL pour l'orientation broche avec M19 

Par convention, la broche est dans un des trois modes suivants:

 - mode rotation (mode par défaut).
 - mode recherche d'orientation.
 - mode orientation atteinte.

Quand un M19 est exécuté, la broche passe en mode 'recherche d'orientation' et
la pin de HAL 'spindle-orient' est activée. L'orientation cible
est spécifiée par les pins 'spindle-orient-angle' et 'spindle-orient-fwd' et
pilotée par les paramètres R et P du M19.

La logique de HAL réagi à l'ordre sur la pin 'spindle-orient' en déplaçant la
broche dans la position souhaitée. Quand cette orientation est atteinte, la
logique de HAL l'indique en activant la pin 'spindle-is-oriented'.

En réponse, 'motion' désactive la pin 'spindle-orient' et active la pin
'spindle-locked' indiquant le passage en mode 'orientation atteinte'. Il active
également la pin 'spindle-brake'. La broche est alors en mode 'orientation
atteinte'.

Si, pendant que 'spindle-orient' est vraie, et que 'spindle-is-oriented' est
fausse, la pin 'spindle-orient-fault' a une valeur autre que zéro, la commande
M19 est abandonnée, un message incluant le code d'erreur est affiché et la file
d'attente de 'motion' est vidée. La broche repasse en mode rotation.

Les commandes M3, M4 ou M5 annulent les modes 'recherche d'orientation' ou
'orientation atteinte'. Cet état est indiqué par la désactivation des broches
'spindle-orient' et 'spindle-locked'.

La pin 'spindle-orient-mode' reflète le paramètre P du M19, ce qui sera
interprété comme ci-dessous:

 - 0: rotation, quel que soit le sens, pour petit mouvement angulaire (défaut)
 - 1: rotation toujours en sens horaire (même direction qu’avec M3)
 - 2: rotation toujours en sens anti-horaire (même direction qu’avec M4)

Il est possible d'utiliser le composant de HAL 'orient' qui fournit une boucle
de commande PID, basée sur la position du codeur de broche, 'spindle-orient-angle'
et sur 'spindle-orient-mode'.

=== Paramètres

Beaucoup de ces paramètres servent d'aide au déboguage et sont sujets
aux changements ou au retrait à tout moment.

* 'motion-command-handler.time' - 
    (s32, RO)

* 'motion-command-handler.tmax' - 
    (s32, RW)

* 'motion-controller.time' - 
    (s32, RO)

* 'motion-controller.tmax' - 
    (s32, RW)

* 'motion.debug-bit-0' - 
    (bit, RO) Utilisé pour le déboguage.

* 'motion.debug-bit-1' - 
    (bit, RO) Utilisé pour le déboguage.

* 'motion.debug-float-0' - 
    (float, RO) Utilisé pour le déboguage.

* 'motion.debug-float-1' - 
    (float, RO) Utilisé pour le déboguage.

* 'motion.debug-float-2' - 
    (float, RO) Utilisé pour le déboguage.

* 'motion.debug-float-3' - 
    (float, RO) Utilisé pour le déboguage.

* 'motion.debug-s32-0' - 
    (s32, RO) Utilisé pour le déboguage.

* 'motion.debug-s32-1' - 
    (s32, RO) Utilisé pour le déboguage.

* 'motion.servo.last-period' - 
     Le nombre de cycle du processeur entre les invoquations du thread
    servo. Typiquement, ce nombre divisé par la vitesse du processeur donne
    un temps en secondes. Il peut être utilisé pour determiner si le
    contrôleur de mouvement en temps réel respecte ses contraintes de
    timing.

* 'motion.servo.last-period-ns' - 
    (float, RO)

=== Fonctions

Généralement, ces fonctions sont toutes les deux ajoutées à
servo-thread dans l'ordre suivant:

* 'motion-command-handler' - 
     Processus des commandes de mouvement provenant de l'interface
    utilisateur.

* 'motion-controller' - 
    Lance le contrôleur de mouvement de LinuxCNC.

== axis.N (temps réel)

Ces pins et paramètres sont créés par le module temps réel 'motmod'.
Ce sont en fait des valeurs d'articulations, mais les pins et les
paramètres sont toujours appelés 'axis.N'.footnote:[Dans une machine à
'cinématique triviale', il y a correspondance une
pour une, entre les articulations et les axes.
Note Du Traducteur: nous utilisons dans cette traduction le terme 'axe',
dans le cas d'une cinématique non triviale il devra être remplacé par
le terme 'articulation' (joint).]
Ils sont lus et mis à jour par la fonction 'motion-controller'.

=== Pins (((axis (hal pins))))

* 'axis.N.active' - 
    TRUE quand cet axe est actif.

* 'axis.N.amp-enable-out' - 
    (bit, out) TRUE si l'ampli de cet axe doit être activé.

* 'axis.N.amp-fault-in' - 
     (bit, in) Doit être mis TRUE si une erreur externe est détectée sur
    l'ampli de cet axe.

* 'axis.N.backlash-corr' - 
    (float, out)

* 'axis.N.backlash-filt' - 
    (float, out)

* 'axis.N.backlash-vel' - 
    (float, out)

* 'axis.N.coarse-pos-cmd' - 
    (float, out)

* 'axis.N.error' - 
    (bit, out)

* 'axis.N.f-error' - 
    (float, out)

* 'axis.N.f-error-lim' - 
    (float, out)

* 'axis.N.f-errored' - 
    (bit, out)

* 'axis.N.faulted' - 
    (bit, out)

* 'axis.N.free-pos-cmd' - 
    (float, out)

* 'axis.N.free-tp-enable' - 
    (bit, out)

* 'axis.N.free-vel-lim' - 
    (float, out)

* 'axis.N.home-sw-in' - 
     (bit, in) Doit être mis TRUE si le contact d'origine de cet axe est
    activé.

* 'axis.N.homed' - 
    (bit, out) 

* 'axis.N.homing' - 
    (bit, out) TRUE si la prise d'origine de cette axe est en cours.

* 'axis.N.in-position' - 
    TRUE si cet axe, utilisant le 'free planner', a atteint un arrêt.

* 'axis.N.index-enable' - 
     (bit, I/O) Doit être reliée à la broche 'index-enable' du codeur de
    cet axe pour activer la prise d'origine sur l'impulsion d'index.

* 'axis.N.jog-counts' - 
     (s32, in) Connection à la broche 'counts' d'un codeur externe utilisé
    comme manivelle.

* 'axis.N.jog-enable' - 
     (bit, in) Quand elle est TRUE (et en mode manuel), tout changement
    dans 'jog-counts' se traduira par un mouvement. Quand elle est FALSE,
    'jog-counts' sera ignoré.

* 'axis.N.jog-scale' - 
     (float, in) Fixe la distance, en unités machine, du déplacement pour
    chaque évolution de 'jog-counts'.

* 'axis.N.jog-vel-mode' - 
     (bit, in) Quand elle est FALSE (par défaut), la manivelle fonctionne
    en mode position. L'axe se déplace exactement selon l'incrément de jog
    sélectionné pour chaque impulsion, sans s'occuper du temps que prendra
    le mouvement. Quand elle est TRUE, la manivelle fonctionne en mode
    vitesse. Le mouvement s'arrête quand la manivelle s'arrête, même si le
    mouvement commandé n'est pas achevé.

* 'axis.N.joint-pos-cmd' - 
     (float, out) La position commandée de l'articulation (par opposition à celle du moteur).
    Ca peut être un écart entre les positions articulation et moteur. Par exemple;
    la procédure de prise d'origine fixe cet écart.

* 'axis.N.joint-pos-fb' - 
    (float, out) Le retour de position de l'articulation (par opposition à celui du moteur).

* 'axis.N.joint-vel-cmd' - 
    (float, out)

* 'axis.N.kb-jog-active' - 
    (bit, out)

* 'axis.N.motor-pos-cmd' - 
    (float, out) Position commandée pour cette articulation.

* 'axis.N.motor-pos-fb' - 
    (float, in) Position actuelle de cette articulation.

* 'axis.N.neg-hard-limit' - 
    (bit, out)

* 'axis.N.pos-lim-sw-in' - 
     (bit, in) Doit être mis TRUE si le fin de course de limite positive de
    cette articulation est activé.

* 'axis.N.pos-hard-limit' - 
    (bit, out)

* 'axis.N.neg-lim-sw-in' - 
     (bit, in) Doit être mis TRUE si le fin de course de limite négative de
    cette articulation est activé.

* 'axis.N.wheel-jog-active' - 
    (bit, out) 

=== Paramètres

* 'axis.N.home-state' - 
    Reflète l'étape de la prise d'origine en cours actuellement.

== iocontrol (espace utilisateur)

Ces pins sont créées par le contrôleur d'entrées/sorties de l'espace
utilisateur, habituellement appelé 'io'.

=== Pins (((iocontrol (HAL pins))))

* 'iocontrol.0.coolant-flood' - 
    (bit, out) TRUE quand l'arrosage est demandé.

* 'iocontrol.0.coolant-mist' - 
    (bit, out) TRUE quand le brouillard est demandé.

* 'iocontrol.0.emc-enable-in' - 
     (bit, in) Doit être mise FALSE quand un arrêt d'urgence externe est
    activé.

* 'iocontrol.0.lube' - 
    (bit, out) TRUE quand le graissage centralisé est commandé.

* 'iocontrol.0.lube_level' - 
    (bit, in) Doit être mise TRUE quand le niveau d'huile est correct.

* 'iocontrol.0.tool-change' - 
    (bit, out) TRUE quand un changement d'outil est demandé.

* 'iocontrol.0.tool-changed' - 
    (bit, in) Doit être mise TRUE quand le changement d'outil est terminé.

* 'iocontrol.0.tool-number' - 
    (s32, out) Numéro de l'outil courant.

* 'iocontrol.0.tool-prep-number' - 
    (s32, out) Numéro du prochain outil, donné par le mot *T* selon RS274NGC.

* 'iocontrol.0.tool-prepare' - 
    (bit, out) TRUE quand une préparation d'outil est demandée.

* 'iocontrol.0.tool-prepared' - 
     (bit, in) Doit être mise TRUE quand une préparation d'outil est
    terminée. 

* 'iocontrol.0.user-enable-out' - 
    (bit, out) FALSE quand un arrêt d'urgence interne est activé.

* 'iocontrol.0.user-request-enable' - 
    (bit, out) TRUE quand l'arrêt d'urgence est relâché.

