Table Record and related software

Tim Mooney


Contents

Overview

This documentation describes version 5.14 of the EPICS table record, and related EPICS software recommended for building and using it. This version of the record is compatible with EPICS Release 3.14.X, and it is not compatible with any earlier releases of EPICS.

The table record controls six (or fewer) motors that drive an optical table, a platform that generally can move in three orthogonal directions (X, Y, and Z), and rotate about the X, Y, and Z axes by angles AX, AY, and AZ.  The record allows users to specify the point about which rotations are to occur--this is called the "fixed point" in the figures below.

The record assumes the platform rests on three pivot points named M0, M1, and M2. (See Figs. 1-4, below). The locations of these pivot points, and the manner in which they move, is specified by the field GEOM (loosely, the table geometry). Four geometries, named SRI, PNC, GEOCARS, and NEWPORT, are supported by this version of the table record.
 
 



Figure 1 (SRI geometry)


Figure 2 (PNC geometry)


Figure 3 (GEOCARS geometry)


Figure 4 (NEWPORT geometry)


 


In the SRI, PNC, and GEOCARS geometries, three motors (M0Y, M1Y, M2Y) move M0, M1, and M2 in the Y direction (vertically); one motor (M0X) moves M0 in the X direction; one motor (M2X) moves M2 in the X direction; and one motor (M2Z) moves M2 in the Z direction. M1 is unconstrained in the X-Z plane; M0 is unconstrained along the Z axis.

In the NEWPORT geometry, the three motors (M0Y, M1Y, M2Y) vary the lengths of the table legs (i.e., the distances between the table top and pivot points M0, M1, and M2). Thus, in this geometry the pivot points do not move vertically.

You are (or the instrument specialist is) expected to customize the table software by specifying the motors it is to control, and to set up the table by describing the locations of the pivot points, and by specifying the table geometry, the orientation angle of the table with respect to the laboratory coordinate system, the location of the point about which the table is to rotate (also called the "fixed" point in this documentation), and any absolute user limits on virtual motors.

Differences from previous versions

Field Descriptions

In addition to fields common to all record types (see the EPICS Record Reference Manual for these) the table record has the fields described below.
Alphabetical listing of all fields with terse descriptions
Calibration fields allow you to redefine the table position
Setup fields specify the table dimensions and the location of the "fixed point"
Link fields connect the table record to motor records
Limit fields values read from or calculated from motor limits
Speed fields attempt to keep the "fixed" point fixed even while moving
Table drive fields by which you move the table
Motor drive fields by which the table record moves motors
Readback fields current and desired positions of table and motors
Miscellaneous fields engineering units, command "buttons", etc.
Private fields in which you are not expected to be interested

Alphabetical list of record-specific fields

NOTE: Links in this table take you only to the section in which the linked item is described in detail. You'll probably have to scroll down to find the actual item.
Name  Access  Prompt  Data type  Comment 
A x to m matrix  DOUBLE*  3x3 rotation matrix
AEGU R/W  Angular Units Name  STRING  Engineering units for angles (16-chars)
AX0 R/W  x-angle offset  DOUBLE  True table position - reported table position
AX R/W*  x angle  DOUBLE  x-angle drive field
AXL x angle true value  DOUBLE  True x angle
AXRB x angle readback  DOUBLE  x angle calculated from motor drive values
AY0 R/W  y-angle offset  DOUBLE  True table position - reported table position
AY R/W*  y angle  DOUBLE  y-angle drive field
AYL y angle true value  DOUBLE  True y angle
AYRB y angle readback  DOUBLE  y angle calculated from motor drive values
AZ0 R/W  z-angle offset  DOUBLE  True table position - reported table position
AZ R/W*  z angle  DOUBLE  z-angle drive field
AZL z angle true value  DOUBLE  True z angle
AZRB z angle readback  DOUBLE  z angle calculated from motor drive values
B m to x matrix  DOUBLE*  3x3 utility matrix
E0X encoder 0X val  DOUBLE  Current position of M0X motor
E0XI R/W  encoder 0X inlink  INLINK  Link from M0X motor's readback
E0Y encoder 0Y val  DOUBLE  Current position of M0Y motor
E0YI R/W  encoder 0Y inlink  INLINK  Link from M0Y motor's readback
E1Y encoder 1Y val  DOUBLE  Current position of M1Y motor
E1YI R/W  encoder 1Y inlink  INLINK  Link from M1Y motor's readback
E2X encoder 2X val  DOUBLE  Current position of M2X motor
E2XI R/W  encoder 2X inlink  INLINK  Link from M2X motor's readback
E2Y encoder 2Y val  DOUBLE  Current position of M2Y motor
E2YI R/W  encoder 2Y inlink  INLINK  Link from M2Y motor's readback
E2Z encoder 2Z val  DOUBLE  Current position of M2Z motor
E2ZI R/W  encoder 2Z inlink  INLINK  Link from M2Z motor's readback
EAX encoder x angle  DOUBLE  Current table position (x angle) 
EAY encoder y angle  DOUBLE  Current table position (y angle)
EAZ encoder z angle  DOUBLE  Current table position (z angle)
EX encoder x  DOUBLE  Current table position (x translation)
EY encoder y  DOUBLE  Current table position (y translation)
EZ encoder z  DOUBLE  Current table position (z translation)
H0X motor 0X hi limit  DOUBLE 
H0XL R/W  motor 0X HLM link  INLINK  Link from motor's limit field
H0Y motor 0Y hi limit  DOUBLE 
H0YL R/W  motor 0Y HLM link  INLINK  Link from motor's limit field
H1Y motor 1Y hi limit  DOUBLE 
H1YL R/W  motor 1Y HLM link  INLINK  Link from motor's limit field
H2X motor 2X hi limit  DOUBLE 
H2XL R/W  motor 2X HLM link  INLINK  Link from motor's limit field
H2Y motor 2Y hi limit  DOUBLE 
H2YL R/W  motor 2Y HLM link  INLINK  Link from motor's limit field
H2Z motor 2Z hi limit  DOUBLE 
H2ZL R/W  motor 2Z HLM link  INLINK  Link from motor's limit field
HLAX x angle hi limit  DOUBLE  Calculated from motor limits
HLAY y angle hi limit  DOUBLE  Calculated from motor limits
HLAZ z angle hi limit  DOUBLE  Calculated from motor limits
HLX x hi limit  DOUBLE  Calculated from motor limits
HLY y hi limit  DOUBLE  Calculated from motor limits
HLZ z hi limit  DOUBLE  Calculated from motor limits
INIT R/W*  init table  SHORT  Command: Abandon calibration and sync drive fields to motor positions
GEOM R/W*  table geometry  DOUBLE  (0:"SRI", 1:"GEOCARS", 2:"NEWPORT", 3:"PNC") Specify the arrangement of table legs and motors.
L0X motor 0X lo limit  DOUBLE 
L0XL R/W  motor 0X LLM link  INLINK  Link from motor's limit field
L0Y motor 0Y lo limit  DOUBLE 
L0YL R/W  motor 0Y LLM link  INLINK  Link from motor's limit field
L1Y motor 1Y lo limit  DOUBLE 
L1YL R/W  motor 1Y LLM link  INLINK  Link from motor's limit field
L2X motor 2X lo limit  DOUBLE 
L2XL R/W  motor 2X LLM link  INLINK  Link from motor's limit field
L2Y motor 2Y lo limit  DOUBLE 
L2YL R/W  motor 2Y LLM link  INLINK  Link from motor's limit field
L2Z motor 2Z lo limit  DOUBLE 
L2ZL R/W  motor 2Z LLM link  INLINK  Link from motor's limit field
LEGU R/W  Linear Units Name  STRING  Engineering units for translations (16-chars)
LLAX x angle lo limit  DOUBLE  Calculated from motor limits
LLAY y angle lo limit  DOUBLE  Calculated from motor limits
LLAZ z angle lo limit  DOUBLE  Calculated from motor limits
LLX x lo limit  DOUBLE  Calculated from motor limits
LLY y lo limit  DOUBLE  Calculated from motor limits
LLZ z lo limit  DOUBLE  Calculated from motor limits
LVIO limit violation  SHORT  If nonzero, requested motion would violate limits
LX R/W  wheelbase x  DOUBLE  x distance between table legs M0 and M1
LZ R/W  wheelbase z  DOUBLE  z distance between table legs M0 and M2
M0X motor 0X val  DOUBLE  Desired motor position
M0XL R/W  motor 0X outlink  OUTLINK  Link to motor's drive field
M0Y motor 0Y val  DOUBLE  Desired motor position
M0YL R/W  motor 0Y outlink  OUTLINK  Link to motor's drive field
M1Y motor 1Y val  DOUBLE  Desired motor position
M1YL R/W  motor 1Y outlink  OUTLINK  Link to motor's drive field
M2X motor 2X val  DOUBLE  Desired motor position
M2XL R/W  motor 2X outlink  OUTLINK  Link to motor's drive field
M2Y motor 2Y val  DOUBLE  Desired motor position
M2YL R/W  motor 2Y outlink  OUTLINK  Link to motor's drive field
M2Z motor 2Z val  DOUBLE  Desired motor position
M2ZL R/W  motor 2Z outlink  OUTLINK  Link to motor's drive field
MMAP Monitor Mask  ULONG 
PP0 pivot pt 0  DOUBLE  Desired loc of pivot point 0 (3 vector)
PP1 pivot pt 1  DOUBLE  Desired loc of pivot point 1 (3 vector)
PP2 pivot pt 2  DOUBLE  Desired loc of pivot point 2 (3 vector)
PPO0 pivot pt 0 orig  DOUBLE  Current loc of pivot point 0 (3 vector)
PPO1 pivot pt 1 orig  DOUBLE  Current loc of pivot point 1 (3 vector)
PPO2 pivot pt 2 orig  DOUBLE  Current loc of pivot point 2 (3 vector)
PREC R/W  Display Precision  SHORT  Number of digits to right of decimal point
R0X motor 0X readback  DOUBLE  Motor's desired value
R0XI R/W  motor 0X RBV link  INLINK  Link from motor's drive field
R0Y motor 0Y readback  DOUBLE  Motor's desired value
R0YI R/W  motor 0Y RBV link  INLINK  Link from motor's drive field
R1Y motor 1Y readback  DOUBLE  Motor's desired value
R1YI R/W  motor 1Y RBV link  INLINK  Link from motor's drive field
R2X motor 2X readback  DOUBLE  Motor's desired value
R2XI R/W  motor 2X RBV link  INLINK  Link from motor's drive field
R2Y motor 2Y readback  DOUBLE  Motor's desired value
R2YI R/W  motor 2Y RBV link  INLINK  Link from motor's drive field
R2Z motor 2Z readback  DOUBLE  Motor's desired value
R2ZI R/W  motor 2Z RBV link  INLINK  Link from motor's drive field
READ R/W*  readback motors  SHORT  Command: read current motor positions, translate to table positions
RX R/W*  x of ref point  DOUBLE  X position of reference point
RY R/W*  y of ref point  DOUBLE  Y position of reference point
RZ R/W*  z of ref point  DOUBLE  Z position of reference point
SET R/W  set table  MENU  (0:"Use", 1:"Set")
SSET R/W  Set SET Mode  SHORT  asl(ASL0)
SUSE R/W  Set USE Mode  SHORT  asl(ASL0)
SX R/W*  x of fixed point  DOUBLE  X position of fixed point
SY R/W*  y of fixed point  DOUBLE  Y position of fixed point
SYNC R/W*  sync with motors  SHORT  Command: read motor positions, reconcile table positions to them
SZ R/W*  z of fixed point  DOUBLE  Z position of fixed point
UHAX R/W*  user's x angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAY R/W*  user's y angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAZ R/W*  user's z angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHX R/W*  user's x hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHY R/W*  user's y hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHZ R/W*  user's z hi limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAX R/W*  user's x angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAY R/W*  user's y angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAZ R/W*  user's z angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULX R/W*  user's x lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULY R/W*  user's y lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULZ R/W*  user's z lo limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAXR R/W*  user's x angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHAYR R/W*  user's y angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHAZR R/W*  user's z angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHXR R/W*  user's x hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHYR R/W*  user's y hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHZR R/W*  user's z hi limit  DOUBLE  Relative user limit (varies with table calibration)
ULAXR R/W*  user's x angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULAYR R/W*  user's y angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULAZR R/W*  user's z angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULXR R/W*  user's x lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULYR R/W*  user's y lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULZR R/W*  user's z lo limit  DOUBLE  Relative user limit (varies with table calibration)
V0X speed 0X val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V0XI R/W  speed 0X inlink  INLINK  Link from motor's speed field
V0XL R/W speed 0X outlink  OUTLINK  Link to motor's speed field
V0Y speed 0Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V0YI R/W  speed 0Y inlink  INLINK  Link from motor's speed field
V0YL R/W  speed 0Y outlink  OUTLINK  Link to motor's speed field
V1Y speed 1Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V1YI R/W  speed 1Y inlink  INLINK  Link from motor's speed field
V1YL R/W  speed 1Y outlink  OUTLINK  Link to motor's speed field
V2X speed 2X val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2XI R/W  speed 2X inlink  INLINK  Link from motor's speed field
V2XL R/W  speed 2X outlink  OUTLINK  Link to motor's speed field
V2Y speed 2Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2YI R/W  speed 2Y inlink  INLINK  Link from motor's speed field
V2YL R/W  speed 2Y outlink  OUTLINK  Link to motor's speed field
V2Z speed 2Z val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2ZI R/W  speed 2Z inlink  INLINK  Link from motor's speed field
V2ZL R/W  speed 2Z outlink  OUTLINK  Link to motor's speed field
VAL R/W  Result  DOUBLE  Not used
VERS Code Version  FLOAT  e.g., 5.0
X0 R/W  x offset  DOUBLE  True table position - reported table position
X R/W*  x translation  DOUBLE  x translation drive field
XL x true value  DOUBLE  True x translation
XRB x readback value  DOUBLE  x translation calc'd from motor drive values
Y0 R/W  y offset  DOUBLE  True table position - reported table position
Y R/W*  y translation  DOUBLE  y translation drive field
YANG R/W*  Orientation angle  DOUBLE  Rotation of table base about Y axis
YL y true value  DOUBLE  True y translation
YRB y readback value  DOUBLE  y translation calc'd from motor drive values
Z0 R/W  z offset  DOUBLE  True table position - reported table position
Z R/W*  z translation  DOUBLE  z translation drive field
ZERO R/W*  zero table  SHORT  Command: call current table position and angle 'zero'
ZL z true value  DOUBLE  True z translation
ZRB z readback value  DOUBLE  z translation calc'd from motor drive values 
Note: In the Access column above: 
R Read only
r Read only, not posted
R/W Read and write are allowed
R/W* Read and write are allowed; write triggers record processing if the record's SCAN field is set to "Passive."

Calibration fields

The table record allows you to redefine any table position (or angle) to any value you want. It implements this by maintaining an offset for each virtual motor. To redefine X, for example, put the table into "Set" mode (write "Set" or "1" to the SET field) and write the new value to X. You cal also redefine all positions/angles to be zero by writing "1" to the ZERO field.
Name  Access  Prompt  Data type  Comments
AX0  R/W  x-angle offset  DOUBLE  True table position - reported table position
AXL  x angle true value  DOUBLE  True x angle
AY0  R/W  y-angle offset  DOUBLE  True table position - reported table position
AYL  y angle true value  DOUBLE  True y angle
AZ0  R/W  z-angle offset  DOUBLE  True table position - reported table position
AZL  z angle true value  DOUBLE  True z angle
SET  R/W  set table  MENU  (0:"Use", 1:"Set")
SSET  R/W  Set SET Mode  SHORT  asl(ASL0)
SUSE  R/W  Set USE Mode  SHORT  asl(ASL0)
X0  R/W  x offset  DOUBLE  True table position - reported table position
XL  x true value  DOUBLE  True x translation
Y0  R/W  y offset  DOUBLE  True table position - reported table position
YL  y true value  DOUBLE  True y translation
Z0  R/W  z offset  DOUBLE  True table position - reported table position
ZERO  R/W*  zero table  SHORT  Command: call current table position and angle 'zero'
ZL  z true value  DOUBLE  True z translation

Setup fields

Three operations are required to set up the table. (Though simple, this is kind of messy in words. See Fig. 1-3 above.)
Name  Access  Prompt  Data type  Comments
GEOM  R/W*  table geometry  DOUBLE  (0:"SRI", 1:"GEOCARS", 2:"NEWPORT", 3:"PNC") Specify the arrangement of table legs and motors.
LX  R/W  wheelbase x  DOUBLE  x distance between table legs
LZ  R/W  wheelbase z  DOUBLE  z distance between table legs
RX  R/W*  x of ref point  DOUBLE  X position of reference point
RY  R/W*  y of ref point  DOUBLE  Y position of reference point
RZ  R/W*  z of ref point  DOUBLE  Z position of reference point
SX  R/W*  x loc fixed point  DOUBLE  X position of fixed point
SY  R/W*  y loc fixed point  DOUBLE  Y position of fixed point
SZ  R/W*  z loc fixed point  DOUBLE  Z position of fixed point
YANG  R/W*  Orientation angle  DOUBLE  Rotation of table base about Y axis

Link fields

The table record makes eight links with each of the six motor records it controls. For each motor, the table record reads and writes the drive and speed fields, and it reads the position-readback and limit fields.
Name  Access  Prompt  Data type  Comments
E0XI  R/W  encoder 0X inlink  INLINK  Link from M0X motor's readback
E0YI  R/W  encoder 0Y inlink  INLINK  Link from M0Y motor's readback
E1YI  R/W  encoder 1Y inlink  INLINK  Link from M1Y motor's readback
E2XI  R/W  encoder 2X inlink  INLINK  Link from M2X motor's readback
E2YI  R/W  encoder 2Y inlink  INLINK  Link from M2Y motor's readback
E2ZI  R/W  encoder 2Z inlink  INLINK  Link from M2Z motor's readback
H0XL  R/W  motor 0X HLM link  INLINK  Link from motor's limit field
H0YL  R/W  motor 0Y HLM link  INLINK  Link from motor's limit field
H1YL  R/W  motor 1Y HLM link  INLINK  Link from motor's limit field
H2XL  R/W  motor 2X HLM link  INLINK  Link from motor's limit field
H2YL  R/W  motor 2Y HLM link  INLINK  Link from motor's limit field
H2ZL  R/W  motor 2Z HLM link  INLINK  Link from motor's limit field
L0XL  R/W  motor 0X LLM link  INLINK  Link from motor's limit field
L0YL  R/W  motor 0Y LLM link  INLINK  Link from motor's limit field
L1YL  R/W  motor 1Y LLM link  INLINK  Link from motor's limit field
L2XL  R/W  motor 2X LLM link  INLINK  Link from motor's limit field
L2YL  R/W  motor 2Y LLM link  INLINK  Link from motor's limit field
L2ZL  R/W  motor 2Z LLM link  INLINK  Link from motor's limit field
M0XL  R/W  motor 0X outlink  OUTLINK  Link to motor's drive field
M0YL  R/W  motor 0Y outlink  OUTLINK  Link to motor's drive field
M1YL  R/W  motor 1Y outlink  OUTLINK  Link to motor's drive field
M2XL  R/W  motor 2X outlink  OUTLINK  Link to motor's drive field
M2YL  R/W  motor 2Y outlink  OUTLINK  Link to motor's drive field
M2ZL  R/W  motor 2Z outlink  OUTLINK  Link to motor's drive field
R0XI  R/W  motor 0X RBV link  INLINK  Link from motor's drive field
R0YI  R/W  motor 0Y RBV link  INLINK  Link from motor's drive field
R1YI  R/W  motor 1Y RBV link  INLINK  Link from motor's drive field
R2XI  R/W  motor 2X RBV link  INLINK  Link from motor's drive field
R2YI  R/W  motor 2Y RBV link  INLINK  Link from motor's drive field
R2ZI  R/W  motor 2Z RBV link  INLINK  Link from motor's drive field
V0XI  R/W  speed 0X inlink  INLINK  Link from motor's speed field
V0XL  R/W  speed 0X outlink  OUTLINK  Link to motor's speed field
V0YI  R/W  speed 0Y inlink  INLINK  Link from motor's speed field
V0YL  R/W  speed 0Y outlink  OUTLINK  Link to motor's speed field
V1YI  R/W  speed 1Y inlink  INLINK  Link from motor's speed field
V1YL  R/W  speed 1Y outlink  OUTLINK  Link to motor's speed field
V2XI  R/W  speed 2X inlink  INLINK  Link from motor's speed field
V2XL  R/W  speed 2X outlink  OUTLINK  Link to motor's speed field
V2YI  R/W  speed 2Y inlink  INLINK  Link from motor's speed field
V2YL  R/W  speed 2Y outlink  OUTLINK  Link to motor's speed field
V2ZI  R/W  speed 2Z inlink  INLINK  Link from motor's speed field
V2ZL  R/W  speed 2Z outlink  OUTLINK  Link to motor's speed field

Limit-related fields

The table record keeps a copy of each motor's high and low limit values. From them it calculates high and low limits for the virtual motors. It's probably worth emphasizing the fact that virtual-motor limits are coupled: if you rotate the table about the X axis as far as it will go, you no longer have any room left to translate it in at least one Y direction, for example.

User limits UH* and UL* are applied to virtual-motor limits after those limits have been calculated from motor limits. If both the high and low absolute limits associated with a motion are exactly zero, those limits are ignored. To keep a table's X angle at zero, then, you might set UHAX=.001, ULAX=-.001.

Note that there are both absolute and relative user-limit fields. Absolute limits (UHAX, for example) don't change as the table calibration is changed; relative limits do vary with table calibration. (The table calibration is changed either by pressing the "Zero" button, or by putting the table in "Set" mode and writing to virtual motors such as X, Ax, etc.)

Name  Access  Prompt  Data type  Comments
H0X  motor 0X hi limit  DOUBLE 
H0Y  motor 0Y hi limit  DOUBLE 
H1Y  motor 1Y hi limit  DOUBLE 
H2X  motor 2X hi limit  DOUBLE 
H2Y  motor 2Y hi limit  DOUBLE 
H2Z  motor 2Z hi limit  DOUBLE 
HLAX  x angle hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
HLAY  y angle hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
HLAZ  z angle hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
HLX  x hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
HLY  y hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
HLZ  z hi limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
L0X  motor 0X lo limit  DOUBLE 
L0Y  motor 0Y lo limit  DOUBLE 
L1Y  motor 1Y lo limit  DOUBLE 
L2X  motor 2X lo limit  DOUBLE 
L2Y  motor 2Y lo limit  DOUBLE 
L2Z  motor 2Z lo limit  DOUBLE 
LLAX  x angle lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LLAY  y angle lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LLAZ  z angle lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LLX  x lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LLY  y lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LLZ  z lo limit  DOUBLE  Calculated from motor limits (maybe further constrained by user limits)
LVIO  limit violation  SHORT  Requested motion would violate limits
UHAX  R/W*  user's x angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAY  R/W*  user's y angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAZ  R/W*  user's z angle hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHX  R/W*  user's x hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHY  R/W*  user's y hi limit  DOUBLE  Absolute user limit (independent of table calibration)
UHZ  R/W*  user's z hi limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAX  R/W*  user's x angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAY  R/W*  user's y angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULAZ  R/W*  user's z angle lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULX  R/W*  user's x lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULY  R/W*  user's y lo limit  DOUBLE  Absolute user limit (independent of table calibration)
ULZ  R/W*  user's z lo limit  DOUBLE  Absolute user limit (independent of table calibration)
UHAXR  R/W*  user's x angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHAYR  R/W*  user's y angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHAZR  R/W*  user's z angle hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHXR  R/W*  user's x hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHYR  R/W*  user's y hi limit  DOUBLE  Relative user limit (varies with table calibration)
UHZR  R/W*  user's z hi limit  DOUBLE  Relative user limit (varies with table calibration)
ULAXR  R/W*  user's x angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULAYR  R/W*  user's y angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULAZR  R/W*  user's z angle lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULXR  R/W*  user's x lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULYR  R/W*  user's y lo limit  DOUBLE  Relative user limit (varies with table calibration)
ULZR  R/W*  user's z lo limit  DOUBLE  Relative user limit (varies with table calibration)


Speed-related fields

The table record sets motor speeds immediately before commanding motors to move, so that all involved motors will start and stop at the same time. (Immediately after move commands are issued--while motors are still moving--the motor speeds are returned to their original values. The table record assumes that motors do not honor speed changes made while motors are moving.) For small moves, this speed setting has the effect of keeping the "fixed" point fixed during rotations, but for longer moves, motor speeds would have to be varied on the fly to really keep the "fixed point" fixed, and the motor record does not attempt to do this. In addition, motor gearing, and the limited speed range over which most motors operate reliably, can prevent those motors from moving at speeds that would keep the "fixed" point fixed even during small rotations. You should ensure that any motor controlled by the table record really does move reliably at any speed between its base speed and nominal (top) speed.
Name  Access  Prompt  Data type  Comments
V0X  speed 0X val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V0Y  speed 0Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V1Y  speed 1Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2X  speed 2X val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2Y  speed 2Y val  DOUBLE  Speed to be written to motor (for duration of commanded move)
V2Z  speed 2Z val  DOUBLE  Speed to be written to motor (for duration of commanded move)

Table drive fields

These are the fields by which you drive the table.
Name  Access  Prompt  Data type  Comments
AX  R/W*  x angle  DOUBLE  x-angle drive field
AY  R/W*  y angle  DOUBLE  y-angle drive field
AZ  R/W*  z angle  DOUBLE  z-angle drive field
R/W*  x translation  DOUBLE  x translation drive field
R/W*  y translation  DOUBLE  y translation drive field
R/W*  z translation  DOUBLE  z translation drive field

Motor drive fields

These are the fields by which the table record drives the motors.
Name  Access  Prompt  Data type  Comments
M0X  motor 0X val  DOUBLE  Desired motor position
M0Y  motor 0Y val  DOUBLE  Desired motor position
M1Y  motor 1Y val  DOUBLE  Desired motor position
M2X  motor 2X val  DOUBLE  Desired motor position
M2Y  motor 2Y val  DOUBLE  Desired motor position
M2Z  motor 2Z val  DOUBLE  Desired motor position

Readback fields

There are four varieties of readback fields.
  1. Readbacks from the motor-drive fields (e.g., R0X). These are used only to determine how fast motors must move to keep the "fixed" point fixed during moves.
  2. Readbacks from motor-readback fields (e.g., E0X). These are shoved through a 6x6 matrix to get raw virtual-motor readbacks
  3. Raw virtual-motor readbacks (e.g., XRB) tell you where the table really is.
  4. Adjusted virtual-motor readbacks (e.g., EX) tell you where the table is, keeping in mind any recalibration you may have done.
Name  Access  Prompt  Data type  Comments
AXRB  x angle readback  DOUBLE  x angle calc'd from motor drive values
AYRB  y angle readback  DOUBLE  y angle calc'd from motor drive values
AZRB  z angle readback  DOUBLE  z angle calc'd from motor drive values
E0X  encoder 0X val  DOUBLE  Current position of M0X motor
E0Y  encoder 0Y val  DOUBLE  Current position of M0Y motor
E1Y  encoder 1Y val  DOUBLE  Current position of M1Y motor
E2X  encoder 2X val  DOUBLE  Current position of M2X motor
E2Y  encoder 2Y val  DOUBLE  Current position of M2Y motor
E2Z  encoder 2Z val  DOUBLE  Current position of M2Z motor
EAX  encoder x angle  DOUBLE  Current table position (x angle) 
EAY  encoder y angle  DOUBLE  Current table position (y angle)
EAZ  encoder z angle  DOUBLE  Current table position (z angle)
EX  encoder x  DOUBLE  Current table position (x translation)
EY  encoder y  DOUBLE  Current table position (y translation)
EZ  encoder z  DOUBLE  Current table position (z translation)
R0X  motor 0X readback  DOUBLE  Motor's desired value
R0Y  motor 0Y readback  DOUBLE  Motor's desired value
R1Y  motor 1Y readback  DOUBLE  Motor's desired value
R2X  motor 2X readback  DOUBLE  Motor's desired value
R2Y  motor 2Y readback  DOUBLE  Motor's desired value
R2Z  motor 2Z readback  DOUBLE  Motor's desired value
XRB  x readback value  DOUBLE  x translation calc'd from motor drive values
YRB  y readback value  DOUBLE  y translation calc'd from motor drive values
ZRB  z readback value  DOUBLE  z translation calc'd from motor drive values

Miscellaneous fields

Name  Access  Prompt  Data type  Comments
AEGU  R/W  Angular Units Name STRING  Engineering units for angles (16-chars)
INIT  R/W*  init table  SHORT  Command: Abandon calibration and sync drive fields to motor positions
LEGU  R/W  Linear Units Name  STRING  Engineering units for translations (16-chars)
PREC  R/W  Display Precision  SHORT  Number of digits to right of decimal point
READ  R/W*  readback motors  SHORT  Command: Read current motor positions, translate to table positions
SYNC  R/W*  sync with motors  SHORT  Command: Read motor positions, reconcile table positions to them
VAL  R/W  Result  DOUBLE  Not used
VERS  Code Version  FLOAT  e.g., 5.0

Private fields

Name  Access  Prompt  Data type  Comments
x to m matrix  DOUBLE*  3x3 rotation matrix
m to x matrix  DOUBLE*  3x3 utility matrix
MMAP  Monitor Mask  ULONG 
PP0  pivot pt 0  DOUBLE  Desired loc of pivot point 0 (3 vector)
PP1  pivot pt 1  DOUBLE  Desired loc of pivot point 1 (3 vector)
PP2  pivot pt 2  DOUBLE  Desired loc of pivot point 2 (3 vector)
PPO0  pivot pt 0 orig  DOUBLE  Loc of pivot point 0 when all user coordinates are zero (3 vector)
PPO1  pivot pt 1 orig  DOUBLE  Loc of pivot point 1 when all user coordinates are zero (3 vector)
PPO2  pivot pt 2 orig  DOUBLE  Loc of pivot point 2 when all user coordinates are zero (3 vector)

Files

The following table briefly describes the files required to implement and use the table record.  

SOURCE CODE
files to be placed in <top>/<app>App/src/
tableRecord.c  Record support code
tableRecord.dbd  Database definition file
Makefile Make sure the following lines occur in the file:
DBDINC += tableRecord
SRCS += tableRecord.c
<app>Include.dbd Make sure the following line occurs in the file:
include "tableRecord.dbd"

DATABASES
files to be placed in <top>/<app>App/Db/
table.db  Table database
The database file contains one table record linked with up to six motor records defined in some other database. The motor records are referred to as $(P)$(M0X), $(P)$(M0Y), $(P)$(M1Y), $(P)$(M2X), $(P)$(M2Y), and $(P)$(M2Z).

This database allows you to give names of motors that don't actually exist, to support tables that have fewer than six motors. This database works with fewer than six motors only if you have version 3.6 or later of the transform record. Earlier versions of the transform record refuse to operate unless all of their non-blank link fields contain valid links. 

table_settings.req Autosave request file, which names the PV's in table.db that should be preserved across a reboot of the computer on which this software runs.

MEDM DISPLAY FILES
files to be placed in <top>/<app>App/op/adl/
table.adl  Small control display
table_setup_SRI.adl  Setup display for SRI geometry
table_setup_GEOCARS.adl  Setup display for GEOCARS geometry
table_setup_NEWPORT.adl  Setup display for NEWPORT geometry
table_setup_PNC.adl  Setup display for PNC geometry
table_full.adl  Full control display
These files build medm screens to access the table record. To use one of them from the command line, type, for example
medm -x -macro "P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6" table.adl
where xxx:table1 is the name of the table record, and xxx:Table1: is the prefix attached to all other records in the table database.

EPICS STARTUP FILES
files to be placed in <top>/iocBoot/ioc<name>/
st.cmd  Startup script
This file is not included in the distribution. The following line added to st.cmd loads a single table. Note that the NEWPORT geometry normally does not have a motor associated with M2Z. Indicate this by setting M2Z to some string (e.g., "junk") that will not resolve to the name of an existing record. 
dbLoadRecords("xxxApp/Db/table.db","P=xxx:,Q=Table1,T=table1,M0X=m1,M0Y=m2,M1Y=m3,M2X=m4,M2Y=m5,M2Z=m6,GEOM=SRI")

BACKUP/RESTORE (BURT) REQUEST FILES
files to be placed in <top>/<app>App/op/burt/
yyTableSettings.req  save settings of a specified table. This file is normally #include'd (once for each table) by other request files.


Restrictions


Suggestions and comments to:

Tim Mooney : (mooney@aps.anl.gov)