Table Record and related software
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
- Previously, the transformation between user coordinates (the translations X, Y, Z; the angles AX, AY, AZ; and limits constraining those quantities) and motor coordinates (M0X, M0Y, M1Y, M2X, M2Y, M2Z, and associated limits) was calculated only to first order in the angles. In this version, all calculations are exact.
-
Previously, the location of the point fixed under rotations was specified by the fields SX, SY, and SZ, which were distances from various pivot points with various sign conventions. In this version, the location is specified by two vectors: a reference-point vector R, which locates an arbitrary point from which measurements are practical (e.g., a corner of the table surface); and the vector, S, which locates the fixed point relative to R. These vectors are specified with the fields RX, RY, RZ, SX, SY, SZ. They are defined relative to the origin of the table’s local coordinate system. (See Figs. 1-4.)
If R=0, the new system is nearly identical to the old, except for the value SX, whose definition has changed such that SX_new = LX - SX_old. (In most cases, SX_old was equal to LX/2, so no change is required.)
- The field LX21 has been deleted.
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 |
Name | Access | Prompt | Data type | Comment |
---|---|---|---|---|
A | R | x to m matrix | DOUBLE* | 3x3 rotation matrix |
AEGU | R/W | Angular Units Name | MENU | Engineering units for angles (16-chars). This field will be filled in by the record according to AUNIT |
AUNIT | R/W | Angular Units Menu | STRING | Engineering units for angles: “degrees” or microradians (“ur”) |
AX0 | R/W | x-angle offset | DOUBLE | True table position - reported table position |
AX | R/W* | x angle | DOUBLE | x-angle drive field |
AXL | R | x angle true value | DOUBLE | True x angle |
AXRB | R | 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 | R | y angle true value | DOUBLE | True y angle |
AYRB | R | 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 | R | z angle true value | DOUBLE | True z angle |
AZRB | R | z angle readback | DOUBLE | z angle calculated from motor drive values |
B | R | m to x matrix | DOUBLE* | 3x3 utility matrix |
E0X | R | encoder 0X val | DOUBLE | Current position of M0X motor |
E0XI | R/W | encoder 0X inlink | INLINK | Link from M0X motor’s readback |
E0Y | R | encoder 0Y val | DOUBLE | Current position of M0Y motor |
E0YI | R/W | encoder 0Y inlink | INLINK | Link from M0Y motor’s readback |
E1Y | R | encoder 1Y val | DOUBLE | Current position of M1Y motor |
E1YI | R/W | encoder 1Y inlink | INLINK | Link from M1Y motor’s readback |
E2X | R | encoder 2X val | DOUBLE | Current position of M2X motor |
E2XI | R/W | encoder 2X inlink | INLINK | Link from M2X motor’s readback |
E2Y | R | encoder 2Y val | DOUBLE | Current position of M2Y motor |
E2YI | R/W | encoder 2Y inlink | INLINK | Link from M2Y motor’s readback |
E2Z | R | encoder 2Z val | DOUBLE | Current position of M2Z motor |
E2ZI | R/W | encoder 2Z inlink | INLINK | Link from M2Z motor’s readback |
EAX | R | encoder x angle | DOUBLE | Current table position (x angle) |
EAY | R | encoder y angle | DOUBLE | Current table position (y angle) |
EAZ | R | encoder z angle | DOUBLE | Current table position (z angle) |
EX | R | encoder x | DOUBLE | Current table position (x translation) |
EY | R | encoder y | DOUBLE | Current table position (y translation) |
EZ | R | encoder z | DOUBLE | Current table position (z translation) |
H0X | R | motor 0X hi limit | DOUBLE | |
H0XL | R/W | motor 0X HLM link | INLINK | Link from motor’s limit field |
H0Y | R | motor 0Y hi limit | DOUBLE | |
H0YL | R/W | motor 0Y HLM link | INLINK | Link from motor’s limit field |
H1Y | R | motor 1Y hi limit | DOUBLE | |
H1YL | R/W | motor 1Y HLM link | INLINK | Link from motor’s limit field |
H2X | R | motor 2X hi limit | DOUBLE | |
H2XL | R/W | motor 2X HLM link | INLINK | Link from motor’s limit field |
H2Y | R | motor 2Y hi limit | DOUBLE | |
H2YL | R/W | motor 2Y HLM link | INLINK | Link from motor’s limit field |
H2Z | R | motor 2Z hi limit | DOUBLE | |
H2ZL | R/W | motor 2Z HLM link | INLINK | Link from motor’s limit field |
HLAX | R | x angle hi limit | DOUBLE | Calculated from motor limits |
HLAY | R | y angle hi limit | DOUBLE | Calculated from motor limits |
HLAZ | R | z angle hi limit | DOUBLE | Calculated from motor limits |
HLX | R | x hi limit | DOUBLE | Calculated from motor limits |
HLY | R | y hi limit | DOUBLE | Calculated from motor limits |
HLZ | R | 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 | R | motor 0X lo limit | DOUBLE | |
L0XL | R/W | motor 0X LLM link | INLINK | Link from motor’s limit field |
L0Y | R | motor 0Y lo limit | DOUBLE | |
L0YL | R/W | motor 0Y LLM link | INLINK | Link from motor’s limit field |
L1Y | R | motor 1Y lo limit | DOUBLE | |
L1YL | R/W | motor 1Y LLM link | INLINK | Link from motor’s limit field |
L2X | R | motor 2X lo limit | DOUBLE | |
L2XL | R/W | motor 2X LLM link | INLINK | Link from motor’s limit field |
L2Y | R | motor 2Y lo limit | DOUBLE | |
L2YL | R/W | motor 2Y LLM link | INLINK | Link from motor’s limit field |
L2Z | R | 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 | R | x angle lo limit | DOUBLE | Calculated from motor limits |
LLAY | R | y angle lo limit | DOUBLE | Calculated from motor limits |
LLAZ | R | z angle lo limit | DOUBLE | Calculated from motor limits |
LLX | R | x lo limit | DOUBLE | Calculated from motor limits |
LLY | R | y lo limit | DOUBLE | Calculated from motor limits |
LLZ | R | z lo limit | DOUBLE | Calculated from motor limits |
LVIO | R | 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 | R | motor 0X val | DOUBLE | Desired motor position |
M0XL | R/W | motor 0X outlink | OUTLINK | Link to motor’s drive field |
M0Y | R | motor 0Y val | DOUBLE | Desired motor position |
M0YL | R/W | motor 0Y outlink | OUTLINK | Link to motor’s drive field |
M1Y | R | motor 1Y val | DOUBLE | Desired motor position |
M1YL | R/W | motor 1Y outlink | OUTLINK | Link to motor’s drive field |
M2X | R | motor 2X val | DOUBLE | Desired motor position |
M2XL | R/W | motor 2X outlink | OUTLINK | Link to motor’s drive field |
M2Y | R | motor 2Y val | DOUBLE | Desired motor position |
M2YL | R/W | motor 2Y outlink | OUTLINK | Link to motor’s drive field |
M2Z | R | motor 2Z val | DOUBLE | Desired motor position |
M2ZL | R/W | motor 2Z outlink | OUTLINK | Link to motor’s drive field |
MMAP | R | Monitor Mask | ULONG | |
PP0 | R | pivot pt 0 | DOUBLE | Desired loc of pivot point 0 (3 vector) |
PP1 | R | pivot pt 1 | DOUBLE | Desired loc of pivot point 1 (3 vector) |
PP2 | R | pivot pt 2 | DOUBLE | Desired loc of pivot point 2 (3 vector) |
PPO0 | R | pivot pt 0 orig | DOUBLE | Current loc of pivot point 0 (3 vector) |
PPO1 | R | pivot pt 1 orig | DOUBLE | Current loc of pivot point 1 (3 vector) |
PPO2 | R | 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 | R | motor 0X readback | DOUBLE | Motor’s desired value |
R0XI | R/W | motor 0X RBV link | INLINK | Link from motor’s drive field |
R0Y | R | motor 0Y readback | DOUBLE | Motor’s desired value |
R0YI | R/W | motor 0Y RBV link | INLINK | Link from motor’s drive field |
R1Y | R | motor 1Y readback | DOUBLE | Motor’s desired value |
R1YI | R/W | motor 1Y RBV link | INLINK | Link from motor’s drive field |
R2X | R | motor 2X readback | DOUBLE | Motor’s desired value |
R2XI | R/W | motor 2X RBV link | INLINK | Link from motor’s drive field |
R2Y | R | motor 2Y readback | DOUBLE | Motor’s desired value |
R2YI | R/W | motor 2Y RBV link | INLINK | Link from motor’s drive field |
R2Z | R | 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 | R | 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 | R | 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 | R | 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 | R | 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 | R | 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 | R | 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 | R | 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 | R | x true value | DOUBLE | True x translation |
XRB | R | 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 | R | y true value | DOUBLE | True y translation |
YRB | R | 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 | R | z true value | DOUBLE | True z translation |
ZRB | R | z readback value | DOUBLE | z translation calc’d from motor drive values |
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. 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 | R | x angle true value | DOUBLE | True x angle |
AY0 | R/W | y-angle offset | DOUBLE | True table position - reported table position |
AYL | R | y angle true value | DOUBLE | True y angle |
AZ0 | R/W | z-angle offset | DOUBLE | True table position - reported table position |
AZL | R | 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 | R | x true value | DOUBLE | True x translation |
Y0 | R/W | y offset | DOUBLE | True table position - reported table position |
YL | R | 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 | R | 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.) Specify the locations of the pivot points (legs).
Select a table geometry by setting the field GEOM to “SRI”, “GEOCARS”, “NEWPORT”, or “PNC”.
SRI geometry
The distance between M0 and M1 is specified with the field LX. (A line from M1 to M0 defines the positive x direction of the table’s local coordinate system. The perpendicular distance from M2 to the line M1-M0 is specified with the field LZ.
GEOCARS geometry
The distance between M0 and the line M1-M2 is specified with the field LX. (A line through M0 and perpendicular to M1-M2 defines the positive x direction of the table’s local coordinate system. The distance from M1 to M2 is specified with the field LZ.
NEWPORT geometry
The distance between M1 and the line M0-M2 is specified with the field LX. (A line perpendicular to M0-M2 defines the x direction of the table’s local coordinate system. The distance from M0 to M2 is specified with the field LZ.
PNC geometry
The distance between M0 and M1 is specified with the field LX. (A line from M0 to M1 defines the positive x direction of the table’s local coordinate system. The perpendicular distance from M2 to the line M0-M1 is specified with the field LZ.
Specify the orientation of the table with respect to the laboratory coordinate system.
The table orientation is specified with YANG, the angle through which the table must be rotated from an arbitrarily chosen “standard” position to the position in which you are going to use it. For the SRI and PNC geometries, when YANG=0, M2 is downstream. For the GEOCARS geometry, when YANG=0, M1 is directly downstream from M2. For the NEWPORT geometry, when YANG=0, M2 is directly downstream from M0. As the table rotates clockwise (as seen from above) YANG increases. (These standard positions are illustrated in Figs. 1-4.)
Specify the point about which the table is to rotate.
This point is specified by (RZ, RY, RZ) and (SX, SY, SZ), as shown in Figs. 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 | R | motor 0X hi limit | DOUBLE | |
H0Y | R | motor 0Y hi limit | DOUBLE | |
H1Y | R | motor 1Y hi limit | DOUBLE | |
H2X | R | motor 2X hi limit | DOUBLE | |
H2Y | R | motor 2Y hi limit | DOUBLE | |
H2Z | R | motor 2Z hi limit | DOUBLE | |
HLAX | R | x angle hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
HLAY | R | y angle hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
HLAZ | R | z angle hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
HLX | R | x hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
HLY | R | y hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
HLZ | R | z hi limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
L0X | R | motor 0X lo limit | DOUBLE | |
L0Y | R | motor 0Y lo limit | DOUBLE | |
L1Y | R | motor 1Y lo limit | DOUBLE | |
L2X | R | motor 2X lo limit | DOUBLE | |
L2Y | R | motor 2Y lo limit | DOUBLE | |
L2Z | R | motor 2Z lo limit | DOUBLE | |
LLAX | R | x angle lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LLAY | R | y angle lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LLAZ | R | z angle lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LLX | R | x lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LLY | R | y lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LLZ | R | z lo limit | DOUBLE | Calculated from motor limits (maybe further constrained by user limits) |
LVIO | R | 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 | R | speed 0X val | DOUBLE | Speed to be written to motor (for duration of commanded move) |
V0Y | R | speed 0Y val | DOUBLE | Speed to be written to motor (for duration of commanded move) |
V1Y | R | speed 1Y val | DOUBLE | Speed to be written to motor (for duration of commanded move) |
V2X | R | speed 2X val | DOUBLE | Speed to be written to motor (for duration of commanded move) |
V2Y | R | speed 2Y val | DOUBLE | Speed to be written to motor (for duration of commanded move) |
V2Z | R | 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 |
X | R/W* | x translation | DOUBLE | x translation drive field |
Y | R/W* | y translation | DOUBLE | y translation drive field |
Z | 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 | R | motor 0X val | DOUBLE | Desired motor position |
M0Y | R | motor 0Y val | DOUBLE | Desired motor position |
M1Y | R | motor 1Y val | DOUBLE | Desired motor position |
M2X | R | motor 2X val | DOUBLE | Desired motor position |
M2Y | R | motor 2Y val | DOUBLE | Desired motor position |
M2Z | R | motor 2Z val | DOUBLE | Desired motor position |
Readback fields
There are four varieties of readback fields.
- 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.
- Readbacks from motor-readback fields (e.g., E0X). These are shoved through a 6x6 matrix to get raw virtual-motor readbacks
- Raw virtual-motor readbacks (e.g., XRB) tell you where the table really is.
- 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 | R | x angle readback | DOUBLE | x angle calc’d from motor drive values |
AYRB | R | y angle readback | DOUBLE | y angle calc’d from motor drive values |
AZRB | R | z angle readback | DOUBLE | z angle calc’d from motor drive values |
E0X | R | encoder 0X val | DOUBLE | Current position of M0X motor |
E0Y | R | encoder 0Y val | DOUBLE | Current position of M0Y motor |
E1Y | R | encoder 1Y val | DOUBLE | Current position of M1Y motor |
E2X | R | encoder 2X val | DOUBLE | Current position of M2X motor |
E2Y | R | encoder 2Y val | DOUBLE | Current position of M2Y motor |
E2Z | R | encoder 2Z val | DOUBLE | Current position of M2Z motor |
EAX | R | encoder x angle | DOUBLE | Current table position (x angle) |
EAY | R | encoder y angle | DOUBLE | Current table position (y angle) |
EAZ | R | encoder z angle | DOUBLE | Current table position (z angle) |
EX | R | encoder x | DOUBLE | Current table position (x translation) |
EY | R | encoder y | DOUBLE | Current table position (y translation) |
EZ | R | encoder z | DOUBLE | Current table position (z translation) |
R0X | R | motor 0X readback | DOUBLE | Motor’s desired value |
R0Y | R | motor 0Y readback | DOUBLE | Motor’s desired value |
R1Y | R | motor 1Y readback | DOUBLE | Motor’s desired value |
R2X | R | motor 2X readback | DOUBLE | Motor’s desired value |
R2Y | R | motor 2Y readback | DOUBLE | Motor’s desired value |
R2Z | R | motor 2Z readback | DOUBLE | Motor’s desired value |
XRB | R | x readback value | DOUBLE | x translation calc’d from motor drive values |
YRB | R | y readback value | DOUBLE | y translation calc’d from motor drive values |
ZRB | R | 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). This field will be filled in by the record according to AUNIT |
AUNIT | R/W | Angular Units Menu | MENU | Engineering units for angles: “degrees” or microradians (“ur”) |
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 | R | Code Version | FLOAT | e.g., 5.0 |
Private fields
Name | Access | Prompt | Data type | Comments |
---|---|---|---|---|
A | R | x to m matrix | DOUBLE* | 3x3 rotation matrix |
B | R | m to x matrix | DOUBLE* | 3x3 utility matrix |
MMAP | R | Monitor Mask | ULONG | |
PP0 | R | pivot pt 0 | DOUBLE | Desired loc of pivot point 0 (3 vector) |
PP1 | R | pivot pt 1 | DOUBLE | Desired loc of pivot point 1 (3 vector) |
PP2 | R | pivot pt 2 | DOUBLE | Desired loc of pivot point 2 (3 vector) |
PPO0 | R | pivot pt 0 orig | DOUBLE | Loc of pivot point 0 when all user coordinates are zero (3 vector) |
PPO1 | R | pivot pt 1 orig | DOUBLE | Loc of pivot point 1 when all user coordinates are zero (3 vector) |
PPO2 | R | 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 in /opticsApp/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"
DATABASE files in <top>/opticsApp/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 in <top>/opticsApp/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 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")
- 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.
BACKUP/RESTORE (BURT) REQUEST FILES in <top>/opticsApp/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:
Keenan Lang : (klang@anl.gov)