forked from epics_driver_modules/motorBase
4719 lines
91 KiB
HTML
4719 lines
91 KiB
HTML
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]">
|
|
<title>Motor Record and related software</title>
|
|
</head>
|
|
<body>
|
|
|
|
<h1>
|
|
Motor Record and related software</h1>
|
|
|
|
<address>
|
|
Tim Mooney, Joe Sullivan, Ron Sluiter</address>
|
|
|
|
<br>
|
|
<hr>
|
|
<h2>
|
|
Contents</h2>
|
|
|
|
<ul>
|
|
<li>
|
|
<a href="#Overview">Overview</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields">Field Descriptions</a></li>
|
|
|
|
<li>
|
|
<a href="#Files">Files, device-support</a></li>
|
|
|
|
<li>
|
|
<a href="#Restrictions">Restrictions</a></li>
|
|
|
|
<li>
|
|
<a href="#Examples">Examples</a></li>
|
|
|
|
<li>
|
|
<a href="#Design Decisions">Design Decisions</a></li>
|
|
</ul>
|
|
<a NAME="Overview"></a>
|
|
<h2>
|
|
Overview</h2>
|
|
This documentation describes version 4.4 of the EPICS motor record, and
|
|
related EPICS software required to build and use it. Version 4.4
|
|
of the motor record is compatible with EPICS baseR3.13.2 and above.
|
|
<p>The motor record is intended to support motors of all kinds, but currently
|
|
supports only the following variety of motor controllers (in addition to
|
|
Soft Channel support):
|
|
<ul>
|
|
<li>
|
|
Oregon Micro Systems, Inc. (OMS) models; VME8, VME44 and VME58.</li>
|
|
|
|
<li>
|
|
Highland Technologies model V540.</li>
|
|
|
|
<li>
|
|
Newport models MM3000, MM4000, MM4005 and PM500.</li>
|
|
|
|
<li>
|
|
Intelligent Motion Systems, Inc. (IMS) model IM483.</li>
|
|
</ul>
|
|
The record maintains two coordinate systems for motor position ("user"
|
|
and "dial" coordinates); displays drive and readback values; enforces limits
|
|
to motor motion and maintains those limits in both coordinate systems;
|
|
displays the states of limit switches; can use a home switch; optionally
|
|
takes out backlash in a user-defined direction; and provides a mechanism
|
|
by which the user and other EPICS records can recalibrate the motor position
|
|
in either coordinate system. The record also supports "tweak", "jog", and
|
|
"home" motions, and supports both absolute and relative motions in user
|
|
coordinates. Two "stop" switches are provided: a simple one for use by
|
|
other records and by channel-access clients, and a more versatile one for
|
|
interactive use.
|
|
<p>Except where specified otherwise, fields associated with the motor position
|
|
and its derivatives take values in user-specified "engineering units",
|
|
such as degrees; the engineering unit name is contained in the field EGU.
|
|
Thus, generally, speeds are expressed in EGU's per second. Accelerations,
|
|
however, are expressed as the number of seconds taken to accelerate to
|
|
full speed. However, additional fields are provided so that the motor position
|
|
can be specified in steps and the speed in revolutions per second, and
|
|
so that the step size can be set by specifying the number of steps per
|
|
revolution and the number of EGU's per revolution.
|
|
<p>The motor record can read motor position from the controller's readback
|
|
register or encoder register, or from any other EPICS record, via an EPICS
|
|
input link. While the motor is moving, the record can trigger an output
|
|
link periodically, to send readback information to other EPICS records.
|
|
When a complete motion (possibly including backlash takeout) is finished,
|
|
the record can trigger a forward link to process other EPICS records.
|
|
<p>The motor record can force its drive fields to agree with its readback
|
|
fields, and it does so in a variety of circumstances (e.g., when the user
|
|
tells a motor to stop, and when a limit switch is hit). Therefore, if you
|
|
are driving the motor record's VAL or DVAL field with the output of another
|
|
record, and you want that record always to contain the same value as the
|
|
motor record, you must handle this behavior in the database. One way to
|
|
do this is to forward link the motor record to a soft analog output record,
|
|
and to cause that AO record to grab the motor record's VAL or DVAL field
|
|
and poke it into your record.
|
|
<p>The motor record is unlike most other EPICS records in that its processing
|
|
is neither "synchronous" nor "asynchronous", as these terms are used in
|
|
the EPICS Record Reference Manual. Currently, the PACT field is always
|
|
FALSE after record processing has completed, even though a motor motion
|
|
may be in progress. This means the record always responds to channel-access
|
|
puts, and can be stopped or retargeted at any time. The record's forward
|
|
link is not executed until the motor has stopped and no motion requests
|
|
are pending. <a NAME="Fields"></a>
|
|
<h2>
|
|
Field Descriptions</h2>
|
|
In addition to fields common to all record types (see the <a href="http://www.atdiv.lanl.gov/aot8/epics/dbase/recref/rcrf-1.html">EPICS
|
|
Record Reference Manual</a> for these) the motor record has the fields
|
|
described below.
|
|
<ul>
|
|
<li>
|
|
<a href="#Fields_alphabetical">Alphabetical listing of all fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_calib">Calibration-related fields:</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_res">Motor-resolution fields:</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_motion">Motion-related fields:</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_link">Link-related fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_limit">Limit-related fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_drive">Drive fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_status">Status/readback fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Servo_fields">Servo fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_alarm">Alarm fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_misc">Miscellaneous fields</a></li>
|
|
|
|
<li>
|
|
<a href="#Fields_private">Private fields</a></li>
|
|
</ul>
|
|
|
|
<hr>
|
|
<table BORDER NOSAVE >
|
|
<caption><a NAME="Fields_alphabetical"></a>
|
|
<h2>
|
|
Alphabetical list of record-specific fields</h2>
|
|
NOTE: Hot links in this table take you only to the <i>section</i> in which
|
|
the linked item is described in detail. You'll probably have to scroll
|
|
down to find the actual item.</caption>
|
|
|
|
<tr>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comment</th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">ACCL</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Seconds to Velocity </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>acceleration time</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">ATHM</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>At HOME </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>uses the HOME switch</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">BACC</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Seconds to Veloc. </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>backlash acceleration time</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">BDST</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Distance (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>backlash distance</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">BVEL</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>backlash speed</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">CARD</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Card Number </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>EPICS card #</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">CBAK</a></td>
|
|
|
|
<td>None</td>
|
|
|
|
<td>Callback structure</td>
|
|
|
|
<td>NOACCESS</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Servo_fields">CNEN</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Enable control</td>
|
|
|
|
<td>RECCHOICE</td>
|
|
|
|
<td>(0:"Disable", 1:"Enable")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Servo_fields">DCOF</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Derivative Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">DHLM</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial High Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">DIFF</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Difference dval-drbv </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">DINP</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>DMOV Input Link</td>
|
|
|
|
<td>INLINK</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">DIR</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User Direction </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Pos", 1:"Neg")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">DLLM</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial Low Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">DLY</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Readback settle time (s)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">DMOV</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Done moving to value </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The "done" flag</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">DOL</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Desired Output Loc</td>
|
|
|
|
<td>INLINK </td>
|
|
|
|
<td>only for closed-loop mode</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">DRBV</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Dial Readback Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_drive">DVAL</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial Desired Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">EGU</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Engineering Units </td>
|
|
|
|
<td>STRING </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">ERES</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Encoder Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">FOF</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Freeze Offset </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">FOFF</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Offset-Freeze Switch </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Variable", 1:"Frozen")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">FRAC</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Move Fraction </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">HHSV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Hihi Severity </td>
|
|
|
|
<td>GBLCHOICE</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">HIGH</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>High Alarm Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">HIHI</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Hihi Alarm Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">HLM</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User High Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">HLS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>At High Limit Switch </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">HLSV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>HW Lim. Violation Svr </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">HOMF</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Home Forward </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">HOMR</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Home Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">HOPR</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>High Operating Range </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">HSV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>High Severity </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Servo_fields">ICOF</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Integral Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">INIT</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Startup commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">JAR</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Jog Acceleration (EGU/s^2)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">JOGF</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Jog motor Forward </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>careful!</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">JOGR</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Jog motor Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>careful!</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">JVEL</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Jog Velocity</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">LDVL</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Dial Des Val </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">LLM</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User Low Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">LLS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>At Low Limit Switch </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">LLSV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Lolo Severity </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">LOLO</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Lolo Alarm Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">LOPR</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Low Operating Range </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">LOW</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Low Alarm Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">LRLV</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Rel Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">LRVL</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Raw Des Val </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">LSPG</a></td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>Last SPMG </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(See SPMG)</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_alarm">LSV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Low Severity </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">LVAL</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last User Des Val </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">LVIO</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Limit violation </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">MIP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motion In Progress </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">MISS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Ran out of retries </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">MMAP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Monitor Mask </td>
|
|
|
|
<td>ULONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">MOVN</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motor is moving </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>Don't confuse with DMOV</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">MRES</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Motor Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">MSTA</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motor Status </td>
|
|
|
|
<td>ULONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">NMAP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Monitor Mask </td>
|
|
|
|
<td>ULONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">OFF</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>User Offset (EGU) </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">OMSL</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Output Mode Select </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">OUT</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Output Specification </td>
|
|
|
|
<td>OUTLINK </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Servo_fields">PCOF</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Proportional Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">PERL</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Periodic Limits </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"No", 1:"Yes")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">PDIF</a></td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>Previous RDIF</td>
|
|
|
|
<td>LONG</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">POST</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Post-move commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_private">PP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Post process command </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">PREC</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Display Precision </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">PREM</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Pre-move commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RBV</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>User Readback Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RCNT</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Retry count </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">RDBD</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Retry Deadband (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">RDBL</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Readback Location </td>
|
|
|
|
<td>INLINK </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RDIF</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Difference rval-rrbv </td>
|
|
|
|
<td>LONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">REP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Encoder Position </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">RES</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Step Size (EGU) </td>
|
|
|
|
<td>DOUBLE</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">RHLS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw High Limit Switch </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">RINP</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>RMP Input Link</td>
|
|
|
|
<td>INLINK</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_limit">RLLS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Low Limit Switch </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">RLNK</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Readback OutLink </td>
|
|
|
|
<td>OUTLINK </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_drive">RLV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Relative Value</td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RMP</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Motor Position </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RRBV</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Readback Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">RRES</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Readback Step Size (EGU)</td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">RTRY</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Max retry count </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_drive">RVAL</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Raw Desired Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">RVEL</a></td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>Raw Velocity </td>
|
|
|
|
<td>LONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">S</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Speed (RPS)</td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">SBAK</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Speed (RPS) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">SBAS</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Base Speed (RPS) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">SET</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set/Use Switch </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Use", 1:"Set")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">SMAX</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Max Velocity (RPS)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">SPMG</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Stop/Pause/Move/Go </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Stop", 1:"Pause", 2:"Move", 3:"Go")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">SREV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Steps per Revolution </td>
|
|
|
|
<td>LONG </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">SSET</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set SET Mode </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_link">STOO</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>STOP OutLink</td>
|
|
|
|
<td>OUTLINK</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">STOP</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Stop </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">SUSE</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set USE Mode </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_status">TDIR</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Direction of Travel </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">TWF</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak motor Forward </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">TWR</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak motor Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_command">TWV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">UEIP</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Use Encoder If Present </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"No", 1:"Yes")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">UREV</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>EGU's per Revolution </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_res">URIP</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Use RDBL Link If Present</td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"No", 1:"Yes")</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_drive">VAL</a></td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User Desired Value</td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">VBAS</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Base Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">VELO</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_misc">VERS</a></td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Code Version </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>e.g., "1.95"</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_motion">VMAX</a></td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Max Velocity (EGU/s)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td><a href="#Fields_calib">VOF</a></td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Variable Offset </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td ALIGN=LEFT COLSPAN="5">
|
|
<table>
|
|
<tr>
|
|
<td COLSPAN="3">Note: In the <b>Access</b> column above: </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>R</td>
|
|
|
|
<td>Read only</td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>R/W</td>
|
|
|
|
<td>Read and write are allowed</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>R/W*</td>
|
|
|
|
<td>Read and write are allowed; write triggers record processing if the
|
|
record's SCAN field is set to "Passive."</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>N</td>
|
|
|
|
<td>No access allowed</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>Note: In the <b>Prompt </b>column above:</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>EGU</td>
|
|
|
|
<td>Engineering Units</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RPS</td>
|
|
|
|
<td>Revolutions Per Second</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=0 >
|
|
<caption><a NAME="Fields_calib"></a>
|
|
<h2>
|
|
Calibration-related fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DIR </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User Direction </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Pos", 1:"Neg") </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">User and dial values are related by the equation
|
|
<br><tt>userVAL = DialVAL * DIR + OFFset</tt>
|
|
<br>This field is the "DIR" in the above equation. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>OFF </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>User Offset (EGU) </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>User and dial coordinates can differ by a sign (the DIR field) and
|
|
an offset (OFF), according to the following equation:
|
|
<br><tt>userVAL = DialVAL * DIR + OFFset</tt>
|
|
<br>This field is "OFFset" in the above equation. It is not normally written
|
|
to directly by the user. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>FOFF </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Offset-Freeze Switch </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Variable", 1:"Frozen")</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>VOF </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Variable Offset </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>Set Offset switch (FOFF) to "Variable".</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>FOF </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Freeze Offset </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>Set Offset switch (FOFF) to "Frozen".</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">The user can cause the difference between user and dial
|
|
coordinates to remain fixed (i.e., the record will not change it, although
|
|
the user may) by setting FOFF to "Frozen." The fields VOF and FOF are intended
|
|
for use in backup/restore operations; any write to them will drive the
|
|
FOFF field to "Variable" (VOF) or "Frozen" (FOF). </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SET </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set/Use Switch </td>
|
|
|
|
<td>RECCHOICE</td>
|
|
|
|
<td>(0:"Use", 1:"Set")</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SSET </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set SET Mode </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>Set Set/Use switch to "Set".</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SUSE </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Set USE Mode </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>Set Set/Use switch to "Use".</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">SET is a toggle switch used in calibrating the motor's
|
|
user and dial positions:
|
|
<p>When SET = 0 ("Use"), writes to the user-coordinate drive field (VAL)
|
|
cause the dial-coordinate drive field (DVAL) to change, and the motor to
|
|
move. Writes to the dial-coordinate drive field (DVAL) cause the user-coordinate
|
|
drive field (VAL) to change, and the motor to move.
|
|
<p>When SET = 1 ("Set"), writes to the dial-coordinate drive field (DVAL)
|
|
and to the raw drive field (RVAL) cause a new raw motor position to be
|
|
loaded into the hardware without any change to the user-coordinate drive
|
|
field (VAL). Writes to other fields that would normally move the motor,
|
|
change the user-coordinate drive field (VAL), and the offset between user
|
|
and dial coordinates (the OFF field), with corresponding changes in the
|
|
user-coordinate limit fields (HLM and LLM). When the offset is frozen (FOFF=1),
|
|
writes to any drive field affect both user and dial values, and also load
|
|
the hardware position register.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_res"></a>
|
|
<h2>
|
|
Motor-resolution fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MRES </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Motor Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>May be positive or negative</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SREV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Steps per Revolution </td>
|
|
|
|
<td>LONG </td>
|
|
|
|
<td>Must be strictly positive</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>UREV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>EGU's per Revolution </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>May be positive or negative </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">MRES, and (SREV,UREV) represent two ways of specifying
|
|
the motor resolution--the distance or angle, in engineering units (EGU's),
|
|
associated with a single motor step. The equation relating these quantities
|
|
is "MRES = UREV/SREV". Initially, SREV has the value 200, the number of
|
|
full steps per revolution for most stepper motors, and the record never
|
|
changes this field. Only the user can change it.
|
|
<p>When MRES is changed, the motor record sets UREV = MRES*SREV. When UREV
|
|
or SREV is changed, the motor sets MRES = UREV/SREV. In all cases, the
|
|
effect of a motor resolution change on the reported motor position depends
|
|
in a simple way on the value of the SET field:
|
|
<br>If (SET = 1), new user and dial values (VAL, DVAL) are calculated from
|
|
the existing raw value (RVAL).
|
|
<br>If (SET = 0), a new raw value is calculated from the existing dial
|
|
value.
|
|
<br>The motor doesn't move in either case; neither does the actual motor
|
|
speed (in revolutions per second) change.
|
|
<p>If either MRES or UREV is changed, motor speeds that are expressed in
|
|
engineering units per second (i.e., those whose names contain the letter
|
|
'V': VELO, BVEL, VMAX and VBAS) are automatically adjusted by the motor
|
|
record according to the following equations: VELO = UREV * S; BVEL = UREV
|
|
* SBAK; VMAX = UREV * SMAX; VBAS = UREV * SBAS. Motor speeds that
|
|
are expressed in revolutions per second (S, SBAK, and SBAS) are independent
|
|
of changes to MRES or UREV. In contrast, when SREV is changed, only
|
|
MRES is adjusted by the motor record, thus allowing all other fields to
|
|
remain unaffected.
|
|
<p>Currently, changes to motor-resolution fields have no effect on the
|
|
values of limit fields (although they should).
|
|
<p>MRES or UREV allow negative values so that the user/dial coordinate
|
|
systems can be configured to the opposite polarity of the motor controller's.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>ERES </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Encoder Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Encoder resolution: the distance or angle, in engineering units, associated
|
|
with a single encoder step. ERES may be positive or negative; it must have
|
|
the same sign as MRES; and it must be nonzero. If the user sets ERES
|
|
to zero, the record will overwrite it with MRES. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RRES </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Readback Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Readback-device resolution: the distance or angle, in engineering units,
|
|
associated with a unit change of the number retrieved via the readback-
|
|
location input link (RDBL). RRES may be either positive or negative. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RES </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The motor or encoder resolution, in engineering units, as selected
|
|
by the presence of an encoder supported by the hardware and by the switch
|
|
UEIP ("Use Encoder If Present"). If an encoder is present, and UEIP=1,
|
|
then RES will be set equal to ERES, otherwise RES will be set equal to
|
|
MRES. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>UEIP </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Use Encoder If Present </td>
|
|
|
|
<td>RECCHOICE (0:"No", 1:"Yes") </td>
|
|
|
|
<td>Switch: nonzero value tells the record to read the encoder (if the
|
|
hardware indicates an encoder is present) and to ignore the value read
|
|
back from the hardware's step-count register.
|
|
<p>The state of the UEIP, together with the MSTA encoder indicator, determine:
|
|
<ol>
|
|
<li>
|
|
if the RRBV is set to either the feedback (REP) or the command (RMP) position.</li>
|
|
|
|
<li>
|
|
if the RES is set to either the feedback (ERES) or the command (MRES) resolution.</li>
|
|
|
|
<li>
|
|
whether absolute or relative position commands are used.</li>
|
|
</ol>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>URIP </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Use RDBL Link If Present </td>
|
|
|
|
<td>RECCHOICE (0:"No", 1:"Yes") </td>
|
|
|
|
<td>Switch: nonzero value tells the record to get the motor position from
|
|
the readback-location link (RDBL) (if it contains valid EPICS link information,
|
|
and if no error occurs in the attempt to read from the link) and to ignore
|
|
values read back from the hardware's step-count and encoder registers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">These switches also direct the record to calculate destinations
|
|
in relative, rather than absolute, terms, since the ratio of encoder and
|
|
readback units to motor steps may not actually be constant.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 NOSAVE >
|
|
<caption><a NAME="Fields_motion"></a>
|
|
<h2>
|
|
Motion-related fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>VMAX</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Max Velocity (EGU/s)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0 <= VMAX. VMAX=0 disables maximum velocity range
|
|
checking.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>SMAX</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Max Velocity (RPS)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0 <= SMAX</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>VBAS</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Base Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0 <= VBAS</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>SBAS</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Base Speed (RPS) </td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0 <= SBAS</td>
|
|
</tr>
|
|
|
|
<tr NOSAVE>
|
|
<td COLSPAN="5" NOSAVE>Range checking is done in such a way that any minimum
|
|
(i.e., VBAS/SBAS) or maximum (i.e., VMAX/SMAX) value entered is valid.
|
|
For example, if the minimum is entered and it exceeds the maximum, then
|
|
the maximum is set to the new minimum value. A VMAX value of zero
|
|
disables maximum velocity range checking.
|
|
<p>At boot-up, if one field of a field pair (i.e., VMAX/SMAX, VBAS/SBAS,
|
|
VELO/S, BVEL/SBAK) is zero and the other field is nonzero, the nonzero
|
|
field takes precedence. If both fields of a given field pair are
|
|
nonzero, the RPS member of the field pair (i.e., SMAX, SBAS, S, SBAK) takes
|
|
precedence.
|
|
<p>Slew (VELO/S) and backup (BVEL/SBAK) velocity fields are silently forced
|
|
by the motor record to be within the range set by VMAX/SMAX and VBAS/SBAS,
|
|
inclusively.
|
|
<p>Those who use both BURT and VMAX (i.e., nonzero VMAX) should insure
|
|
that VMAX and VBAS are placed before VELO and BVEL in their BURT request
|
|
files.
|
|
<p>The intent of VBAS/SBAS is to prevent the motor from moving at speeds
|
|
slow enough to excite its resonance, which can cause the motor to miss
|
|
steps. The motor is expected to accelerate from a stand-still to VBAS in
|
|
one motor pulse. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>VELO </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; VBAS <= VELO <= VMAX</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>S </td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Speed (RPS) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Valid range; SBAS <= S
|
|
<= SMAX</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">VELO is the speed, in engineering units per second, at
|
|
which the motor is move after the acceleration phase of a motion is finished.
|
|
S is the same speed expressed in revolutions per second. The record makes
|
|
sure that VELO and S are consistent, using the equation S = VELO/UREV.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>ACCL </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Seconds to Velocity </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The length, in seconds, of the acceleration and deceleration phases
|
|
of a motor motion. </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">The motor record expects the hardware to produce a trapezoidal
|
|
speed profile. That is, the motor speed is expected to increase linearly
|
|
with time from the base speed, VBAS, to the full speed, VELO, in ACCL seconds.
|
|
At the end of a motion, the speed is expected to decrease similarly to
|
|
VBAS. </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>JVEL</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Jog Velocity (EGU/s)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; VBAS <= VELO <= VMAX</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>JAR</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Jog Acceleraton (EGU/s^2)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Default value: VELO / ACCL</td>
|
|
</tr>
|
|
|
|
<tr NOSAVE>
|
|
<td COLSPAN="5" NOSAVE>With the OMS and IMS device drivers, jog velocity
|
|
can be changed on-the-fly. The velocity will accelerate to the new
|
|
velocity based on the JAR field.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>BDST </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Distance (EGU) </td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>The signed distance, in dial coordinates, used for backlash takeout. </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">The algorithm used in moves to a (dial-coordinate) position
|
|
called "TARGET" follows:
|
|
<p>1) If the motor is to move a distance greater than the magnitude of
|
|
BDST, or if the motor is to move in a direction opposite to the sign of
|
|
BDST, then the motor will move first to position (TARGET-BDST), at an acceleration
|
|
specified by ACCL and speed VELO, and then to position TARGET, at an acceleration
|
|
specified by BACC and speed BVEL.
|
|
<p>2) If the motor is to move a distance smaller than the magnitude of
|
|
BDST, and if the motor is to move in the same direction as the sign of
|
|
BDST, then backlash is assumed already to have been taken out, and the
|
|
motor will move to position TARGET at an acceleration specified by BACC
|
|
and speed BVEL. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>BVEL </td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>BL Velocity (EGU/s) </td>
|
|
|
|
<td>FLOAT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SBAK </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Speed (RPS) </td>
|
|
|
|
<td>FLOAT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">BVEL is the speed, in engineering units per second, at
|
|
which the motor is move after the acceleration phase of a backlash-takeout
|
|
motion is finished. SBAK is the same speed expressed in revolutions per
|
|
second. Neither BVEL nor SBAK may be negative or zero. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>BACC </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>BL Seconds to Veloc. </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The length, in seconds, of the acceleration and deceleration phases
|
|
of a backlash-takeout motion. See discussion of the acceleration field
|
|
ACCL for more specific information. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>FRAC</td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Move Fraction </td>
|
|
|
|
<td>FLOAT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">This field supports closed-loop control of pathological
|
|
devices for which drive values are not expected to compare reproducibly
|
|
with readback values. (Inchworms and other friction-driven devices are
|
|
good examples: the number of steps taken by an inchworm motor is a very
|
|
poor indicator of the distance it has traveled.)
|
|
<p>In a move from position CURRENT to position TARGET, the motor record
|
|
will ask hardware to move a distance FRAC*(TARGET-CURRENT). When that motion
|
|
is complete, the record will request a motion of FRAC*(remaining distance),
|
|
and so on until the target position has been reached. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RDBD </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Retry Deadband (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>When the motor has finished a complete motion, possibly including backlash
|
|
takeout, the motor record will compare its current position with the desired
|
|
position. If the magnitude of the difference is greater than RDBD, the
|
|
motor will try again, as if the user had requested a move from the now
|
|
current position to the desired position. Only a limited number of retries
|
|
will be performed (see RTRY). </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RTRY </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Max retry count </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The maximum number of times the motor record will try again to move
|
|
to the desired position. When the retry limit is reached, the motor record
|
|
will declare the motion finished. If the desired position was not reached,
|
|
the field MISS will be set to 1.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 NOSAVE >
|
|
<caption><a NAME="Fields_link"></a>
|
|
<h2>
|
|
Link-related fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>OUT </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Output Specification </td>
|
|
|
|
<td>OUTLINK </td>
|
|
|
|
<td>If Soft Channel device support is specified, this field is an EPICS
|
|
link; each time DVAL is changed, device support puts DVAL to this link.
|
|
Otherwise, this field specifies the hardware to be controlled.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RDBL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Readback Location </td>
|
|
|
|
<td>INLINK </td>
|
|
|
|
<td>This field specifies the field (of this or any other EPICS record)
|
|
from which the motor's current position is to be read when the field URIP
|
|
(Use Readback If Present) has the value "Yes" (1). If this field does not
|
|
contain a valid EPICS link, the URIP may as well have the value "No" (0).
|
|
If Soft Channel device support is specified, this field is monitored for
|
|
value changes by a CA event task. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DOL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Desired Output Loc </td>
|
|
|
|
<td>INLINK </td>
|
|
|
|
<td>If this field contains a valid EPICS link, and the OMSL field has the
|
|
value "closed_loop" (1), then every time the the motor record is processed,
|
|
it will get a value for the VAL field from the link and move to that location,
|
|
ignoring all other drive fields. Closed-loop mode has not been tested extensively. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>OMSL </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Output Mode Select </td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
|
|
<td>(0:"supervisory", 1:"closed_loop")
|
|
<br>If this field has the value "closed_loop" (1), and the field DOL contains
|
|
a valid EPICS link, then every time the the motor record is processed,
|
|
it will get a value for the VAL field from the link and move to that location,
|
|
ignoring all other drive fields. Closed-loop mode has not been tested extensively. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RLNK </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Readback OutLink </td>
|
|
|
|
<td>OUTLINK </td>
|
|
|
|
<td>If this field contains a valid EPICS link, then every time the motor
|
|
record is processed, it will put the (engineering-unit) readback value
|
|
RBV to that link. </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>DINP</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>DMOV Input Link</td>
|
|
|
|
<td>INLINK</td>
|
|
|
|
<td>If Soft Channel device support is specified, the value specified by
|
|
this link is used to set the DONE bit in the MSTA field; which in turn
|
|
sets the DMOV field.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>RINP</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>RMP Input Link</td>
|
|
|
|
<td>INLINK</td>
|
|
|
|
<td>If Soft Channel device support is specified, the value specified by
|
|
this link is used to set the RMP field.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>STOO</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>STOP OutLink</td>
|
|
|
|
<td>OUTLINK</td>
|
|
|
|
<td>If Soft Channel device support is specified, a one is written to the
|
|
specified link each time the STOP_AXIS motor command is issued.</td>
|
|
</tr>
|
|
|
|
<tr NOSAVE>
|
|
<td COLSPAN="5" NOSAVE>
|
|
<h4>
|
|
Soft Channel Device Driver</h4>
|
|
The Soft Channel database links (i.e., DINP, RINP and STOO) are only processed
|
|
when the Soft Channel device driver is selected. These links are
|
|
ignored when using any other Motor Record device driver.
|
|
<br>The input links (i.e., DINP, RDBL and RINP) are monitored for value
|
|
changes by a CA event task. Users must choose either a dial input
|
|
link (RDBL) or a raw input link (RINP), but not both. At this time, the
|
|
above links are <b>not</b> dynamically retargetable.
|
|
<br>Note that JOG[F/R] does not work with the Soft Channel device driver.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_limit"></a>
|
|
<h2>
|
|
Limit-related fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access</th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments</th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HLM </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User High Limit</td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The maximum allowed value of the VAL field. If HLM changes so that
|
|
VAL is no longer less than HLM, then the record will set the field LVIO
|
|
to 1. If the DIR field has the value "Pos", then HLM will always be consistent
|
|
with DHLM, otherwise HLM will always be consistent with DLLM.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LLM </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>User Low Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The minimum allowed value of the VAL field. If LLM changes so that
|
|
VAL is no longer greater than LLM, then the record will set the field LVIO
|
|
to 1. If the DIR field has the value "Pos", then LLM will always be consistent
|
|
with DLLM, otherwise LLM will always be consistent with DHLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DHLM </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial High Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The maximum allowed value of the DVAL field. If DHLM changes so that
|
|
DVAL is no longer less than DHLM, then the record will set the field LVIO
|
|
to 1.. If the DIR field has the value "Pos", then DHLM will always be consistent
|
|
with HLM, otherwise DHLM will always be consistent with LLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DLLM </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial Low Limit </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>The minimum allowed value of the DVAL field. If DLLM changes so that
|
|
DVAL is no longer greater than DLLM, then the record will set the field
|
|
LVIO to 1. If the DIR field has the value "Pos", then DLLM will always
|
|
be consistent with LLM, otherwise DLLM will always be consistent with HLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LVIO </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Limit violation </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>A value of 1 indicates that the dial-value drive field, DVAL, or the
|
|
dial-value readback field, DRBV, is outside of the limits (DHLM, DLLM),
|
|
and this prevents the motor from moving. If the backlash distance, BDST,
|
|
is non-zero, it further restricts the allowable range of DVAL. When a JOG
|
|
button is hit, LVIO goes to 1 and stops the motor if/when DVAL gets to
|
|
within one second's travel time of either limit. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>PERL </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Periodic Limits </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"No", 1:"Yes")
|
|
<br>Not implemented. Originally intended to support periodic "limits" on
|
|
the VAL field (such as those associated with a rotation stage--e.g., [0...360]
|
|
or [-180...180]) independently of the actual soft limits HLM and LLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HOPR </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>High Operating Range </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Not used. See HLM and DHLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LOPR </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Low Operating Range </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Not used. See LLM and DLLM. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HLS </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>At High Limit Switch </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RHLS </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw High Limit Switch</td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">If either of these fields is nonzero, then the motor is
|
|
at the positive-limit switch, where the positive sense is that of the user-coordinate
|
|
system for HLS, and that of the raw (step-number) coordinate system for
|
|
RHLS. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LLS </td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>At Low Limit Switch</td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RLLS </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Low Limit Switch</td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">If either of these fields is nonzero, then the motor is
|
|
at the negative-limit switch, where the positive sense is that of the user-coordinate
|
|
system for LLS, and that of the raw (step-number) coordinate system for
|
|
RLLS.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_command"></a>
|
|
<h2>
|
|
Command-button fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt</th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>SPMG </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Stop/Pause/Move/Go </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Stop", 1:"Pause", 2:"Move", 3:"Go") </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">This field is intended primarily for interactive use, and
|
|
normally has the value "Go."
|
|
<p>If the user sets this field to "Stop," the motor will decelerate to
|
|
a stop, the VAL field will be set equal to the RBV field, and the DVAL
|
|
field will be set equal to the DRBV field. (These actions ensure that the
|
|
motor will not start moving again until a drive field is changed.) In any
|
|
case, the motor will not move while SPMG has the value "Stop" or "Pause."
|
|
<p>If "SPMG" has the value "Move," the motor record will reset SPMG to
|
|
"Pause" when a motion completes. This behavior supports users who want
|
|
a motor to sit still until they say "Move", no matter what changes occur
|
|
in the drive fields. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>STOP </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Stop </td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">When this field is set to 1, the record will immediately
|
|
reset it to 0, and the motor will decelerate to a stop. When the motor
|
|
has stopped, VAL will be set equal to RBV, and DVAL will be set equal to
|
|
DRBV. (This ensures that the motor will not start moving the next time
|
|
the record is processed, unless a drive field is explicitly changed. If
|
|
you want the motor to pause, use the SPMG field.) </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HOMF </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Home Forward </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HOMR </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Home Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">When one of these fields is set to 1, the motor will decelerate
|
|
to a stop if already moving, move in the indicated direction (in <i>dial</i>
|
|
coordinates) at the acceleration specified by ACCL and a speed of 1000
|
|
motor pulses per second, until the hardware detects the "home" switch has
|
|
become active. Then the hardware will do something hardware dependent in
|
|
response to its "home" command, if any. (The OMS hardware causes the motor
|
|
to decelerate to a stop.) When the motor stops, the VAL field will be set
|
|
equal to the RBV field, and the DVAL field will be set equal to the DRBV
|
|
field. These fields can be set to 1, but setting either field to
|
|
0 results in an error. The record sets HOM[F/R] to zero when the
|
|
homing procedure is either completed or aborted.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>JOGF </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Jog motor Forward </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>JOGR </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Jog motor Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">When one of these fields is set to 1, the motor will decelerate
|
|
to a stop if already moving, and move in the indicated direction (in user
|
|
coordinates) at an acceleration specified by ACCL and speed VELO, until
|
|
the field goes to 0. Then the motor will set VAL to RBV and DVAL to DRBV,
|
|
decelerate to a stop, and execute a (backlash-corrected, if BDST is nonzero)
|
|
move to the position at which the field went to 0.
|
|
<p>These fields are dangerous when used over channel access, because the
|
|
motor does not stop moving until a second message is received. If a very
|
|
busy network should cause that second message to be lost, the motor will
|
|
travel to its limit switch or hard stop. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>TWF </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak motor Forward </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>TWR </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak motor Reverse </td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">When one of these fields is set to 1, the record will immediately
|
|
reset it to 0, and the motor will move (with backlash takeout if BDST is
|
|
nonzero) by a distance TWV (in user coordinates) at the acceleration specified
|
|
by ACCL and at speed VELO.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>TWV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Tweak Step Size (EGU) </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>This field contains the distance the motor is to move in response to
|
|
the TWF and TWR buttons. </td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_drive"></a>
|
|
<h2>
|
|
Drive fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments</th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>VAL </td>
|
|
|
|
<td>R/W*</td>
|
|
|
|
<td>User Desired Value </td>
|
|
|
|
<td>DOUBLE</td>
|
|
|
|
<td>This is the desired position in user coordinates. When this field is
|
|
written to, DVAL and RVAL will be changed correspondingly, and the motor
|
|
will move (with backlash takeout if BDST is nonzero) to the newly written
|
|
position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DVAL </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Dial Desired Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>This is the desired position in dial coordinates. When this field is
|
|
written to, VAL and RVAL will be changed correspondingly, and the motor
|
|
will move (with backlash takeout if BDST is nonzero) to the newly written
|
|
position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RVAL </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Raw Desired Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>This is the desired position in raw coordinates. When this field is
|
|
written to, VAL and DVAL will be changed correspondingly, and the motor
|
|
will move (with backlash takeout if BDST is nonzero) to the newly written
|
|
position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RLV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Relative Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>When this field is changed, its value will be added to VAL, the field
|
|
itself will immediately be reset to 0, and the motor record will behave
|
|
as though the VAL field had been changed directly. </td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_status"></a>
|
|
<h2>
|
|
Status/readback fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RBV </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>User Readback Value </td>
|
|
|
|
<td>DOUBLE</td>
|
|
|
|
<td>The current motor position, in user coordinates, from the motor hardware
|
|
(default), or from the encoder supported by the motor-controller hardware
|
|
(if UEIP is nonzero), or from the readback link RDBL (if URIP is nonzero). </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DRBV </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Dial Readback Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>The current motor position, in dial coordinates, from the motor hardware
|
|
(default), or from the encoder supported by the motor-controller hardware
|
|
(if UEIP is nonzero), or from the readback link RDBL (if URIP is nonzero). </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DMOV </td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>Done moving to value </td>
|
|
|
|
<td>SHORT </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="5">This field is set to 0 when the motor record begins a motion,
|
|
and remains 0 through any retries and backlash corrections that may be
|
|
required until the motor record has completely finished that motion, whereupon
|
|
the field is set to 1. DMOV is guaranteed to execute and post a 1/0/1 pulse
|
|
when the motor is commanded to move--even if no motion actually occurs
|
|
because the motor was commanded to move to its current position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MOVN </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motor is moving </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>This field is set to 1 while the record believes that the motor actually
|
|
is moving. This field is not the inverse of DMOV, since it may go to zero
|
|
during a complex motion, if that motion includes a momentary stop. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DLY</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Readback settle time (s)</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Delay (in seconds) the time between motor controller done and motor
|
|
record done (i.e., DMOV).</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>DIFF </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Difference dval-drbv </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td ROWSPAN="2">DIFF is the difference, in engineering units, between the
|
|
desired motor position, and the readback device's report of the current
|
|
position. RDIF is the same difference in "raw" units (normally, steps). </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RDIF </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Difference rval-rrbv </td>
|
|
|
|
<td>LONG </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RRBV </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Readback Value </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>The current position of the motor, encoder, or readback link, as received
|
|
from whatever source has been selected to provide position information.
|
|
The units associated with this field depend on the source. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RMP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Motor Position </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>The contents of the hardware's step-count register. This field contains
|
|
the same information as the dial value, but in steps, rather than in engineering
|
|
units. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>REP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Encoder Position </td>
|
|
|
|
<td>DOUBLE </td>
|
|
|
|
<td>The contents of the hardware's encoder-count register. Ideally, this
|
|
field contains the same information as the dial value, but in encoder counts,
|
|
rather than in engineering units. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MSTA </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motor Status </td>
|
|
|
|
<td>ULONG </td>
|
|
|
|
<td>The motor status as received from the hardware. The MSTA bits
|
|
are defined as follows:
|
|
<blockquote>
|
|
<ol>
|
|
<li>
|
|
DIRECTION: (0:Negative, 1:Positive)</li>
|
|
|
|
<li>
|
|
DONE: motion is complete.</li>
|
|
|
|
<li>
|
|
OVERTRAVEL: a limit switch has been hit.</li>
|
|
|
|
<li>
|
|
HOMELS: state of the home limit switch.</li>
|
|
|
|
<li>
|
|
Unused</li>
|
|
|
|
<li>
|
|
POSITION: closed-loop position control is enabled.</li>
|
|
|
|
<li>
|
|
Unused</li>
|
|
|
|
<li>
|
|
HOME: if at home position.</li>
|
|
|
|
<li>
|
|
PRESENT: encoder is present.</li>
|
|
|
|
<li>
|
|
PROBLEM: driver stopped polling.</li>
|
|
|
|
<li>
|
|
MOVING: non-zero velocity present.</li>
|
|
|
|
<li>
|
|
GAIN_SUPPORT: motor supports closed-loop position control.</li>
|
|
</ol>
|
|
</blockquote>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>TDIR </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Direction of Travel </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The direction in which the motor is currently traveling (or was most
|
|
recently traveling), as received from the hardware. If 0, the raw readback
|
|
value should be decreasing. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>ATHM </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>At HOME </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The state of the hardware's "home" switch. If 1, the motor has hit
|
|
the switch. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RCNT </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Retry count </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The number of times the motor record has detected failure of the motor
|
|
to land within the retry-deadband distance of the desired position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MISS </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Ran out of retries </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>If 1, the motor has failed to land on the desired position more than
|
|
the allowed number of times. This field will be reset the next time the
|
|
motor succeeds in reaching the desired position. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>RVEL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Raw Velocity </td>
|
|
|
|
<td>LONG </td>
|
|
|
|
<td>Speed in steps per second that the motor actually is moving. </td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<center><a NAME="Servo_fields"></a></center>
|
|
|
|
<center>
|
|
<h2>
|
|
Servo fields</h2></center>
|
|
|
|
<table BORDER CELLPADDING=5 NOSAVE >
|
|
<caption> </caption>
|
|
|
|
<tr NOSAVE>
|
|
<td COLSPAN="5" NOSAVE>PID related record fields accept only normalized
|
|
values (i.e., 0.0 <= value <= 1.0). Before sending them to
|
|
the motor controller, device support scales the record fields to valid
|
|
motor controller parameters,. Let the motor controller PID parameters
|
|
be represented by CKP, CKI and CKD; then the PID coefficients are converted
|
|
from motor record fields to controller parameters as follows:
|
|
<p>For the MM4000; CKP = PCOF, CKI = ICOF and CKD = DCOF.
|
|
<br>For all OMS controllers; CKP = 1999.9 * PCOF, CKI = 1999.9 *
|
|
ICOF, CKD = 1999.9 * DCOF.
|
|
<p>Note the following:
|
|
<ul>
|
|
<li>
|
|
When commanded to move the OMS control law is a PD loop, when it is holding
|
|
a position it is a PID loop.</li>
|
|
|
|
<li>
|
|
The Proportional Gain cannot be turned off (i.e., set to zero) in an OMS
|
|
controller. The minimum value is PCOF = 0.00005 (CKP = 0.1).
|
|
If the user sets PCOF < 0.00005 for an OMS controller, device support
|
|
silently resets it to it's minimum value of 0.00005.</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>
|
|
<center><b>Name</b></center>
|
|
</td>
|
|
|
|
<td>
|
|
<center><b>Access</b></center>
|
|
</td>
|
|
|
|
<td>
|
|
<center><b>Prompt</b></center>
|
|
</td>
|
|
|
|
<td>
|
|
<center><b>Data type</b></center>
|
|
</td>
|
|
|
|
<td>
|
|
<center><b>Comments</b></center>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>CNEN</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Enable control</td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(0:"Disable", 1:"Enable") Enable/Disable closed-loop position
|
|
control. This field is active only if the GAIN_SUPPORT bit in the
|
|
MSTA is true. This field is set by both the user and device support.
|
|
CNEN is set to <i>Disable</i> by device support when it detects a motion
|
|
controller error; e.g. maximum following error exceeded.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>PCOF</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Proportional Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0.0 <= PCOF <= 1.0</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td> ICOF</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Integral Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0.0 <= ICOF <= 1.0</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td> DCOF</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Derivative Gain</td>
|
|
|
|
<td>FLOAT</td>
|
|
|
|
<td>Valid range; 0.0 <= DCOF <= 1.0</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<br>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption>
|
|
<center><a NAME="Fields_alarm"></a></center>
|
|
|
|
<center>
|
|
<h2>
|
|
Alarm fields</h2></center>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type</th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HIHI </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Hihi Alarm Limit </td>
|
|
|
|
<td>FLOAT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LOLO </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Lolo Alarm Limit </td>
|
|
|
|
<td>FLOAT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HIGH </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>High Alarm Limit </td>
|
|
|
|
<td>FLOAT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LOW </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Low Alarm Limit </td>
|
|
|
|
<td>FLOAT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HHSV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Hihi Severity </td>
|
|
|
|
<td>GBLCHOICE</td>
|
|
|
|
<td>Not used.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LLSV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Lolo Severity </td>
|
|
|
|
<td>GBLCHOICE</td>
|
|
|
|
<td>Not used.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HSV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>High Severity </td>
|
|
|
|
<td>GBLCHOICE</td>
|
|
|
|
<td>Not used.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LSV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>Low Severity </td>
|
|
|
|
<td>GBLCHOICE</td>
|
|
|
|
<td>Not used.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>HLSV </td>
|
|
|
|
<td>R/W* </td>
|
|
|
|
<td>HW Limit Switch Violation Severity</td>
|
|
|
|
<td>GBLCHOICE </td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 NOSAVE >
|
|
<caption><a NAME="Fields_misc"></a>
|
|
<h2>
|
|
Miscellaneous fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>PREC </td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Display Precision </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>The number of digits to the right of the decimal that are to be displayed
|
|
by MEDM and other channel-access clients. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>EGU </td>
|
|
|
|
<td>R/W </td>
|
|
|
|
<td>Engineering Units </td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td>String sent to channel-access clients who ask for engineering units. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>VERS </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Code Version </td>
|
|
|
|
<td>FLOAT </td>
|
|
|
|
<td>Version number of the recMotor.c code. </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>CARD </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Card Number </td>
|
|
|
|
<td>SHORT </td>
|
|
|
|
<td>For VME based devices (i.e., OMS VME8/44, OMS VME58 and V544) this
|
|
is the VME card number, derived from the output link. Cards are numbered
|
|
from zero according to their VME addresses. Oregon Micro Systems
|
|
series VME8 and VME44 cards occur in the same series, since they are handled
|
|
by the same driver. Oregon Micro Systems VME58 cards are numbered
|
|
separately, as are Highland Technology V540 cards. This field is
|
|
set to -1 for non-VME based device/drivers.</td>
|
|
</tr>
|
|
|
|
<tr NOSAVE>
|
|
<td COLSPAN="5" NOSAVE>
|
|
<h4>
|
|
Command Primitives</h4>
|
|
The following three fields comprise the Command Primitives feature.
|
|
The command primitive record fields are available to the user to send ASCII
|
|
command primitives to the motor control board at fixed, predefined, times.
|
|
Each of the fields is defined as a character string. Consult the
|
|
motor controller manual for command protocols. No error checking
|
|
is done by the motor record or the device driver to insure that the command
|
|
strings are valid. Each field is <i>terminated</i> by the device
|
|
driver according to the command protocol. Command primitives that
|
|
result in a response from the motion control board are valid, but the response
|
|
is not processed. This feature is currently only available with OMS
|
|
VME8/44/58 or Newport MM4000 device support.
|
|
<p><b>Device Directives</b>
|
|
<ul>
|
|
<li>
|
|
Valid only in the INIT field.</li>
|
|
|
|
<li>
|
|
Must be identified by the following;</li>
|
|
|
|
<blockquote>
|
|
<li>
|
|
First character of INIT string must be a '@'.</li>
|
|
|
|
<li>
|
|
One or more characters followed by a terminating '@'; i.e., device directives
|
|
must have nonzero length.</li>
|
|
|
|
<li>
|
|
A valid device directive; currently, only "DPM_ON".</li>
|
|
</blockquote>
|
|
|
|
<li>
|
|
INIT strings are stripped of valid device directives (including @'s) and
|
|
tested for nonzero length before being sent to the controller. For
|
|
example, given the INIT string, "@DPM_ON@HE", the device directive @DPM_ON@
|
|
is stripped out before HE is sent to the controller.</li>
|
|
</ul>
|
|
<b>Driver Power Monitoring</b>
|
|
<ul>
|
|
<li>
|
|
This feature is only available with the OMS VME58 device support.</li>
|
|
|
|
<li>
|
|
The 8 User I/O signals are assigned to the 8 possible VME58 axes as follows:</li>
|
|
|
|
<ul><tt><font size=+1>User I/O #0 <> X axis</font></tt>
|
|
<br><tt><font size=+1> " " 1 <> Y
|
|
"</font></tt>
|
|
<br><tt><font size=+1>........................................</font></tt>
|
|
<br><tt><font size=+1>" " 7 <> S
|
|
"</font></tt></ul>
|
|
|
|
<li>
|
|
Drive-power monitoring defaults to disabled at boot-up. Request enabling
|
|
drive-power monitoring by entering the device directive "@DPM_ON@" command
|
|
into the motor record initialization field (i.e., INIT). The INIT
|
|
field is processed at record initialization (i.e., bootup), hence if there
|
|
are no errors, drive-power monitoring will be enabled after the next bootup.</li>
|
|
|
|
<li>
|
|
Whenever a request is made to enable drive-power status monitoring, an
|
|
error check is made (using the VME58 "RB" command) to verify that the User
|
|
I/O has been configured as an input. The following message will appear
|
|
in the error log if a configuration error is detected; "Invalid VME58 configuration;
|
|
RB = 0x####", where "####" is the VME58's response to the RB command.</li>
|
|
|
|
<li>
|
|
When drive-power status monitoring is enabled and a power failure is detected,
|
|
the device driver will respond by activating the the RA_OVERTRAVEL bit
|
|
in the MSTA. This results in either HLS or LLS being activated depending
|
|
on the DIR field. In addition, the following message will appear in the
|
|
error log; "Drive power failure at VME58 card#?? motor#??".</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>INIT</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Startup commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td>Sent at record initialization.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>PREM</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Pre-move commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td>Sent before every command string that causes motion.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>POST</td>
|
|
|
|
<td>R/W</td>
|
|
|
|
<td>Post-move commands</td>
|
|
|
|
<td>STRING</td>
|
|
|
|
<td>Sent after a complete motion is finished or when an overtravel limit
|
|
switch is detected.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<table BORDER CELLPADDING=5 >
|
|
<caption><a NAME="Fields_private"></a>
|
|
<h2>
|
|
Private fields</h2>
|
|
</caption>
|
|
|
|
<tr VALIGN=TOP>
|
|
<th>Name </th>
|
|
|
|
<th>Access </th>
|
|
|
|
<th>Prompt </th>
|
|
|
|
<th>Data type </th>
|
|
|
|
<th>Comments </th>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>CBAK</td>
|
|
|
|
<td>None</td>
|
|
|
|
<td>Callback structure</td>
|
|
|
|
<td>NOACCESS </td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LVAL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last User Des Val </td>
|
|
|
|
<td>DOUBLE</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LDVL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Dial Des Val </td>
|
|
|
|
<td>DOUBLE</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LRVL </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Raw Des Val </td>
|
|
|
|
<td>DOUBLE</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LRLV </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last Rel Value </td>
|
|
|
|
<td>DOUBLE</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>PDIF</td>
|
|
|
|
<td>R</td>
|
|
|
|
<td>Previous RDIF</td>
|
|
|
|
<td>LONG</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>PP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Post process command </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MIP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Motion In Progress </td>
|
|
|
|
<td>SHORT</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>MMAP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Monitor Mask </td>
|
|
|
|
<td>ULONG</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>NMAP </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Monitor Mask </td>
|
|
|
|
<td>ULONG</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>LSPG </td>
|
|
|
|
<td>R </td>
|
|
|
|
<td>Last SPMG </td>
|
|
|
|
<td>RECCHOICE </td>
|
|
|
|
<td>(see SPMG)</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<p><a NAME="Files"></a>
|
|
<h2>
|
|
Files, device support</h2>
|
|
The following table briefly describes all of the files required to implement
|
|
and use the motor record. The reader is assumed to be familiar with the
|
|
<a href="http://www.aps.anl.gov/asd/controls/epics/EpicsDocumentation/WWWPages/EpicsDocs/AppDevManuals/AppSrcRelControl/AppSRControl.html">EPICS
|
|
Application Source/Release Control document</a> which describes how to
|
|
build an EPICS application tree into which these files are to be placed,
|
|
and how to run "makesdr" and "gnumake" to build the record support. These
|
|
files can all be obtained from the <a href="http://www.aps.anl.gov/xfd/WWW/xfd/SoftDist/Welcome.html">EPICS
|
|
Software Distribution</a> (in the <a href="http://www.aps.anl.gov/xfd/WWW/xfd/SoftDist/Welcome.html#Custom_EPICS">custom-software
|
|
section</a>).
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<th COLSPAN="2">SOURCE CODE
|
|
<br>files to be placed in <tt>&lttop>/&ltapp&gtApp/src/</tt></th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorRecord.dbd</td>
|
|
|
|
<td>Database Definition file for motor record.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motorRecord.c </td>
|
|
|
|
<td>Record support for the motor record</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motor.h </td>
|
|
|
|
<td>Header included by all .c files</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motordevCom.c</td>
|
|
|
|
<td>Device support common to all motor Record device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motordevCom.h</td>
|
|
|
|
<td>Device support header file.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motordrvCom.c</td>
|
|
|
|
<td>Driver support common to all motor Record device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motordrvCom.h</td>
|
|
|
|
<td>Driver support header file.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>motordrvComCode.h</td>
|
|
|
|
<td>Local variables common to all motor Record drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td>NOTE: All of the above files are required for any and all motor Record
|
|
device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devOmsCom.c</td>
|
|
|
|
<td>Device support common to all Oregon Micro Systems device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devOmsCom.h </td>
|
|
|
|
<td>Device support header file common to all Oregon Micro Systems device
|
|
drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvOmsCom.h</td>
|
|
|
|
<td>Driver support header file common to all Oregon Micro Systems device
|
|
drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td>NOTE: The above files are required for any and all Oregon Micro Systems
|
|
device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>devOms.c </td>
|
|
|
|
<td>Device support for Oregon Micro Systems VME8 and VME44 series boards</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvOms.c</td>
|
|
|
|
<td>Driver for Oregon Micro Systems VME8 and VME44 series boards</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvOms.h </td>
|
|
|
|
<td>Header included by devOms.c and drvOms.c</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>devOms58.c </td>
|
|
|
|
<td>Device support for Oregon Micro Systems VME58 series boards</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvOms58.c </td>
|
|
|
|
<td>Driver for Oregon Micro Systems VME58 series boards</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvOms58.h </td>
|
|
|
|
<td>Header included by devOms58.c and drvOms58.c</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>devV544.c </td>
|
|
|
|
<td>Device support for Highland Technology boards.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvV544.c</td>
|
|
|
|
<td>Driver for Highland Technology boards.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvV544.h </td>
|
|
|
|
<td>Header included by devV544.c and drvV544.c</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvMMCom.h</td>
|
|
|
|
<td>Common header included by all Newport Motion Master device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td>NOTE: The above files are required for any and all Newport Motion Master
|
|
device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devMM3000.c</td>
|
|
|
|
<td>Device support for Newport MM3000.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvMM3000.c</td>
|
|
|
|
<td>Driver for Newport MM3000.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devMM4000.c</td>
|
|
|
|
<td>Device support for Newport MM4000.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvMM4000.c</td>
|
|
|
|
<td>Driver for Newport MM4000.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devPM500.c</td>
|
|
|
|
<td>Device support for Newport PM500.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvPM500.c</td>
|
|
|
|
<td>Driver for Newport PM500.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devSoft.c</td>
|
|
|
|
<td>Soft Channel device support.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devSoftAux.c</td>
|
|
|
|
<td>Soft Channel device support (Note: CA and record access code cannot
|
|
both reside in the same file; each defines (redefines) the DBR's.
|
|
Hence, functions are split between this and the above file base on whether
|
|
they are record oriented (devSoft.c) or CA oriented (devSoftAux.c).</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>devSoft.h</td>
|
|
|
|
<td>Header included by devSoft.c and devSoftAux.c</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>gpibIO.h</td>
|
|
|
|
<td>GPIB communication include file.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>gpibIO.c</td>
|
|
|
|
<td>GPIB interface via Hideos.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>serialIO.h </td>
|
|
|
|
<td>Serial communication include file.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>serialIOMPF.cc</td>
|
|
|
|
<td>Serial communication interface via MPF.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drvIM483.h</td>
|
|
|
|
<td>Common header included by all IMS device drivers.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>dev483PL.c</td>
|
|
|
|
<td>Device support for IM483 in <i>party line</i> communication mode.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>dev483SM.c</td>
|
|
|
|
<td>Device support for IM483 in <i>single mode</i> communication mode.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drv483PL.c</td>
|
|
|
|
<td>Driver for IM483 in <i>party line</i> communication mode.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>drv483SM.c</td>
|
|
|
|
<td>Driver for IM483 in <i>single mode </i>communication mode.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td></td>
|
|
|
|
<td></td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>Makefile.Vx</td>
|
|
|
|
<td>This file is not included in the distribution. However, the user must
|
|
edit this file and add lines similar to the following:
|
|
<pre>MOTOR_OBJS = motorRecord.o devOms.o drvOms.o devOms58.o drvOms58.o
|
|
LIBNAME = mylib.o
|
|
LIBOBJS = $(MOTOR_OBJS) $(other objects here)
|
|
|
|
</pre>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<th COLSPAN="2">ASCII FILES
|
|
<br>files to be placed in <tt>&lttop>/cat_ascii/</tt></th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorRecord.ascii</td>
|
|
|
|
<td>This file defines all of the fields for the motor record.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>choiceRecMotor.ascii</td>
|
|
|
|
<td>This file defines all of the choice values for the motor record.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>choiceMotor.h</td>
|
|
|
|
<td>This file is included by choiceRecMotor.ascii and by recMotor.c.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>choiceRec.ascii</td>
|
|
|
|
<td>This file is not included in the distribution. However, the user must
|
|
edit this file and add the line:
|
|
<pre>#include &ltchoiceRecMotor.ascii></pre>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>dbRecType.ascii</td>
|
|
|
|
<td>This file is not included in the distribution. However, the user must
|
|
edit this file and add the line:
|
|
<pre>"motor"</pre>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>devSup.ascii</td>
|
|
|
|
<td>This file is not included in the distribution. However, the user must
|
|
edit this file and add the following lines:
|
|
<pre>! Device Support for motor record
|
|
"motor" VME_IO "devOMS" "OMS VME8, VME44"
|
|
"motor" VME_IO "devOms58" "OMS VME58"
|
|
"motor" VME_IO "devV544" "Highland V544" </pre>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>drvSup.ascii</td>
|
|
|
|
<td>This file is not included in the distribution. However, the user must
|
|
edit or create this file and add the following lines:
|
|
<pre>! Driver support for the OME VME58 motor controller
|
|
"drvOms58"
|
|
|
|
|
|
|
|
</pre>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<th COLSPAN="2">MEDM DISPLAY SCREENS
|
|
<br>files to be placed in <tt>&lttop>/&ltapp&gtApp/op/adl/</tt></th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorx.adl</td>
|
|
|
|
<td>Small motor-control screen</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorx_tiny.adl </td>
|
|
|
|
<td>Tiny motor-control screen</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorx_more.adl </td>
|
|
|
|
<td>Medium motor-control screen</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorx_setup.adl</td>
|
|
|
|
<td>Setup screen for a single motor</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>motorx_all.adl </td>
|
|
|
|
<td>Debug screen for a single motor</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="2">These files build <tt>medm</tt> screens to access the motor
|
|
record. To use one of them from the command line, type, for example
|
|
<pre>medm -x -macro "P=XXX:,M=m1" motorx.adl</pre>
|
|
where <tt>XXX:m1</tt> is the name of a motor record in an IOC.
|
|
<p>These files can also be used as related displays from other <tt>medm</tt>
|
|
screens by passing the argument <tt>"P=XXX:,M=m1"</tt>.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<th COLSPAN="2">
|
|
<br>EPICS STARTUP FILES
|
|
<br>files to be placed in <tt>&lttop>/ioc/ioc&ltname>/</tt></th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>st.cmdmv167 </td>
|
|
|
|
<td>Startup script</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="2">A sample startup script, containing excerpts relevant to
|
|
motors, is included in the distribution. Here is an annotated copy:
|
|
<pre>#######################################################################
|
|
# vxWorks startup script to load and execute system (iocCore) software.</pre>
|
|
<b><font color="#FFFFFF">Load standard EPICS software</font></b>
|
|
<pre># the following should be loaded first - BEGIN
|
|
ld < targetmv167/iocCore
|
|
ld < targetmv167/drvSup
|
|
ld < targetmv167/devSup
|
|
ld < targetmv167/recSup
|
|
# the following should be loaded first - END</pre>
|
|
<b><font color="#FFFFFF">Load custom EPICS software (including motor support)</font></b>
|
|
<pre>ld < ../../stdApp/src/O.mv167/stdlib.o</pre>
|
|
<b><font color="#FFFFFF">Motor-related debug switches </font></b>
|
|
<pre>recMotordebug = 0
|
|
|
|
#OMS vme8/vme44 debug switches
|
|
devOMSdebug = 0
|
|
drvOMSdebug = 0
|
|
|
|
#OMS vme58 debug switches
|
|
devOms58debug = 0
|
|
drvOms58debug = 0
|
|
|
|
#Highland Technology V544 debug switches
|
|
devV544ebug = 0
|
|
drvV544debug = 0</pre>
|
|
<b><font color="#FFFFFF">Motor-related databases </font></b>
|
|
<pre># load this before loading any databases
|
|
dbLoad "../../default.dctsdr"
|
|
|
|
#allstop
|
|
dbLoadRecords("../../stdApp/gDb/allstop.db","P=tmm:")
|
|
#motors
|
|
dbLoadRecords("../../stdApp/gDb/m16.db","P=tmm:")</pre>
|
|
<b><font color="#FFFFFF">Specify motor-controller board address, interrupt
|
|
vector, etc.</font></b>
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<td COLSPAN="2"><tt> omsSetup(nCards, Unused, baseAddress,
|
|
intVectBase, intLevel, pollRate)</tt>
|
|
<br><tt> oms58Setup(nCards, Unused, baseAddress, intVectBase, intLevel,
|
|
pollRate)</tt>
|
|
<br><tt> v544Setup(nCards, nAxes, baseAddress, intVectBase,
|
|
intLevel, pollRate)</tt>
|
|
<p><tt>MM3000Setup(nCards, Unused,
|
|
pollRate)</tt>
|
|
<br><tt>MM3000Config(card#, portType, GPIB link or hideos_card#, GPIB address
|
|
or hideos_task name)</tt>
|
|
<p><tt>MM4000Setup(nCards, Unused,
|
|
pollRate)</tt>
|
|
<br><tt>MM4000Config(card#, portType, GPIB link or hideos_card#, GPIB address
|
|
or hideos_task name)</tt>
|
|
<p><tt>IM483SMSetup(nCards, Unused,
|
|
pollRate) </tt>
|
|
<br><tt>IM483SMConfig(card#, portType, GPIB link or hideos_card#, GPIB
|
|
address or hideos_task name) </tt>
|
|
<p><tt>IM483[PL/SM]Setup(nCommNet, Unused,
|
|
pollRate) </tt>
|
|
<br><tt>IM483[PL/sm]Config(CommNet#, portType, GPIB link or hideos_card#,
|
|
GPIB address or hideos_task name) </tt>
|
|
<br> </td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>nCards</td>
|
|
|
|
<td>the actual number of cards may be less, but not greater than this</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>nCommNet</td>
|
|
|
|
<td>the number of Communication networks (e.g., the number of RS-422
|
|
networks for a IM483PL device).</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>nAxes</td>
|
|
|
|
<td>the maximum number of motor axes controlled by any one card</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>baseAddress</td>
|
|
|
|
<td>the base address of the first card of a series. This must agree with
|
|
address jumpers on the actual card(s).
|
|
<p>OMS VME8, VME44, and VMEX cards are all of one series, with a base address
|
|
in the short address space, on a 16-byte (0x10) boundary. (I.e., these
|
|
cards require 16 bytes each, and must all be addressed contiguously as,
|
|
e.g., 0xFC00, 0xFC10).
|
|
<p>OMS VME58-x cards are in their own series, also in the short address
|
|
space, on a 4k-byte (0x1000) boundary.
|
|
<p>Highland Technology V544 cards are in their own series, in the short
|
|
address space, on a 128-byte (0x80) boundary.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>intVectBase</td>
|
|
|
|
<td>the interrupt vector that will be loaded into the first card of a series.
|
|
Succeeding cards will be loaded with intVectBase+1, intVectBase+2, etc.
|
|
Set to "0" to disable interrupt generation; otherwise, stay in the range
|
|
[64..255].</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>intLevel</td>
|
|
|
|
<td>the VME-interrupt level (in [1..6]) the cards will use. This must agree
|
|
with jumper settings on the cards.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>pollRate</td>
|
|
|
|
<td>the rate (in Hz.) at which the driver will interrogate a card when
|
|
one of its motors is moving. This is also the rate at which channel-access
|
|
monitors will be posted; to avoid saturating the network with motor-readback
|
|
information, don't set pollRate much higher than 10 Hz. pollRate must be
|
|
in the range [1..60].</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>portType</td>
|
|
|
|
<td>0 - GPIB_PORT or 1 - RS232_PORT</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<pre># OMS VME8, VME44, VMEX driver setup parameters:
|
|
omsSetup(5, 8, 0xFC00, 180, 5, 10)
|
|
|
|
# OMS VME58 driver setup parameters:
|
|
oms58Setup(5, 8, 0x2000, 190, 5, 10)
|
|
|
|
# Highland Technology V544 driver setup parameters:
|
|
v544Setup(5, 4, 0xDD00, 200, 5, 10)</pre>
|
|
<b><font color="#FFFFFF">Start EPICS</font></b>
|
|
<pre>iocInit</pre>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table BORDER CELLPADDING=5 >
|
|
<tr>
|
|
<th COLSPAN="2">BACKUP/RESTORE (BURT) REQUEST FILES
|
|
<br>files to be placed in <tt>&lttop>/&ltapp&gtApp/op/burt/</tt></th>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>settings.req</td>
|
|
|
|
<td>sample request file to save settings of all motors. Edit this file,
|
|
supplying names of the motor records whose settings you want saved. (The
|
|
sample file also saves the states of other records in the sample database,
|
|
m16.db, that enable or disable the motor records.)</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>yyMotorSettings.req </td>
|
|
|
|
<td>save settings of a specified motor. This file is <tt>#include</tt>'d
|
|
(once for each motor) by settings.req.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>positions.req </td>
|
|
|
|
<td>sample request file to save positions of all motors. Edit this file,
|
|
supplying names of the motor records whose positions you want saved.</td>
|
|
</tr>
|
|
|
|
<tr VALIGN=TOP>
|
|
<td>yyMotorPositions.req </td>
|
|
|
|
<td>save position of a specified motor, This file is <tt>#include</tt>'d
|
|
(once for each motor) by positions.req.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td COLSPAN="2">These files tell the backup/restore tool how to save motor
|
|
settings and positions. To use them from the command line, type, for example
|
|
<pre>burtrb -f settings.req -o myMotorSettings.snap
|
|
|
|
burtrb -f positions.req -o myMotorPositions.snap
|
|
|
|
</pre>
|
|
To restore the motor settings and positions saved by the above commands,
|
|
type
|
|
<pre>burtwb -f myMotorSettings.snap
|
|
|
|
burtwb -f myMotorPositions.snap
|
|
|
|
</pre>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr><a NAME="Restrictions"></a>
|
|
<h2>
|
|
Restrictions</h2>
|
|
You <i>must</i> not change the motor resolution while the motor is moving,
|
|
but the record currently does not defend itself against this.
|
|
<p>There is no way to ask for a reading of the motor's position register,
|
|
encoder, or limit switches. These are read only while the motor is moving.
|
|
<p>Because of the way limit-switch information is conveyed by the OMS hardware,
|
|
the motor record cannot know the states of both limit switches at the same
|
|
time. It only knows the state of the switch toward which the motor is moving.
|
|
<p>If a move is requested while the motor already is in motion, the original
|
|
move will still receive a (useless) backlash correction.
|
|
<p>Changing MRES (the motor resolution) should change VELO (the speed in
|
|
engineering units per second), and leave S (the speed in revolutions per
|
|
second) unchanged. Currently, neither VELO nor S appears to change, but
|
|
the record behaves as though S had been changed to agree with VELO. A similar
|
|
thing happens with SBAK and SBAS.
|
|
<br>
|
|
<hr WIDTH="100%">
|
|
<br><a NAME="Examples"></a>
|
|
<h2>
|
|
Examples</h2>
|
|
|
|
<h4>
|
|
Command Primitives</h4>
|
|
This example assumes the controller is an MM4000 and that only one motor
|
|
in the controller is moved at a time (MM4000 power on/off effects all motors).
|
|
If the user wishes the system to perform as follows:
|
|
<ol>
|
|
<li>
|
|
Boot-up with motor power off.</li>
|
|
|
|
<li>
|
|
Turn motor power on before motor motion.</li>
|
|
|
|
<li>
|
|
Turn motor power off after motor motion.</li>
|
|
</ol>
|
|
Then set fields as follows:
|
|
<ul>
|
|
<li>
|
|
<tt><font size=+1>INIT = "MF"</font></tt></li>
|
|
|
|
<li>
|
|
<tt><font size=+1>PREM = "MO"</font></tt></li>
|
|
|
|
<li>
|
|
<tt><font size=+1>POST = "MF"</font></tt></li>
|
|
</ul>
|
|
|
|
<h4>
|
|
Soft Channel</h4>
|
|
The following is a simple example of using soft channel device support
|
|
to allow the user to transform rotary position commands into linear moves.
|
|
This example assumes the system consist of a linear stage driving a tangent
|
|
arm. The user commands the system in terms of the angle the arm makes
|
|
with the vertical. The database converts this angle into a linear
|
|
position along an axis that is one meter perpendicular to the center of
|
|
rotation.
|
|
<p>The following database implements the system described above.
|
|
The database consist of four records:
|
|
<ul>
|
|
<li>
|
|
<u>rotary</u> - a <i>soft</i> motor record where the user issues angular
|
|
position commands in <i>degrees</i>.</li>
|
|
|
|
<li>
|
|
<u>convertDriveValue</u> - a <i>calcout</i> record that converts the commanded
|
|
position from <i>degrees</i> to <i>mm</i>.</li>
|
|
|
|
<li>
|
|
<u>linear</u> - a <i>hard </i>motor record using Oms58 device support
|
|
that accepts linear position commands in <i>mm.</i></li>
|
|
|
|
<li>
|
|
<u>convertReadbackValue</u> - <i>calcout</i> record that converts the feedback
|
|
position from <i>mm
|
|
</i>to
|
|
<i>degrees</i>.</li>
|
|
</ul>
|
|
Note the following concerning the example database and Soft Channel device
|
|
support:
|
|
<ul>
|
|
<li>
|
|
Jogging a soft channel motor record is <b>not</b> supported.</li>
|
|
|
|
<li>
|
|
In the <i>convertReadbackValue</i> record, CP is required in the INPA field
|
|
to get continuous readback updates to the <i>rotary</i> record. Otherwise,
|
|
the <i>rotary</i> record will only update at the end of a move.</li>
|
|
|
|
<li>
|
|
The <i>convertDriveValue</i> record converts <i>rotary's </i>DVAL field
|
|
from degrees to radians, takes the tangent, converts from meters to millimeters
|
|
and finally, sends this value to <i>linear's</i> DVAL field<i>.</i></li>
|
|
|
|
<li>
|
|
The <i>convertReadbackValue</i> record converts <i>linear's</i> DRBV field
|
|
from millimeters to meters, takes the inverse tangent and finally, converts
|
|
from radians to degrees.</li>
|
|
</ul>
|
|
|
|
<table BORDER COLS=2 WIDTH="100%" NOSAVE >
|
|
<tr VALIGN=TOP NOSAVE>
|
|
<td NOSAVE>grecord(motor,"$(user):rotary")
|
|
<br>{
|
|
<br> field(DTYP,"Soft Channel")
|
|
<br> field(OUT,"$(user):convertDriveValue.A PP
|
|
MS")
|
|
<br> field(RDBL,"$(user):convertReadbackValue.VAL
|
|
NPP MS")
|
|
<br> field(URIP,"Yes")
|
|
<br> field(STOO,"$(user):linear.STOP PP MS")
|
|
<br> field(DINP,"$(user):linear.DMOV NPP MS")
|
|
<br> field(MRES,"0.001")
|
|
<br> field(RRES,"1.000")
|
|
<br> field(PREC,"3")
|
|
<br> field(DHLM,"45")
|
|
<br> field(DLLM,"-45")
|
|
<br> field(TWV,"5")
|
|
<br> field(RTRY,"0")
|
|
<br> field(EGU,"deg.")
|
|
<br>}</td>
|
|
|
|
<td>grecord(motor,"$(user):linear")
|
|
<br>{
|
|
<br> field(DTYP,"OMS VME58")
|
|
<br> field(VBAS,"1.0")
|
|
<br> field(VELO,"25.0")
|
|
<br> field(OUT,"#C0 S0 @")
|
|
<br> field(MRES,"0.001")
|
|
<br> field(PREC,"3")
|
|
<br> field(DHLM,"1000")
|
|
<br> field(DLLM,"-1000")
|
|
<br> field(RTRY,"0")
|
|
<br> field(TWV,"1")
|
|
<br> field(EGU,"mm.")
|
|
<br>}</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>grecord(calcout,"$(user):convertDriveValue")
|
|
<br>{
|
|
<br> field(DESC,"Convert rotary to linear")
|
|
<br> field(CALC,"TAN(A / 57.296) * 1000")
|
|
<br> field(OUT,"$(user):linear.DVAL PP MS")
|
|
<br>}</td>
|
|
|
|
<td>grecord(calcout,"$(user):convertReadbackValue")
|
|
<br>{
|
|
<br> field(DESC,"Convert linear to rotary")
|
|
<br> field(CALC,"ATAN(A / 1000) * 57.296")
|
|
<br> field(INPA,"$(user):linear.DRBV CP MS")
|
|
<br>}</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p><a NAME="Design Decisions"></a>
|
|
<h2>
|
|
Design Decisions</h2>
|
|
This section of the document is an attempt to record the reasoning behind
|
|
recent motor record design decisions.
|
|
<h4>
|
|
Motor Controller Travel Limits</h4>
|
|
For those motor controllers that provide their own internal software travel
|
|
limits (e.g., MM4000), the motor record will only allow the user to set
|
|
dial travel limits (i.e., D[H/L]LM) that are within the controller's travel
|
|
limit range, inclusively. In making this design decision it was assumed
|
|
that an <i>expert</i> user would enter the controller travel limits (possibly,
|
|
through a front panel user interface) that would protect other users from
|
|
reaching the hard travel limits. Controllers with their own travel
|
|
limits that are commanded to move outside their valid range respond with
|
|
an error. Hence, there is no utility in allowing the dial travel
|
|
limits outside the controller's range.
|
|
<h4>
|
|
Separate EGU's and MRES's between Controller and Motor Record</h4>
|
|
Device driver support for controllers that have characteristics different
|
|
from the OMS controllers, such as the Newport MM4000, has raised new issues.
|
|
One of these issues is whether or not the motor record should set it's
|
|
EGU and MRES fields from the controller's values. We think it should
|
|
not.
|
|
<p>Background: The MM4000 is a stand-alone controller with it's own front
|
|
panel, non-volatile memory and power supply. The user can configure
|
|
the MM4000 entirely from the front panel; including which engineering units
|
|
will be displayed on the front panel. Once engineering units are
|
|
selected, these same units will be used by the MM4000 when communicating
|
|
with a host system (i.e., EPICS). Since a host can query the MM4000
|
|
for both the controller's engineering units and it's positioning resolution,
|
|
it is possible to have the motor record's EGU and MRES fields automatically
|
|
set based on values stored in the MM4000 controller, but we decided not
|
|
to do this.
|
|
<p>To maximize flexibility, we decided to keep these characteristics separate
|
|
between the motor record and the controller. This decision allows
|
|
the motor record EGU field (and consequently, MRES) to be set to an application
|
|
specific value (e.g., kV) that is not supported by the motor controller.
|
|
<br>
|
|
<br>
|
|
<p>
|
|
<hr>
|
|
<address>
|
|
Suggestions and comments to:</address>
|
|
|
|
<br><a href="mailto:sluiter@aps.anl.gov">Ron Sluiter</a> : (sluiter@aps.anl.gov)
|
|
<br><a href="mailto:mooney@aps.anl.gov">Tim Mooney</a> : (mooney@aps.anl.gov)
|
|
<br><a href="mailto:sullivan@aps.anl.gov">Joe Sullivan</a> : (sullivan@aps.anl.gov)
|
|
<br>Last modified: July 12, 1999
|
|
</body>
|
|
</html>
|