#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass book
\begin_preamble
\usepackage[plainpages=false,pdfpagelabels,colorlinks=true,linkcolor=blue]{hyperref}
\end_preamble
\language frenchb
\inputencoding default
\fontscheme bookman
\graphics default
\float_placement !htbp
\paperfontsize default
\spacing single
\papersize letterpaper
\paperpackage a4
\use_geometry 1
\use_amsmath 1
\use_natbib 0
\use_numerical_citations 0
\paperorientation portrait
\leftmargin 1in
\topmargin 1in
\rightmargin 0.8in
\bottommargin 0.8in
\secnumdepth 1
\tocdepth 5
\paragraph_separation skip
\defskip smallskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Chapter
Panneau de contrôle virtuel - Virtual Control Panels
\layout Section
Introduction
\layout Standard
Les panneaux de contrôle des machines traditionnelles sont de grandes plaques
d'acier avec des boutons poussoirs, des potentiomètres, des voyants et
parfois quelques galvanomètres montés parmis tout cela.
Ils présentent beaucoup d'avantages, les boutons sont beaucoup plus robustes
qu'un clavier d'ordinateur, ils sont aussi suffisamment gros pour être
manipulés tout en regardant autre chose, par exemple l'outil.
Cependant, ils ont aussi des inconvénients.
Ils occupent beaucoup de place sur le panneau, qui doit être de grande
taille, ils sont chers et leur câblage vers le PC peut utiliser beaucoup
de broches d'entrée/sortie.
C'est là que le panneau virtuel entre en scène.
\layout Standard
Un panneau virtuel de contrôle (VCP) est une fenêtre, sur l'écran de l'ordinateu
r, avec des boutons, des galvanomètres, des potentiomètres, des interrupteurs,
etc.
Quand vous cliquez sur un bouton du VCP, il change d'état une pin de HAL,
exactement comme si vous aviez pressé sur un bouton physique raccordé à
une broche d'entrée d'un périphérique d'entrée.
De même, une led VCP s'allume lorsque la pin de HAL devient VRAIE, tout
comme un voyant physique à lampe, raccordé à une broche de sortie d'un
périphérique de sortie.
Les panneaux virtuels de contrôle ne sont pas destinés à remplacer les
panneaux physiques, parfois il n'y a pas de substitut à un bon gros bouton
poussoir étanche aux huiles.
Mais les panneaux virtuels peuvent être utilisés pour tester ou contrôler
des fonctionnalités qui ne requiert ainsi, ni bouton ni voyant physique
et qui remplacent temporairement des organes physiques réels d'entrée/sortie,
par exemple, pendant la phase de déboguage du programme.
Ou pour simuler un panneau de contrôle physique avant qu'il ne soit fabriqué,
câblé et raccordé à une carte d'entrée/sortie.
\layout Standard
Actuellement il y a deux implémentations de VCP dans EMC2: L'ancien, simplement
nommé VCP, qui utilise les widgets de GTK et le nouveau appelé pyVCP, qui
utilise les widgets Tkinter.
VCP n'est plus recommandé, il ne doit plus être utilisé, il sera supprimé
dans l'avenir.
\layout Section
pyVCP
\layout Standard
La disposition d'un panneau pyVCP est spécifiée avec un fichier XML qui
contient les balises des widgets entre et .
Par exemple:
\layout LyX-Code
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_mypanel_fr.png
\end_inset
\layout Standard
Si vous placez ce texte dans un fichier nommé tiny.xml et que vous le lancez
avec:
\layout LyX-Code
pyvcp -c panneau tiny.xml
\layout Standard
pyVCP va créer le panneau pour vous, il y inclut deux widgets, un Label
avec le texte
\begin_inset Quotes eld
\end_inset
Ceci est un indicateur à LED
\begin_inset Quotes erd
\end_inset
et une LED rouge, utilisée pour afficher l'état d'un signal HAL de type
BIT.
Il va aussi créer un composant HAL nommé
\begin_inset Quotes eld
\end_inset
panneau
\begin_inset Quotes erd
\end_inset
(tous les widgets dans ce panneau sont connectés aux pins qui démarrent
avec
\begin_inset Quotes eld
\end_inset
panneau
\begin_inset Quotes erd
\end_inset
).
Comme aucune balise n'était présente à l'intérieur de la balise
, pyVCP nomme automatiquement la pin HAL pour le widget LED panneau.led.0
\layout Standard
Pour obtenir la liste des widgets, leurs balises et options, consultez la
documentation des widgets:
\begin_inset LatexCommand \ref{sec:Documentation-des-widgets}
\end_inset
\layout Standard
Un fois que vous avez créé votre panneau, connecter les signaux HAL de la
forme à la pin pyVCP se fait avec la commande 'halcmd linksp' habituelle.
Si vous débutez avec HAL, le tutoriel de HAL
\begin_inset LatexCommand \ref{cha:Tutoriel-HAL}
\end_inset
est vivement recommendé.
\layout Section
Sécurité avec pyVCP
\layout Standard
Certaines parties de pyVCP sont évaluées comme du code Python, elles peuvent
donc produirent n'importe quelle action disponible dans les programmes
Python.
N'utilisez que des fichiers pyVCP en .xml à partir d'une source de confiance.
\layout Section
Utiliser pyVCP avec AXIS
\begin_inset LatexCommand \label{sec:pyvcp-avec-axis}
\end_inset
\layout Standard
Puisque AXIS utilise le même environnement graphique et les même outils
(Tkinter) que pyVCP, il est possible d'inclure un panneau pyVCP sur le
côté droit de l'interface utilisateur normale d'AXIS.
Un exemple typique est présenté ci-dessous.
\layout Standard
Placer le fichier pyVCP XML décrivant le panneau dans le même répertoire
que le fichier .ini.
Nous voulons afficher la vitesse courante de la broche sur un widget barre
de progression.
Copier le code XML suivant dans un fichier appelé broche.xml:
\layout LyX-Code
\newline
\newline
\newline
"spindle-speed"
\newline
5000
\newline
\newline
\layout Standard
Ici nous avons fait un panneau avec un label
\begin_inset Quotes eld
\end_inset
Vitesse broche:
\begin_inset Quotes erd
\end_inset
et un widget barre de progression.
Nous avons spécifié que la pin HAL connectée à la barre de progression
devait s'appeler
\begin_inset Quotes eld
\end_inset
spindle-speed
\begin_inset Quotes erd
\end_inset
et réglé la valeur maximum de la barre à 5000 (se reporter à la documentation
des widgets, plus loin, pour toutes les options disponibles).
Pour faire connaître ce fichier à AXIS et qu'il l'appelle au démarrage,
nous devons préciser ce qui suit dans la section [DISPLAY] du fichier .ini:
\layout LyX-Code
PYVCP = broche.xml
\layout Standard
Pour que notre widget affiche réellement la vitesse de la broche
\begin_inset Quotes eld
\end_inset
spindle-speed
\begin_inset Quotes erd
\end_inset
, il doit être raccordé au signal approprié de HAL.
Le fichier .hal qui sera exécuté quand AXIS et pyVCP démarreront doit être
spécifié, de la manière suivante, dans la section [HAL] du fichier .ini:
\layout LyX-Code
POSTGUI_HALFILE = broche_vers_pyvcp.hal
\layout Standard
Ce changement lancera la commande HAL spécifiée dans
\begin_inset Quotes eld
\end_inset
broche_vers_pyvcp.hal
\begin_inset Quotes erd
\end_inset
.
Dans notre exemple, ce fichier contiendra juste la commande suivante:
\layout LyX-Code
linksp spindle-rpm-filtered pyvcp.spindle-speed
\layout Standard
ce qui suppose que le signal appelé
\begin_inset Quotes eld
\end_inset
spindle-rpm-filtered
\begin_inset Quotes erd
\end_inset
existe aussi.
Noter que lors de l'exécution avec AXIS, toutes les pins des widgets de
pyVCP ont des noms commençant par
\begin_inset Quotes eld
\end_inset
pyvcp.
\begin_inset Quotes erd
\end_inset
.
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_AXIS_fr.png
lyxscale 50
scale 50
\end_inset
\layout Standard
Voila à quoi ressemble le panneau pyVCP que nous venons de créer, incorporé
à AXIS.
La configuration
\family typewriter
sim/lathe
\family default
fournie en exemple, est configurée de cette manière.
\layout Section
Documentation des widgets de pyVCP
\begin_inset LatexCommand \label{sec:Documentation-des-widgets}
\end_inset
\layout Standard
Les signaux de HAL existent en deux variantes, BIT et FLOAT.
pyVCP peut afficher la valeur d'un signal avec un widget indicateur, ou
modifier la valeur d'un signal avec un widget de contrôle.
Ainsi, il y a quatre classes de widgets pyVCP connectables aux signaux
de HAL.
Une cinquième classe de widgets d'aide permet d'organiser et d'appliquer
des labels aux panneaux.
\layout List
\labelwidthstring 00.00.0000
1.
Widgets de signalisation, signaux BIT: LED
\layout List
\labelwidthstring 00.00.0000
2.
Widgets de contrôle, signaux BIT: Button, Checkbutton, Radiobutton
\layout List
\labelwidthstring 00.00.0000
3.
Widgets de signalisation, signaux FLOAT: Number, Bar, Meter
\layout List
\labelwidthstring 00.00.0000
4.
Widgets de contrôle, signaux FLOAT: Spinbox, Scale, Jogwheel
\layout List
\labelwidthstring 00.00.0000
5.
Widgets d'aide: Hbox, Vbox, Table, Label, Labelframe
\layout Subsubsection
Syntaxe
\layout Standard
Chaque widget est décrit brièvement, suivi par la forme d'écriture utilisée
et d'une capture d'écran.
Toutes les balises contenues dans la balise du widget principal, sont optionnel
les.
\layout Subsubsection
Notes générales
\layout Standard
à l'heure actuelle, les deux syntaxes, basée sur les balises et basée sur
les attributs, sont supportées.
Par exemple, les deux fragments de code XML suivants sont traités de manière
identique:
\layout LyX-Code
\layout Standard
et
\layout LyX-Code
"ma-led"
\layout Standard
Quand la syntaxe basée sur les attributs est utilisée, les règles suivantes
sont utilisées pour convertir les valeurs des attributs en valeurs Python:
\layout Enumerate
Si le premier caractère de l'attribut est un des suivants:
\family typewriter
{(["'
\family default
, Il est évalué comme une expression Python.
\layout Enumerate
Si la chaine est acceptée par int(), la valeur est traitée comme un entier.
\layout Enumerate
Si la chaine est acceptée par float(), la valeur est traitée comme un flottant.
\layout Enumerate
Autrement, la chaine est acceptée comme une chaine.
\layout Standard
Quand la syntaxe basée sur les balises est utilisée, le texte entre les
balises est toujours évalué comme un expression Python.
\layout Standard
Les exemples ci-dessous montrent un mélange des deux formats.
\layout Subsection
LED
\layout Standard
Une LED est utilisée pour indiquer l'état d'un signal BIT.
La couleur de la LED sera on_color quand le signal BIT est vrai et off_color
autrement.
\layout LyX-Code
\newline
"ma-led"
\newline
50
\newline
"bleue"
\newline
"noire"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_led.png
\end_inset
\layout Standard
définit le nom de la pin, par défaut:
\begin_inset Quotes eld
\end_inset
led.n
\begin_inset Quotes erd
\end_inset
, où n est un entier
\newline
définit la taille de la led, par défaut: 20
\newline
définit la couleur de la led LED quand la pin est vraie, par
défaut:
\begin_inset Quotes eld
\end_inset
green
\begin_inset Quotes erd
\end_inset
\newline
définit la couleur de la LED quand la pin est fausse, par défaut:
\begin_inset Quotes eld
\end_inset
ref
\begin_inset Quotes erd
\end_inset
\layout Subsection
Bouton (button)
\layout Standard
Un bouton permet de contrôler une pin BIT.
La pin sera mise vraie quand le bouton sera pressé et maintenu enfoncé,
elle sera mise fausse quand le bouton sera relâché.
\layout LyX-Code
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_button.png
\end_inset
\layout Subsection
Case à cocher (checkbutton)
\layout Standard
Une case à cocher contrôle une pin BIT.
La pin sera mise vraie quand la case sera cochée et fausse si la case est
décochée.
\layout LyX-Code
\newline
"ma-case-à-cocher"
\newline
\layout Standard
Une case non cochée:
\begin_inset Graphics
filename pyvcp_checkbutton1.png
\end_inset
et une case cochée:
\begin_inset Graphics
filename pyvcp_checkbutton2.png
\end_inset
\layout Subsection
Bouton radio (radiobutton)
\layout Standard
Un bouton radio placera une seule des pins BIT vraie.
Les autres seront mises fausses.
\layout LyX-Code
\newline
["un","deux","trois"]
\newline
"mon-bouton-radio"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_radiobutton_fr.png
\end_inset
\layout Standard
Noter que dans cet exemple, les pins de HAL seront nommées mon-bouton-radio.un,
mon-bouton-radio.deux et mon-bouton-radio.trois.
Dans la capture d'écran, la valeur
\begin_inset Quotes eld
\end_inset
trois
\begin_inset Quotes erd
\end_inset
est sélectionnée.
\layout Subsection
Nombre (number)
\layout Standard
Le widget nombre affiche la valeur d'un signal FLOAT.
\layout LyX-Code
\newline
"mon-nombre"
\newline
('Helvetica',50)
\newline
"+4.3f"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_number.png
\end_inset
\layout Standard
est une police de caractères de type Tkinter avec la spécification
de sa taille.
Noter que sous Ubuntu 6.06 'Helvetica' n'est pas disponible en taille supérieure
à 40 ou 50.
Une police qui peut être agrandie jusqu'à la taille 200 est la police 'courier
10 pitch', que vous pouvez spécifier de la manière suivante, pour afficher
des chiffres réellement grands:
\layout LyX-Code
('courier 10 pitch',100)
\layout Standard
est un format 'style C', spécifié pour définir le format d'affichage
du nombre.
\layout Subsection
Barre de progression (bar)
\layout Standard
Le widget barre de progression affiche la valeur d'un signal FLOAT, graphiquemen
t dans une barre de progression et simultanément, en numérique.
\layout LyX-Code
\newline
"ma-bar"
\newline
0
\newline
123
\newline
"grey"
\newline
"red"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_bar.png
\end_inset
\layout Subsection
Galvanomètre (meter)
\layout Standard
Le galvanomètre affiche la valeur d'un signal FLOAT dans un affichage à
aiguille
\begin_inset Quotes eld
\end_inset
à l'ancienne
\begin_inset Quotes erd
\end_inset
.
\layout LyX-Code
\newline
"mon-galva"
\newline
"Tension"
\newline
300
\newline
-12
\newline
33
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_meter_fr.png
lyxscale 50
scale 50
\end_inset
\layout Subsection
Roue codeuse (spinbox)
\layout Standard
La roue codeuse contrôle une pin FLOAT.
La valeur de la pin est augmentée ou diminuée de la valeur de 'resolution',
à chaque pression sur une flèche, ou en positionnant la souris sur le nombre
puis en tournant la molette de la souris.
\layout LyX-Code
\newline
"ma-roue-codeuse"
\newline
-12
\newline
33
\newline
0.1
\newline
"2.3f"
\newline
('Arial',30)
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_spinbox.png
\end_inset
\layout Subsection
Curseur (scale)
\layout Standard
Le curseur contrôle une pin FLOAT.
La valeur de la pin est augmentée ou diminuée en déplaçant le curseur,
ou en positionnant la souris sur le curseur puis en tournant la molette
de la souris.
\layout LyX-Code
\newline
"mon-curseur"
\newline
0.1
\newline
HORIZONTAL
\newline
-33
\newline
26
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_scale.png
\end_inset
\layout Subsection
Bouton tournant (jogwheel)
\layout Standard
Le bouton tournant imite le fonctionnement d'un vrai bouton tournant, en
sortant sur une pin FLOAT la valeur sur laquelle est positionné le bouton,
que ce soit en le faisant tourner avec un mouvement circulaire, ou en tournant
la molette de la souris.
\layout LyX-Code
\newline
"mon-bouton-tournant"
\newline
45
\newline
250
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_jogwheel.png
lyxscale 50
scale 50
\end_inset
\layout Section
Documentation des containers de pyVCP
\layout Standard
Les containers sont des widgets qui contiennent d'autres widgets.
\layout Subsection
Hbox
\layout Standard
Utilisez une Hbox lorsque vous voulez aligner les widgets, horizontalement,
les uns à côtés des autres.
\layout LyX-Code
\newline
\newline
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_hbox.png
\end_inset
\layout Standard
à l'intérieur d'une Hbox, vous pouvez utiliser les balises
\family typewriter
\family default
,
\family typewriter
\family default
et
\family typewriter
\family default
pour choisir le comportement des éléments contenus dans la boîte, lors
d'un redimensionnement de la fenêtre.
Pour des détails sur le comportement de fill, anchor, et expand, référez
vous au manuel du pack Tk,
\family typewriter
pack(3tk)
\family default
.
Par défaut,
\family typewriter
fill='y'
\family default
,
\family typewriter
anchor='center'
\family default
,
\family typewriter
expand='yes'
\family default
.
\layout Subsection
Vbox
\layout Standard
Utilisez une Vbox lorsque vous voulez aligner les widgets verticalement,
les uns au dessus des autres.
\layout LyX-Code
\newline
\newline
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_vbox.png
\end_inset
\layout Standard
à l'intérieur d'une Hbox, vous pouvez utiliser les balises
\family typewriter
\family default
,
\family typewriter
\family default
et
\family typewriter
\family default
pour choisir le comportement des éléments contenus dans la boîte, lors
d'un redimensionnement de la fenêtre.
Pour des détails sur le comportement de fill, anchor, et expand, référez
vous au manuel du pack Tk,
\family typewriter
pack(3tk)
\family default
.
Par défaut,
\family typewriter
fill='y'
\family default
,
\family typewriter
anchor='center'
\family default
,
\family typewriter
expand='yes'
\family default
.
\layout Subsection
Label
\layout Standard
Un label est un texte qui s'affiche sur le panneau.
\layout LyX-Code
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_label_fr.png
\end_inset
\layout Subsection
Labelframe
\layout Standard
Un labelframe est un cadre entouré d'un sillon et un label en haut à gauche.
\layout LyX-Code
\newline
\newline
\newline
\newline
\layout LyX-Code
\align center
\begin_inset Graphics
filename pyvcp_labelframe_fr1.png
scale 50
\end_inset
\layout Subsection
Table
\layout Standard
Une table est un container qui permet d'écrire dans une grille de lignes
et de colonnes.
Chaque ligne débute avec la balise
\family typewriter
\family default
.
Un widget container peut être en lignes ou en colonnes par l'utilisation
de la balise
\family typewriter
\family default
.
Les bordures des cellules contenant les widgets
\begin_inset Quotes eld
\end_inset
sticky
\begin_inset Quotes erd
\end_inset
peuvent être réglées grâce à l'utilisation de la balise
\family typewriter
\family default
.
Une table peut s'étirer sur ses lignes et colonnes flexibles (sticky).
\layout Standard
Exemple:
\layout LyX-Code