Files
motorBase/README
T

675 lines
31 KiB
Plaintext

Motor Record V4.4 Release Notice
================================
The motor record software in this release is compatible with EPICS base
R3.13.2, R3.13.3 and R3.13.4.
Contents
========
This <supporttop> contains the following motor record related items:
- motor record and device driver database definitions.
- the record level support library.
- device/driver libraries for various controllers.
- motor record/device/driver level documentation.
- motor record release documentation.
- two example applications; one without MPF (i.e. motorExApp/NoMPF) and
one with MPF (i.e., motorExApp/WithMPF).
As distributed, this support directory only builds the following:
- motorLib; Record support and common code for all device/drivers.
Optionally, any of the following device/driver libraries can be built by
uncommenting the appropriate line in ./motorApp/Makefile.
ImsLib - Intelligent Motion Systems controllers; ImsSrc directory.
newportLib - Newport controllers; NewportSrc directory.
omsLib - Oregon Micro System controllers; OmsSrc directory.
softMotorLib - Soft Channel device support; SoftMotorSrc directory.
motorCOM_mpf - Communication interface between motor device/drivers and
MPF; CommSrc directory.
Configuration
=============
The following files can be edited to tailor this distribution to site specific
needs. See individual files for instructions.
- ./config/RELEASE: Define location of external products.
If only VMEbus based motor controllers (e.g., OMS, Highland
V544) and/or Soft Channel device support is used, then only
EPICS_BASE is required.
For serial and/or GPIB motor controller communication, ALL of
the following support modules are required;
- EPICS_BASE R3.13.2 or above.
- MPF V1.5 or above.
- MPF_SERIAL V1.1 or above
- either MPF_GPIB V1.3 or GPIB V0.1 or above.
If any example applications (motorExApp) are to be built, then
TEMPLATE_TOP and MSITOP must be defined.
- ./motorApp/Makefile: Define which device/driver modules to build.
- ./motorExApp/Makefile: Define which, if any, example applications are
to be built.
Known Problems
==============
1) With the exception of jogging, motor record controlled backlash correction
does not work with the Newport MM4000. Since the MM4000 controller
has its' own backlash compensation feature, there are no plans to fix
this in future releases. Users of the MM4000 who need backlash
compensation should set the motor record's backlash distance to zero
and program the MM4000 controller's backlash compensation parameters.
2) The PAUSE function of the SPMG field only works if the RTRY field is
nonzero. This bug existed as far back as V3.3 of the motor record.
Modification Log from V4.3 to V4.4
==================================
1) config/RELEASE: - Changed comments to indicate that MPF_SERIAL must be
defined if either serial or GPIB communication is
required.
- Updated support modules to latest releases;
mpfSerial R1-2, MPF R1-6, EPICS base R3-13-4.
2) Examples: - iocBoot/iocNoMPF/st.cmd; added GDCT compatible Soft Channel
device driver example.
- iocBoot/iocWithMPF/[st.cmd and st_mpfserver.cmd]; for 1 CPU
configuration, both initGpibGsTi9914() and
HiDEOSGpibLinkConfig() must have the same GPIB server name.
- motorExApp/Db/[SoftMotorEx.db andSoftMotorEx] ; added a GDCT
compatible Soft channel device driver database example.
3) Jog Velocity and Acceleration. Two new fields (JVEL and JAR) were added to
support jog velocity and acceleration parameters. Only the OMS and IMS
device drivers support changing the Jog Velocity while jogging.
Files modified: motorRecord.dbd - Jog specific fields (JVEL and JAR).
motorRecord.c - Process JVEL in special().
devIM483[PL/SM].c, devMM[3/4]000.c,
devPM500.c, - Added Jog Velocity motor command.
devOmsCom.c - Added clear axis done flag command (CA)
to home and jog commands. This is
needed so that JVEL does not see
done from previous command.
4) Travel limits can be disabled by setting both the dial high and low limits
equal to zero; i.e., DHLM = DLLM = 0.
File modified: motorRecord.c
5) A problem was discovered with entering target positions through RVAL. If
the difference between the current and the next target position (i.e.,
RDIF, DIFF) was less than the retry deadband (RDBD), and the next
target position was in the "preferred direction", then the new RVAL
was ignored.
File modified: motorRecord.c - Root cause in do_work() was that under
the above conditions, LVAL was not updated.
6) The following scenario would put the motor record into an invalid state.
First, start the motor moving by giving it a new target position.
Next, while the motor is still moving, enter a new target position that
is beyond the software travel limit (HLM/LLM) . The invalid target
position is rejected (as it should be), but when the first target
position is reached the MIP field is left in the MOVE state, rather
than the DONE state.
File modified: motorRecord.c - Modified do_work() LVIO logic to set
DMOV true only if MIP is DONE.
7) Removed Hideos file motorApp/CommSrc/serialIO.cc from distribution.
8) The following scenario would put the motor record into an invalid state.
At the end of a move a "retry" is requested. The MIP field is set to
RETRY in maybeRetry(), but before the retry request can be processed
in do_work() the STOP field is set TRUE. This results in a STOP
command being issued, but no subsequent processing callbacks, which
leaves the record's MIP in the STOP state and DMOV false.
File modified: motorRecord.c - Modified do_work() STOP and SPMG
processing to set MIP <- DONE and DMOV <- TRUE when MIP == RETRY.
9) As suggested by Brian McAllister, type specifications for all bit-fields
found within unions have been changed to "int". This modification
elminates the ANSI warning messages and has no effect on the machine
code generated.
Files modified: motorRecord.c - mmap_field and nmap_field unions.
drvOms58.h - all control/status registers.
Modification Log from V4.2 to V4.3
==================================
1) An error was introduced into the motor record when item #14 under V4.2 was
implemented. This error occurred if the STOP field was activated when the
motor was not moving (i.e., MIP = 0). The motor record would become "stuck",
and not respond to a move request (due to the internal state machine associated
with MIP being set to the "stop" state), until the condition was cleared by
either a SPMG-stop or some other user action that forced the MIP field to zero.
File modified: motorRecord.c - Changed logic in do_work() so that the
stop command is always sent to the controller when the STOP
field is activated; but, the MIP field in only set to the
"stop" state if the current state is not STOP or DONE.
2) Due to ambiguous and conflicting Newport PM500 documentation, the velocity
and acceleration values for the PM500 controller were off by a factor of 1,000.
File modified: devPM500.c - Scaled velocity, acceleration and jogging
command parameters by 1,000.
3) HIDEOS is no longer supported.
Files modified: config/RELEASE - Removed HIDEOS path.
motorApp/CommSrc/Makefile.Vx - Removed HIDEOS.
4) Added Mark Rivers soft channel modifications as a conditional compilation
option (i.e., DMR_SOFTMOTOR_MODS).
Files modified: motorApp/MotorSrc/Makefile.Vx
motorApp/MotorSrc/motorRecord.c
motorApp/SoftMotorSrc/Makefile.Vx
motorApp/SoftMotorSrc/devSoft.h
motorApp/SoftMotorSrc/devSoft.c
5) The Soft Channel device driver example, softex.db, was removed from
motorExApp/Db and replaced with a GDCT compatible copy, SoftMotorEx.db. The
corresponding GDCT data file is SoftMotorEx.
Modification Log from V4.1 to V4.2
==================================
1) The following requirement was lost with release V4.0. 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.
File modified: motorRecord.c - Changed logic in
check_speed_and_resolution().
2) An error was introduced into the Oms device support with V4.0. The 1st
argument of the omsSetup(nCards, ...) function in the st.cmd file is for the
maximum number of VME8 and/or VME44 cards to be supported in a specific IOC
crate. If the "nCards" argument was set to anything other than the actual
number of cards in the IOC crate, the "dbior" function would result in
erroneous information or a bus error.
File modified: drvOms.c - Restored statement in motor_init() that sets
motor_state[] to NULL when card not found.
3) An error occurs with the OMS VME58 when the user runs the motor into a
limit switch and then attempts to move away from the limit switch. If either
an absolute or incremental move is utilized to move away from the limit switch,
the OMS VME58 ignores the 1st move attempt. Subsequent moves work. In
addition, the user can jog off a limit switch. This error was hidden in most
applications if RTRY was nonzero.
File modified: devOmsCom.c - Changed logic in oms_build_trans() to
prefix MP or MM command to any move when overtravel
status indicator is ON.
4) Added support for EPICS GPIB Module Version 0-0 from Benjamin Franksen.
Warning! Neither GPIB 0-0 are my usage of it has been throughly tested yet.
Files modified: config/RELEASE - Configuration instructions added.
CommSrc/Makefile.Vx - Conditional compilation label.
CommSrc/gpibIO.c - Conditional compilation for
unbundled GPIB module.
5) All motorApp/*/Makefile.Vx files were modified to take advantage of the
macro found in Benjamin Franksen's makefiles; i.e.,
LIBOBJS = $(SRCS.c:../%.c=%.o)
6) Replaced all occurrences of "include <stdioLib.h>" with "include <stdio.h>.
Wind River has labeled stdioLib.h as "obsolete vxWorks 5.0 header file".
Files modified: drvOms.c, drvOms58.c, devMM3000.c, devMM4000.c,
drvMM3000.c, drvMM4000.c
7) Added support for the Newport PM500 motion controller. This device/driver
is based on Mark River's PM500 V2.0 release.
Files added: devPM500.c and drvPM500.c
8) Removed QUERY from the list of valid "command types". It was unused.
Enumerated message types.
File modified: motordrvCom.h and motordrvCom.c
9) Some motor controllers (e.g., PM500) unconditionally respond when motor
commands are sent. Although these communication responses are not needed
(they are in fact a nuisance), they must be received so that later communication
transactions are kept in synchronization. To this end, a flag was added to the
"controller" structure to indicate where or not the associated motor controller
responds to all commands.
Files modified: motordrvCom.h - Added "cmnd_response" member to
"controller".
motordrvCom.c - Get controller response if
"cmnd_response" is set ON.
drvMM3000.c, drvMM400.c, drvOms.c drvOms58.c - Initialize "cmnd_response".
10) Modifications were made to the following files to adopt Mark River's
method of command line termination; i.e., the send_mess() function appends
the command line termination character to the string.
Files modified:
motordrvCom.h
motordrvCom.c - Removed command line terminator argument from
motor_send() and driver_table member, send().
motordevCom.h - Function declaration changes.
motordevCom.c - Removed command line terminator argument from
motor_end_trans_com().
11) Added support for the Intelligent Motion Systems, Inc. IM483 controller.
Two device/driver versions are available; IM483PL for "party line" and IM483SM
for "single" communication mode. See the IMS "Software Reference manual
Revision 051794 for detail.
Directory added: motorApp/ImsSrc
Files added: drvIM483.h, devImsMotor.dbd
devIM483SM.c, drvIM483SM.c
devIM483PL.c, drvIM483PL.c
Files modified: motorApp/Makefile - Added ImsSrc directory.
12) The record level support assumed that the motor controller would accept
two motion commands on the same command line. This occurs when backlash
compensation is enabled. Since the IM483[PL/SM] does not have this capability,
support for a command line "record separator" character was added. The record
separator is defined as an ASCII (IS2) character = /x1E. Currently, only one
record separator is allowed in a command line.
Files modified:
motordrvCom.c - process_messages() searches for a record
separator. If found, it splits the message,
outputs the 1st part and stores the 2nd part
back into the front of the message buffer.
- query_axis() detects 2nd part of messages,
outputs it and clears the message buffer.
13) For those controllers whose command lines require an alphabetic character
for the axis name identifier (e.g. OMS, Oms58, IMS483PL), support has been
added for driver specific axis names. An axis name array pointer was added to
the driver_table structure.
Files modified:
motordrvCom.h - Moved mess_card_query member axis_names to
driver_table.
motordrvCom.c - The global oms_trans_axis[] was removed.
motordevCom.h - Removed axis "name" member from axis_stat.
motordevCom.c - Removed initial string function argument from
motor_start_trans_com().
All drv{driver}.c files were modified to add an axis name
array point to their driver_table; (NULL for
device/drivers that do not use axis names;
e.g., MM3000, MM4000/5).
14) An error was introduced in V4.0 which prevented the record from processing
a jog request if the UEIP field was changed. Issuing a STOP or SPMG/STOP,
cleared the error.
Files modified: motorRecord.c - Activate DMOV when loading a position
(i.e., load_pos() called).
15) Removed unused C macros from driver level files.
Files modified: - devMM3000.c,
16) Records were stuck with DMOV = 0 if the user requested a move and there
was no underlying controller. No error message, besides the "card does not
exist" message at boot-up, would appear. With this release, the COMM_ALARM is
set and DMOV is reset if the controller does not exist.
File modified: - motor_end_trans_com() in motordevCom.c
17) An error was introduced in V4.0 which prevented backlash correction from
occurring after a JOG.
Files modified: postProcess() in motorRecord.c
18) Divide-by-zero errors were occurring in do_work() of motorRecord.c.
File modified: Added various error checks in motorRecord.c against
ERES becoming zero
19) Two motion commands were being sent by do_work() if the record was
processed twice before a callback was processed. This could occur under
various scenarios
- banging on the tweak button with a low frequency update rate.
- the motor record was (accidentally) processed from a periodic scan
with a higher frequency than the update rate.
File modified: In motorRecord.c, do_work(), changed the "motor moving"
test from the "movn" to the "mip" field.
20) An error was introduced into the motor record with V4.0. This error
occurred on the rare occasion when a target position (i.e., VAL or DVAL)
fell almost exactly half way between two integer RVAL values, and the retry
feature was enabled (i.e., RTRY is nonzero). The motor record would 'hang'
under these circumstances with DMOV set FALSE and RCNT set to one.
Files modified: motorRecord.dbd - erroneous retries were a result of
round-off error. Changed RES from a 'float'
to a 'double'.
motorRecord.c - Prior to V4.0, do_work() handled
retry request to the same position by setting
DMOV true and exiting (see code;
(npos == rpos)). Broke this logic in V4.0
because of item #13. Fixed, by testing for
MIP_RETRY, and clearing MIP.
21) Moved device specific structure "encoder_status" from motordrvCom.h to
drvOmsCom.h.
Files modified: motordrvCom.h and drvOmsCom.h
Modification Log from V4.0 to V4.1
==================================
1) Three errors in the OMS VME58 driver were found. All the errors caused the
same problem. Namely, erroneous retries occurred intermittently when multiple
axes were commanded to move on the same controller. This error occurred
because old position data was being passed back from the driver after Done
was detected. The erroneous intermittent retries occurred more often when the
Oms setup parameters called for a high frequency (e.g., 60 Hz) "polling" rate
and Oms interrupts were enabled.
File modified: drvOms58.c
Function modifications:
start_status() - Wait forever for control register update bit
to clear before setting.
set_status() - Request Data Area Update after DONE detected
so that both ASCII command data and
shared memory data match.
motorIsr() - Only write to control register if update bit
is off (the ISR was clearing the
update bit rather than the VME58 board.
2) Moved the Serial/GPIB communication label definitions from Newport specific
drvMMCom.h to the more general motordrvCom.h. New motor controllers will
require these labels.
Files modified: drvMMCom.h, motordrvCom.h, drvMM4000.c, drvMM3000.c
3) With previous releases, when using the motor record with soft channel
device support, the DMOV field would become stuck on if the user put the motor
in SET mode and entered a new DVAL or RVAL. With this release, the above user
action (i.e., "setting" a soft motor) results in the record being processed;
which, in most cases, will clear DMOV.
Files modified: devSoft.h, devSoft.c, devSoftAux.c
4) A problem with issuing a stop command (via either the STOP or SPMG field)
was found with ALL OMS boards and ALL versions of the OMS device drivers. The
root cause of this problem is a statement in the OMS manual that is not
entirely correct; i.e., the AC and VL commands are not completely queued.
The motor record issues both the target move and the backlash move on the same
command line to the motor controller. Each move (target and backlash) has its'
own acceleration rate. The problem was that when a STOP command was issued
during the target move, the backlash acceleration would go into effect. This
could result in a prolonged deceleration if the backlash acceleration rate
(BACC) is much smaller than the target acceleration rate (ACCL).
With this release both the devOms and the devOms58 device support issue the
target acceleration rate (ACCL) with the STOP command.
File modified: devOmsCom.c
Modification Log from V3.5 to V4.0
==================================
1) EPICS base 3.13.1 compatibility.
- Changed dev{Connect/Disconnect}Interrupt() to
dev{Connect/Disconnect}InterruptVME()
Files modified: drvOms.c, drvOms58.c
2) Newport MM3000 Device Support.
- Renamed drvMM400.h -> drvMMCom.h
- Added device and driver support in source code files "devMM3000.c"
and "drvMM3000.c".
- Modified MM3000_build_trans() in "devMM3000.c" and
motor_end_trans_com() in "motordevCom.c" to prevent motor
commands from being sent if card does not exists. Bus error
occurred with MM3000 device/driver when card did not exists
and motion was commanded from medm display.
3) Eliminated the GAIN field and the associated SET_CGAIN command;
Files modified: motorRecord.dbd, motor.h, devMM3000.c, devMM4000.c,
devOmsCom.c, and motorRecord.c
4) Previous releases of the motor record had a potential problem associated
with the homing function. The motorx_all.adl MEDM display set the
HOM[F/R] fields on and off. Depending on the pollRate defined in the
st.cmd Setup command and the speed at which the user toggled the
HOM[F/R] buttons; the record level software would turn off the DMOV
field when the HOM[F/R] button was turned off and a motor status update
had not yet been received. As a result, when the motor completed it's
homing function the command positions (i.e., VAL, DVAL, RVAL) were not
updated.
All previous motor record releases contained the DMOV problem; the
commanded position update problem was limited to the previous release
(V3.5). With this release, a dbPutField to either HOMF or HOMR is
valid on a FALSE to TRUE transition (i.e., 0 to 1), but a TRUE to FALSE
transition (i.e., 1 to 0) will result in an error.
- Modified motorRecord.dbd; added HOM[F/R] "special" processing.
- Modified motorRecord.c; since OPI can't reset HOM[F/R], postProcess()
does it; return error from special() if OPI tries to write to
HOM[F/R] when MIP indicates homing active.
5) Previous releases of the motor record allowed the auto restore to take
precedence over the controller when initializing the target position
(i.e., DVAL). With this release, if both the auto restore and
controller target position values are non-zero at boot-up, then DVAL
will be initialized from the controller's value. In other words, the
controller's target position takes precedence.
- Modified motor_init_record_com() in motordevCom.c so that a "Load
Pos" command is issued only if the position from the
controller is zero.
6) Consolidated common driver local variables in the motordrvComCode.h file.
- Created motordrvComCode.h
- Moved common local variables from drvOms.c, drvOms58.c, drvMM3000.c,
drvMM4000.c
7) Uninitialized Oms/Oms58 Driver Error Check. With previous release, if the
Oms or Oms58 driver was some how omitted from the database, a "... card
does not exist" error message would result. With this release, an
explicit error check and corresponding error message (i.e., "Oms[58]
driver uninitialized.") results at record initialization if a required
driver is not initialized. (Because of the particulars of MM[3000/4000]
initialization, this is not an issue with Newport controllers.)
- Added pointer to initialized indicator to driver table structure in
motordrvCom.h
- Added error checks in oms_init() and oms_end_trans() in both devOms.c
and devOms58.c
- For drvOms.c, drvOms58.c, drvMM3000.c and drvMM4000.c
- initialized pointer to local initialized indicator in driver
table.
- set initialized indicator ON in init().
8) Both the MM3000 and MM4000 device driver support could generate a bus error
under the following conditions:
1) The user selected GPIB communication mode.
2) At boot-up, the driver could not communicate with the device,
resulting in a "... card does not exist!" error.
3) Motor motion is commanded.
- Modified MM3000_build_trans() and MM4000_build_trans() in devMM3000.c
and devMM4000.c, respectively, to test for NULL board pointer.
9) Eliminated MM3000 and MM4000 device driver "internal" offset.
- Removed "offset" from MM3000_build_trans() and MM4000_build_trans()
in devMM3000.c and devMM4000.c, respectively.
- Read controller's home preset position at boot-up; save and restore
save home preset position when "setting" DVAL or RVAL.
10) For MM4000/40005 only, the controller's position resolution (TU controller
command) is read and saved so that the device driver can convert
between motor record "raw" positions and controller egu's.
11) Modified report() in drvMM4000.c by adding message; "MM4000 controller #
connection failed."
12) For the MM3000 when the GPIB communication interface is selected; sometimes
the MM3000 returns a NULL communication response. Hence, set_status()
in drvMM3000.c was modified to detect a NULL response and resend the
status query.
13) A jog request occurring during a jog induced backlash correction would,
intermittently, cause the MM4000 to go into an uncontrolled jog; i.e.,
the user would set JOG[F/R] false, but the jogging would not stop.
This occurred because the sequence of events were as follows:
<- mip = 0
JOGF=1 ->
<- mip = 1; Jog command
JOGF=0 ->
<- Stop command
<- Done
<- mip = 4; backlash command
JOGF=1 ->
<- Done
<- mip = 1; Jog command
<- mip = 4; backlash command
JOGF=0 ->
In the above event sequence, since mip=4 when JOGF is set to zero, no
stop command is sent. The MM4000 only accepts one motion command at
a time. Therefore, the last backlash command is ignored in the above
event sequence. The end result is an uncontrolled jog operation.
Modifications were made to motorRecord.c to fix this; in general, a
finite state machine was strictly enforced on jog request, jogging,
stopping a jog and the backlash after jogging. Jog processing is
isolated from the JOG[F/R] fields. Specifically,
- Added two new state indicators to MIP; MIP_JOG_REQ and MIP_JOG_STOP.
The jog states now consist of the following; Start (mip=0),
Request, Jogging, Stopping and Backlash.
- In postProcess();
- replaced (MIP_JOGF | MIP_JOGR) with (MIP_JOG_STOP)
when testing for done stopping after jogging.
- replaced (pmr->jogf || pmr->jogr) with MIP_JOG_REQ
when testing for done stopping after jog.
- "Queued" jog request (stop and jog buttons both on)
processing has been moved from postProcess() to do_work().
- Skip backlash operation if backlash distance is zero.
- In maybeRetry();
- Clear MIP if Max retry count (RTRY) set to zero.
- When clearing MIP, don't clear MIP_JOG_REQ.
- In do_work();
- Detect and process "Queued" jog request.
- Use MIP state indicators rather than JOG[F/R] fields to
process jog function.
- Don't want "DVAL has changed..." logic to get processed when
doing jog stop or backlash. Detect and do Normal Return.
- In special(); Set MIP_JOG_REQ on only if MIP=0 and the corresponding
hardware limit switch is not active.
14) Eliminated device dependent code from process_messages() in motordrvCom.c;
specifically, removed concatenating a carriage return to end of
controller message. The new method is to pass a pointer to the
command line terminator string in function arguments; beginning with
<device>_end_trans(), through motor_end_trans_com() in motordevCom.c,
to the "send()" function specified in the driver table.
Files modified: motordevCom.h, motordrvCom.h, devMM3000.c, devMM4000.c,
devOms.c, devOms58.c
15) In motordrvCom.h, changed "controller" structure member "MMptr" to
"DevicePrivate".
Files modified: devMM3000.c, devMM4000.c
16) All files were modified as follows:
- standard headers were added.
- original headers and modification history's were restored.
- all instances of #include <motorRecord.h> have been changed to
#include "motorRecord.h". As Mark Rivers explained, 'Include files
which are in <> are not included in dependencies by GCC. Thus, if
motorRecord.dbd is changed, devMM4000.c will not be recompiled unless
the <> are changed to "".'
17) The task name associated with each device driver has been given a unique
name; i.e. "<device>_motor". Previously, all the motor tasks were
given the same task name, "tmotor". This prevents using some of the
Tornado tools (Browser, CrossWind, etc.).
Files modified: drvMM3000.c, drvMM4000.c, drvOms.c, drvOms58.c
18) Removed my_strtok() from and replace with VxWorks library function
strtok_r().
Files modified: drvMM3000.c, drvMM4000.c, drvOms.c, drvOms58.c
19) Added record report function for Oms driver. File modified: drvOms.c
20) Added maximum allowable velocity fields; VMAX and SMAX.
- VMAX/SMAX added to motorRecord.dbd with Access Security Limit = 0.
- changed the Access Security Level for MRES, UREV, VBAS and SBAS from
one to zero.
- see motorRecord.html for valid velocity range limits.
- optimized calls to fabs(pmr->urev).
- added range_check() for validity checking bounded fields.
- In order to support backup and restore functions, the range checking
is done in such a way that the last minimum (i.e., VBAS/SBAS) or
maximum (i.e., VMAX/SMAX) value entered is always valid. For example,
if the minimum is entered and it exceeds the maximum, then the maximum
is set to the new minimum value.
Files modified: motorRecord.dbd, motorRecord.c
21) With MM4000 device support, a tweak request (TWF/TWR) occurring during the
processing of a previous tweak request, would intermittently leave the
MIP field in a nonzero state (i.e., mip = 0x20). A nonzero MIP field
prevents processing a jog request.
File modified: motorRecord.c
Removed code that set DMOV TRUE. See do_work() under the following
logic;
IF DVAL field has changed
IF the SET position field is OFF
IF last dial commanded position = current dial feedback position.
22) An infinite home velocity was being issued if the MSTA "encoder present"
bit was on, ERES=0 and UEIP=NO.
File modified: init_record() in motorRecord.c;
if ERES = 0, set ERES <- MRES.
23) Setting MRES negative could invalidated comparisons between BDST and RES.
File modified: motorRecord.c
- in postProcess(), (pmr->bdst != 0.0) to (|BDST| < |RES|).
- in do_work(), (|BDST| < RES) to (|BDST| < |RES|).
24) Moved OMS device specific code that enforced VELO > VBAS from do_work() in
motorRecord.c to oms_build_trans() in devOmsCom.c
25) No longer put MM4000 in "remote mode". User can do this by putting "MR;"
in the INIT field. File modified: drvMM4000.c
26) MM4000_build_trans() in devMM4000.c was overflowing its character buffer
(i.e., buff) when processing a LOAD_POS command. Increased buffer
size to controller maximum (110) and added buffer overflow detection
for both the local buffer and the "mess_node" message buffer.
27) Added model detection to MM4000/5 device driver. The long term plan
is to have the same source code support both MM4000 and MM4005
controllers and use the "model" indicator to tailor the device
driver support to either controller at run time. With this release
the "model" variable is used to ignore (i.e. NO-OP) the LOAD_POS motor
command for the MM4005. This is an interim solution until Newport
releases controller firmware that explicitly supports a LOAD_POS
command.
Files modified: drvMMCom.h, drvMM4000.c and devMM4000.c
28) When a MM4000's motor resolution is small, the MM4000 communicates the
motor's resolution in scientific notation. The MM4000 driver was not
processing the number of significant decimal points correctly when the
controller used scientific notation for the motor resolution.
Files modified: motor_init() in drvMM400.c
29) Through an odd set of circumstances the Oms58 driver was not performing
status updates on PowerPC (PPC) platforms. All users of the OMS VME58
controller on a PPC platform must upgrade to Motor Record version 4.0
for full functionality.
Files modified: start_status() in drvOms58.c
for (index = 0; index < total_cards; index++)
{
if ((pmotor = (struct vmex_motor *) motor_state[card]->localaddr) != 0)
^
wrong | index
30) A "Controller communication error" bit was allocated in the MSTA field.
Currently, only the MM4000/5 device driver sets this error indicator.
Files modified: motor.h, drvMMCom.h, motorRecord.c, drvMM4000.c
31) The "soft_motor" task (i.e., Soft channel device driver support task) was
nearly running out of stack space. Increased stack allocation from
1,000 to 5,000 bytes.
Files modified: devSoftAux.c