#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 english
\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
Virtual Control Panels
\layout Section
Introduction
\layout Standard
Traditional machine control panels are large sheets of steel with push buttons,
knobs, lights and sometimes meters mounted on them.
They have many advantages - the buttons are far more rugged than a computer
keyboard, and large enough that you can usually operate the correct one
by feel while looking elsewhere, for example at the tool.
However, they also have disadvantages.
The occupy a lot of panel space, they are expensive, and wiring them into
the PC can use up a lot of I/O pins.
That is where Virtual Control Panels come in.
\layout Standard
A Virtual Control Panel (VCP) is a window on the computer screen with buttons,
meters, switches, etc.
When you click on a VCP button, it changes the state of a HAL pin, exactly
as if you had pressed a physical button wired to an input pin on an I/O
card.
Likewise, a VCP LED lights up when a HAL pin goes true, just like a physical
indicator lamp wired to an output pin on an I/O card.
Virtual control panels are not intended to replace physical panels - sometimes
there is just no substitute for a big rugged oil-tight push button.
But virtual panels can be used for testing or monitoring things that don't
require physical buttons and lights, to temporarily replace real I/O devices
while debugging ladder logic, or perhaps to simulate a physical panel before
you build it and wire it to an I/O board.
\layout Section
pyVCP
\layout Standard
The layout of a pyVCP panel is specified with an XML file that contains
widget tags between and .
For example:
\layout LyX-Code
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_mypanel.png
\end_inset
\layout Standard
If you place this text in a file called tiny.xml, and run
\layout LyX-Code
pyvcp -c mypanel tiny.xml
\layout Standard
pyVCP will create the panel for you, which includes two widgets, a Label
with the text
\begin_inset Quotes eld
\end_inset
This is a LED indicator
\begin_inset Quotes erd
\end_inset
, and a LED, used for displaying the state of a HAL BIT signal.
It will also create a HAL component named
\begin_inset Quotes eld
\end_inset
mypanel
\begin_inset Quotes erd
\end_inset
(all widgets in this panel are connected to pins that start with
\begin_inset Quotes eld
\end_inset
mypanel.
\begin_inset Quotes erd
\end_inset
).
Since no tag was present inside the tag, pyVCP will automaticall
y name the HAL pin for the LED widget mypanel.led.0
\layout Standard
For a list of widgets and their tags and options, see the widget reference
below.
\layout Standard
Once you have created your panel, connecting HAL signals to and from the
pyVCP pins is done with 'halcmd linksp' as usual.
If you are new to HAL, the HAL Tutorial
\begin_inset LatexCommand \ref{cha:HAL-Tutorial}
\end_inset
is recommended.
\layout Section
Security of pyVCP
\layout Standard
Parts of pyVCP files are evaluated as Python code, and can take any action
available to Python programs.
Only use pyVCP .xml files from a source that you trust.
\layout Section
Using pyVCP with AXIS
\begin_inset LatexCommand \label{sec:pyvcp-with-axis}
\end_inset
\layout Standard
Since AXIS uses the same GUI toolkit (Tkinter) as pyVCP, it is possible
to include a pyVCP panel on the right side of the normal AXIS user interface.
A typical example is explained below.
\layout Standard
Place your pyVCP XML file describing the panel in the same directory where
your .ini file is.
Say we we want to display the current spindle speed using a Bar widget.
Place the following in a file called spindle.xml:
\layout LyX-Code
\newline
\newline
\newline
"spindle-speed"
\newline
5000
\newline
\newline
\layout Standard
Here we've made a panel with a Label and a Bar widget, specified that the
HAL pin connected to the Bar should be named
\begin_inset Quotes eld
\end_inset
spindle-speed
\begin_inset Quotes erd
\end_inset
, and set the maximum value of the bar to 5000 (see widget reference below
for all options).
To make AXIS aware of this file, and call it at start up, we need to specify
the following in the [DISPLAY] section of the .ini file:
\layout LyX-Code
PYVCP = spindle.xml
\layout Standard
To make our widget actually display the spindle-speed it needs to be hooked
up to the appropriate HAL signal.
A .hal file that will be run once AXIS and pyVCP have started can be specified
in the [HAL] section of the .ini file:
\layout LyX-Code
POSTGUI_HALFILE = spindle_to_pyvcp.hal
\layout Standard
This change will run the HAL commands specified in
\begin_inset Quotes eld
\end_inset
spindle_to_pyvcp.hal
\begin_inset Quotes erd
\end_inset
.
In our example the contents could look like this:
\layout LyX-Code
linksp spindle-rpm-filtered pyvcp.spindle-speed
\layout Standard
assuming that a signal called
\begin_inset Quotes eld
\end_inset
spindle-rpm-filtered
\begin_inset Quotes erd
\end_inset
already exists.
Note that when running together with AXIS, all pyVCP widget HAL pins have
names that start with
\begin_inset Quotes eld
\end_inset
pyvcp.
\begin_inset Quotes erd
\end_inset
.
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_AXIS.png
lyxscale 50
scale 50
\end_inset
\layout Standard
This is what the newly created pyVCP panel should look like in AXIS.
The
\family typewriter
sim/lathe
\family default
configuration is already configured this way.
\layout Section
pyVCP Widget reference
\layout Standard
HAL signals come in two variants, BIT and FLOAT.
pyVCP can either display the value of the signal with an indicator widget,
or modify the signal value with a control widget.
Thus there are four classes of pyVCP widgets that you can connect to a
HAL signal.
A fifth class of helper widgets allow you to organize and label your panel.
\layout List
\labelwidthstring 00.00.0000
1.
Widgets for indicating BIT signals: LED
\layout List
\labelwidthstring 00.00.0000
2.
Widgets for controlling BIT signals: Button, Checkbutton, Radiobutton
\layout List
\labelwidthstring 00.00.0000
3.
Widgets for indicating FLOAT signals: Number, Bar, Meter
\layout List
\labelwidthstring 00.00.0000
4.
Widgets for controlling FLOAT signals: Spinbox, Scale, Jogwheel
\layout List
\labelwidthstring 00.00.0000
5.
Helper widgets: Hbox, Vbox, Tabel, Label, Labelframe
\layout Subsubsection
Syntax
\layout Standard
Each widget is described briefly, followed by the markup used, and a screen
shot.
All tags inside the main widget tag are optional.
\layout Subsubsection
General Notes
\layout Standard
At the present time, both a tag-based and an attribute-based syntax are
supported.
For instance, the following XML fragments are treated identically:
\layout LyX-Code
\layout Standard
and
\layout LyX-Code
"my-led"
\layout Standard
When the attribute-based syntax is used, the following rules are used to
turn the attributes value into a Python value:
\layout Enumerate
If the first character of the attribute is one of the following, it is evaluated
as a Python expression:
\family typewriter
{(["'
\layout Enumerate
If the string is accepted by int(), the value is treated as an integer
\layout Enumerate
If the string is accepted by float(), the value is treated as floating-point
\layout Enumerate
Otherwise, the string is accepted as a string.
\layout Standard
When the tag-based syntax is used, the text within the tag is always evaluated
as a Python expression.
\layout Standard
The examples below show a mix of formats.
\layout Subsection
LED
\layout Standard
A LED is used to indicate the status of a BIT signal.
The LED color will be on_color when the BIT signal is true, and off_color
otherwise.
\layout LyX-Code
\newline
"my-led"
\newline
50
\newline
"blue"
\newline
"black"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_led.png
\end_inset
\layout Standard
sets the name of the pin, default is
\begin_inset Quotes eld
\end_inset
led.n
\begin_inset Quotes erd
\end_inset
, where n is an integer
\newline
sets the size of the led, default is 20
\newline
sets the color of the LED when the pin is true.
default is
\begin_inset Quotes eld
\end_inset
green
\begin_inset Quotes erd
\end_inset
\newline
sets the color of the LED when the pin is false.
default is
\begin_inset Quotes eld
\end_inset
ref
\begin_inset Quotes erd
\end_inset
\layout Subsection
Button
\layout Standard
A button is used to control a BIT pin.
The pin will be set True when the button is pressed and held down, and
will be set False when the button is released.
\layout LyX-Code
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_button.png
\end_inset
\layout Subsection
Checkbutton
\layout Standard
A checkbutton controls a BIT pin.
The pin will be set True when the button is checked, and false when the
button is unchecked.
\layout LyX-Code
\newline
"my-checkbutton"
\newline
\layout Standard
An unchecked checkbutton:
\begin_inset Graphics
filename pyvcp_checkbutton1.png
\end_inset
, and a checked one:
\begin_inset Graphics
filename pyvcp_checkbutton2.png
\end_inset
\layout Subsection
Radiobutton
\layout Standard
A radiobutton will set one of a number of BIT pins true.
The other pins are set false.
\layout LyX-Code
\newline
["one","two","three"]
\newline
"my-radio"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_radiobutton.png
\end_inset
\layout Standard
Note that the HAL pins in the example above will me named my-radio.one, my-radio.t
wo, and my-radio.three.
In the image above,
\begin_inset Quotes eld
\end_inset
three
\begin_inset Quotes erd
\end_inset
is the selected value.
\layout Subsection
Number
\layout Standard
The number widget displays the value of a FLOAT signal.
\layout LyX-Code
\newline
"my-number"
\newline
('Helvetica',50)
\newline
"+4.3f"
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_number.png
\end_inset
\layout Standard
is a Tkinter font type and size specification.
Note that on Ubuntu 6.06 'Helvetica' is not available in sizes above ca
40 or 50.
One font that will show up to at least size 200 is 'courier 10 pitch',
so for a really big Number widget you could specify:
\layout LyX-Code
('courier 10 pitch',100)
\layout Standard
is a 'C-style' format specified that determines how the number
is displayed.
\layout Subsection
Bar
\layout Standard
A bar widget displays the value of a FLOAT signal both graphically using
a bar display and numerically.
\layout LyX-Code
\newline
"my-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
Meter
\layout Standard
Meter displays the value of a FLOAT signal using a traditional dial indicator.
\layout LyX-Code
\newline
"my-meter"
\newline
"Voltage"
\newline
300
\newline
-12
\newline
33
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_meter.png
lyxscale 50
scale 50
\end_inset
\layout Subsection
Spinbox
\layout Standard
Spinbox controls a FLOAT pin.
You increase or decrease the value of the pin by 'resolution' by either
pressing on the arrows, or pointing at the spinbox and rolling your mouse-wheel.
\layout LyX-Code
\newline
"my-spinbox"
\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
Scale
\layout Standard
Scale controls a FLOAT pin.
You increase or decrease the value of the pin be either dragging the slider,
or pointing at the scale and rolling your mouse-wheel.
\layout LyX-Code
\newline
"my-scale"
\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
Jogwheel
\layout Standard
Jogwheel mimics a real jogwheel by outputting a FLOAT pin which counts up
or down as the wheel is turned, either by dragging in a circular motion,
or by rolling the mouse-wheel.
\layout LyX-Code
\newline
"my-wheel"
\newline
45
\newline
250
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_jogwheel.png
lyxscale 50
scale 50
\end_inset
\layout Section
pyVCP Container reference
\layout Standard
Containers are widgets that contain other widgets.
\layout Subsection
Hbox
\layout Standard
Use a Hbox when you want to stack widgets horizontally next to each other.
\layout LyX-Code
\newline
\newline
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_hbox.png
\end_inset
\layout Standard
Inside a Hbox, you can use the
\family typewriter
\family default
,
\family typewriter
\family default
, and
\family typewriter
\family default
tags to choose how items in the box behave when the window is re-sized.
For details of how fill, anchor, and expand behave, refer to the Tk
\family typewriter
pack
\family default
manual page,
\family typewriter
pack(3tk)
\family default
.
By default,
\family typewriter
fill='y'
\family default
,
\family typewriter
anchor='center'
\family default
,
\family typewriter
expand='yes'
\family default
.
\layout Subsection
Vbox
\layout Standard
Use a Vbox when you want to stack widgets vertically on top of each other.
\layout LyX-Code
\newline
\newline
\newline
\newline
\newline
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_vbox.png
\end_inset
\layout Standard
Inside a Hbox, you can use the
\family typewriter
\family default
,
\family typewriter
\family default
, and
\family typewriter
\family default
tags to choose how items in the box behave when the window is re-sized.
For details of how fill, anchor, and expand behave, refer to the Tk
\family typewriter
pack
\family default
manual page,
\family typewriter
pack(3tk)
\family default
.
By default,
\family typewriter
fill='x'
\family default
,
\family typewriter
anchor='center'
\family default
,
\family typewriter
expand='yes'
\family default
.
\layout Subsection
Label
\layout Standard
A label is a piece of text on your panel.
\layout LyX-Code
\layout Standard
\align center
\begin_inset Graphics
filename pyvcp_label.png
\end_inset
\layout Subsection
Labelframe
\layout Standard
A labelframe is a frame with a groove and a label at the upper-left corner.
\layout LyX-Code
\newline
\newline
\newline
\newline
\layout Subsection
Table
\layout Standard
A table is a container that allows layout in a grid of rows and columns.
Each row is started by a
\family typewriter
\family default
tag.
A contained widget may span rows or columns through the use of the
\family typewriter
\family default
tag.
The sides of the cells to which the contained widgets
\begin_inset Quotes eld
\end_inset
stick
\begin_inset Quotes erd
\end_inset
may be set through the use of the
\family typewriter
\family default
tag.
A table expands on its flexible rows and columns.
\layout Standard
Example:
\layout LyX-Code