:lang: fr
:toc:

= Commandes et composants de base

[[sec:Commandes-de-HAL]] (((Commandes de HAL)))

== Commandes de Hal

Des informations plus détaillées peuvent être trouvées dans la man
page en tapant _man halcmd_ dans une console. Pour voir la
configuration de HAL ainsi que le statut de ses pins et paramètres
utiliser la fenêtre HAL Configuration dans le menu _Machine_ d'AXIS.
Pour visualiser le statut des pins, ouvrir l'onglet _Watch_ puis
cliquer dans l'arborescence sur les pins qui doivent être visualisées
dans la fenêtre watch.

.Fenêtre de configuration de HAL

image::images/HAL_Configuration.png[]

=== loadrt

La commande _loadrt_ charge un composant temps réel de HAL. Les
composants temps réel doivent être ajoutés au thread temps réel pour
être fonctionnels. Il n'est pas possible de charger un composant de
l'espace utilisateur dans l'espace temps réel.

Syntaxe et exemple:

+loadrt <component> <options>+ 

----
loadrt mux4 count=1 
----

=== addf

La commande _addf_ ajoute une fonction à un thread temps réel. Si
l'assistant StepConf a été utilisé pour créer la configuration, deux
threads ont été créés.

 - base-thread (le thread haute vitesse) ce thread prends en main les
   items nécessitant une réponse très rapide comme la génération
   d'impulsions, la lecture et l'écriture sur le port parallèle.
 - servo-thread (le thread basse vitesse) ce thread prends en main les
   items n'étant pas influencés par la vitesse comme le contrôleur de
   mouvement, l'API Classic Ladder et les commandes manuelles.

Syntaxe et exemple:

+addf <component> <thread>+ 

----
addf mux4 servo-thread 
----

=== loadusr[[sec:loadusr]]

La commande _loadusr_ charge un composant de HAL de l'espace
utilisateur. Les programmes de l'espace utilisateur ont leur propre
process séparé qui optionellement communique avec les autres composants
de HAL via leurs pins et paramètres. Il n'est pas possible de charger
un composant temps réel dans l'espace utilisateur.

Les drapeaux peuvent être un ou plusieurs parmis les suivants:

-W ::
     pour attendre que le composant soit prêt. Le composant est supposé
    avoir le même nom que le premier argument de la commande.

-Wn <nom> ::
    pour attendre un composant, qui porte le nom donné sous la forme <nom>.

-w ::
    pour attendre la fin du programme

-i ::
    pour ignorer la valeur retournée par le programme (avec -w) 

Syntaxe et exemple:

+loadusr <component> <options>+ 

----
loadusr halui
loadusr -Wn spindle gs2_vfd -n spindle 
----

En anglais ça donne _loadusr wait for name spindle component gs2_vfd name spindle_. 
Le -n spindle est une partie du composant gs2_vfd et non de la commande loadusr. 

=== net

La commande _net_ crée une _connexion_ entre un signal et une ou
plusieurs pins. Les indicateurs de direction _<=_ et _=>_ sont seulement
des aides à la lecture, ils n'ont pas d'autre utilité.

Syntaxe et exemple:

+net <signal-name> <pin-name> <opt-direction> <opt-pin-name>+ 

----
net both-home-y <= parport.0.pin-11-in 
----

Chaque signal ne peut avoir qu'une seule source (une seule pin de HAL
_out_) et autant de _lecteurs_ (des pins de HAL _in_) que souhaité.
Dans la colonne Dir de la fenêtre de configuration de HAL il est
possible de voir quelles pins sont _in_ et quelles pins sont _out_.

Pour faire cela en une ligne:

----
     signal    source            destination          destination 
net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out 
----

Ou pour le faire en plusieurs lignes, utiliser simplement le signal
avec les lecteurs des lignes suivantes:

----
net xStep <= stepgen.0.out => parport.0.pin-02-out 
----

Les pins appelées I/O pins comme _index-enable_, ne suivent pas cette règle. 

=== setp[[sub:setp]]
(((setp)))

La commande _setp_ ajuste la valeur d'une pin ou d'un paramètre. Les
valeurs valides dépendront du type de la pin ou du paramètre.

 - bit = true ou 1 et false ou 0 (True, TRUE, true sont toutes valides)
 - float = un flottant sur 32 bits, avec approximativement 24 bits de
   résolution et au plus 200 bits d'étendue dynamique.
 - s32 = un nombre entier compris entre -2147483648 et 2147483647
 - u32 = un nombre entier compris entre 0 et 4294967295

Pour des informations sur les flottants voir ici:

http://fr.wikipedia.org/wiki/Nombre_flottant[http://fr.wikipedia.org/wiki/Nombre_flottant]

Les paramètres peuvent être positionnés avant utilisation ou pendant
l'utilisation, toutefois certains composants ont des paramètres qui
doivent être positionnés avant utilisation. Il n'est pas possible
d'utiliser _setp_ sur une pin connectée à un signal.

Syntaxe et exemple:

+setp <pin/parameter-name> <value>+ 

----
setp parport.0.pin-08-out TRUE
----

==== unlinkp

La commande _unlinkp_ déconnecte la pin du signal auquel elle est connectée. 
Si aucun signal n'a été connecté à la pin avant de lancer cette commande, 
rien ne se passe.

Syntaxe et exemple:

+unlinkp <pin-name>+ 

----
unlinkp parport.0.pin-02-out 
----

=== Commandes obsolètes

==== linksp

La commande _linksp_ a été incluse dans la commande _net_.

La commande _linksp_ crée une _connexion_ entre un signal et une pin.

Syntaxe et exemple:

+linksp <signal-name> <pin-name>+ 
+linksp X-step parport.0.pin-02-out+ 

==== linkps

La commande _linkps_ a été incluse dans la commande _net_.

La commande _linksp_ crée une _connexion_ entre une pin et un signal. C'est la
même chose que linksp mais les arguments sont inversés.

Syntaxe et exemple:

+linkps <pin-name> <signal-name>+ 

----
linkps parport.0.pin-02-out X-Step
----

==== newsig

the command _newsig_ creates a new HAL signal by the name <signame>
and the data type of <type>. Type must be _bit_, _s32_, _u32_ or
_float_. Error if <signame> already exists.

Syntaxe et exemple:

+newsig <signame> <type>+ 

+newsig Xstep bit+ 

D'autres informations peuvent être trouvées dans le manuel de HAL ou
la man page de _halrun_.

== HAL Data[[sec:HAL-Data]] 
footnote:[NDT la description des données de HAL reste en Anglais, elle sont 
suffisamment simples pour être comprises.]

=== Bit (((Bit)))

A bit value is an on or off.

 - bit values = true or 1 and false or 0 (True, TRUE, true are all valid)

=== Float (((Float)))

A _float_ is a floating point number. In other words the decimal point
can move as needed.

 - float values = a 32 bit floating point value, with approximately 24
   bits of resolution and over 200 bits of dynamic range.

For more information on floating point numbers see:

http://fr.wikipedia.org/wiki/Nombre_flottant[http://fr.wikipedia.org/wiki/Nombre_flottant]

=== s32 (((s32)))

An _s32_ number is a whole number that can have a negative or positive
value.

 - s32 values = integer numbers -2147483648 to 2147483647

=== u32 (((u32)))

A _u32_ number is a whole number that is positive only.

 - u32 values = integer numbers 0 to 4294967295

== Fichiers Hal

Si l'assistant StepConf a été utilisé pour générer la configuration
trois fichiers HAL ont dû être créés dans le répertoire de la
configuration.

 - ma-fraiseuse.hal (si ne nom de la config est "ma-fraiseuse") Ce
   fichier est chargé en premier, il ne doit pas être modifié sous peine
   de ne plus pouvoir l'utiliser avec l'assistant StepConf.
 - custom.hal Ce fichier est le deuxième à être chargé et il l'est avant
   l'interface utilisateur graphique (GUI). C'est dans ce fichier que ce
   trouvent les commandes personnalisées de l'utilisateur devant être
   chargées avant la GUI. 
 - custom_postgui.hal Ce fichier est chargé après la GUI. C'est dans ce
   fichier que se trouvent les commandes personnalisées de l'utilisateur
   devant être chargées après la GUI. Toutes les commandes relatives aux
   widgets de pyVCP doivent être placées ici. 

== Composants de HAL

Deux paramètres sont automatiquement ajoutés à chaque composants HAL quand il 
est créé. Ces paramètres permettent d'encadrer le temps d'exécution d'un composant.

+.time+(((time))) 

+.tmax+(((tmax))) 


_.time_ est le nombre de cycles du CPU qu'il a fallu pour exécuter la fonction.

_.tmax_ est le nombre maximum de cycles du CPU qu'il a fallu pour exécuter la fonction. 
_.tmax_ est un paramètre en lecture/écriture, de sorte que l'utilisateur peut le 
mettre à 0 pour se débarrasser du premier temps d'initialisation de la fonction.

== Composants de logiques combinatoire

Hal contient plusieurs composants logiques temps réel. Les composants
logiques suivent une tables de vérité montrant les états logiques des
sorties en fonction de l'état des entrées. Typiquement, la manipulation
des bits d'entrée détermine l'état électrique des sorties selon la
table de vérité des portes.

=== and2

Le composant _and2_ est une porte _and_ à deux entrées. Sa table de
vérité montre la sortie pour chaque combinaison des entrées.

Syntaxe

+and2 [count=N] or [names=name1[,name2...]]+ 

Fonctions

+and2.n+ 

Pins

    and2.N.in0 (bit, in) 
    and2.N.in1 (bit, in) 
    and2.N.out (bit, out) 

Table de vérité

[width="90%", options="header"]
|========================================
|in0   | in1   | out
|False | False | False
|True  | False | False
|False | True  | False
|True  | True  | True
|========================================

=== not

Le composant _not_ est un simple inverseur d'état.

Syntaxe

+not [count=n] or [names=name1[,name2...]]+ 

Fonctions

    not.all 
    not.n 

Pins

    not.n.in (bit, in) 
    not.n.out (bit, out) 

Table de vérité

[width="90%", options="header"]
|========================================
|in    | out
|True  | False
|False | True
|========================================

=== or2

Le composant _or2_ est une porte OR à deux entrées.

Syntaxe

+or2[count=n] or [names=name1[,name2...]]+ 

Functions

+or2.n+ 

Pins

    or2.n.in0 (bit, in) 
    or2.n.in1 (bit, in) 
    or2.n.out (bit, out) 

Table de vérité

[width="90%", options="header"]
|========================================
|in0   | in1   | out
|True  | False | True
|True  | True  | True
|False | True  | True
|False | False | False
|========================================

=== xor2

Le composant _xor2_ est une porte XOR à deux entrées (OU exclusif).

Syntaxe

+xor2[count=n] or [names=name1[,name2...]]+ 

Fonctions

+xor2.n+ 

Pins

    xor2.n.in0 (bit, in) 
    xor2.n.in1 (bit, in) 
    xor2.n.out (bit, out) 

Table de vérité

[width="90%", options="header"]
|========================================
|in0   | in1   | out
|True  | False | True
|True  | True  | False
|False | True  | True
|False | False | False
|========================================

=== Exemples en logique combinatoire

Un exemple de connexion avec un "and2", deux entrées vers une sortie.
----
loadrt and2 count=1 
addf and2.0 servo-thread 
net my-sigin1 and2.0.in0 <= parport.0.pin-11-in 
net my-sigin2 and2.0.in1 <= parport.0.pin-12-in 
net both-on parport.0.pin-14-out <= and2.0.out 
----

Dans cet exemple un and2 est chargé dans l'espace temps réel, puis
ajouté à servo thread. Ensuite la broche d'entrée 11 du port parallèle
est connectée à l'entrée in0 de la porte. Puis la broche d'entrée 12 du
port est connectée à l'entrée in1 de la porte. Enfin la sortie
and2.0.out de la porte est connectée à la broche de sortie 14 du port
parallèle. Ainsi en suivant la table de vérité du and2, si les broches
11 et 12 du port sont à 1, alors sa sortie 14 est à 1 aussi.

== Composants de conversion

=== Somme pondérée  (weighted_sum)

La somme pondérée converti un groupe de bits en un entier. La conversion est la 
somme des _poids_ des bits présents plus n'importe quel offset. C'est similaire 
au _binaire codé décimal_ mais avec plus d'options. Le bit _hold_ interrompt le
traitement des entrées, de sorte que la valeur _sum_ ne change plus.

La syntaxe suivante est utilisée pour charger le composant weighted_sum.

+loadrt weighted_sum wsum_sizes=size[,size,...]+

Crée des groupes de weighted_sum, chacun avec le nombre donné de bits d'entrée (size).

Pour mettre à jour la weighted_sum, le process_wsums doit être attaché à un thread.

+addf process_wsums servo-thread+ 

Ce qui met à jour le composant weighted_sum.

Dans l'exemple suivant, une copie de la fenêtre de configuration de HAL d'Axis, 
les bits _0_ et _2_ sont TRUE, ils n'ont pas d'offset. Le poids (_weight_) du bit 0
est 1, celui du bit 2 est 4, la somme est donc 5.

.weighted_sum (somme pondérée)
----
Component Pins: 
Owner   Type  Dir         Value  Name 
    10  bit   In           TRUE  wsum.0.bit.0.in 
    10  s32   I/O             1  wsum.0.bit.0.weight 
    10  bit   In          FALSE  wsum.0.bit.1.in 
    10  s32   I/O             2  wsum.0.bit.1.weight 
    10  bit   In           TRUE  wsum.0.bit.2.in 
    10  s32   I/O             4  wsum.0.bit.2.weight 
    10  bit   In          FALSE  wsum.0.bit.3.in 
    10  s32   I/O             8  wsum.0.bit.3.weight 
    10  bit   In          FALSE  wsum.0.hold 
    10  s32   I/O             0  wsum.0.offset 
    10  s32   Out             5  wsum.0.sum 
----


