Newport ESP300
==============

Serial communication using the GreensSpring XM Octal I/O.
---------------------------------------------------------

The GreensSpring XM Octal I/O has a 16 pin jumper block for each serial port.
Assume (the manual does not define this) that the jumper pins are numbered
from, top to bottom, and from left to right; i.e.,
    1  2  3  4
    5  6  7  8
    9 10 11 12
   13 14 15 16
   
Then the "Default jumbering ..." depicted in Fig. 2 of the GreensSpring XM
Octal I/O manual is jumpered as follows; 1-5, 2-6, 9-13, 10-14.

The correct jumpering for the ESP300 is; 1-5, 2-6, 9-13, 10-11, 15-16.


Setting the motor resolution (MRES) and Engineering Units fields to the
SAME values as the controller's.
-------------------------------------------------------------------------

For DC motors, set MRES to the ESP300's response to the SU? command.

If there is no other mechanism (e.g., generic serial record, dumb terminal,
etc.) to communicate to the ESP300, the response to the SU? command can be
determined by following this procedure;

1 - uncomment the "USR_CFLAGS += -DDEBUG" line in the NewportSrc/Makefile.Vx
    file (This selects the diagnostic messages to be compiled).
2 - "cd <motor>/motorApp/NewportSrc; gnumake clean; gnumake"; this re-compiles
    the device drivers with the diagnostic messages selected.
3 - Rebuild your IOC; "cd <IOC>; gnumake".
4 - Add "drvESP300debug = 4" to the IOC's st.cmd file before "iocInit".
5 - Connect to the VxWorks shell and reboot the IOC.

The VxWorks shell output should contain lines like the following;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Starting iocInit
send_mess(): message = VE?
recv_mess(): message = "ESP300 Version 3.08 09/09/02"
send_mess(): message = ZU
recv_mess(): message = "0H"
send_mess(): message = 01ST
send_mess(): message = 02ST
send_mess(): message = 03ST
send_mess(): message = 01SN?
recv_mess(): message = "2"
send_mess(): message = 01SU?
recv_mess(): message = "0.00003539317"
send_mess(): message = 01MD
recv_mess(): message = "1"
send_mess(): message = 01TP
recv_mess(): message = "0.00000"
send_mess(): message = 01PH
recv_mess(): message = "18000606H, 6H"
send_mess(): message = 01MO?
recv_mess(): message = "0"
send_mess(): message = 01TE?
recv_mess(): message = "0"
send_mess(): message = 02SN?
recv_mess(): message = "2"
send_mess(): message = 02SU?
recv_mess(): message = "0.00009765625"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Note the response to the SU? and SN? commands and set MRES to that value.

All three supported controllers (ESP100/300/301) have the same response
to the SN? command; 0 to 10 where
0 = encoder count       6 = micro-inches
1 = motor step          7 = degree
2 = millimeter          8 = gradian
3 = micrometer          9 = radian
4 = inches             10 = milliradian
5 = milli-inches       11 = microradian

5 - Set the motor record's EGU field to "mm" (based on SN-2) and the MRES field
    to 3.539317E-5 (based on SU = 0.00003539317).
6 - Turn off diagnostic messages. Either set drvESP300debug = 0 in the st.cmd
    file (there is a very small amount of CPU overhead associated with leaving
    the diagnostic messages loaded), or go to step #1, and reverse the steps;
    comment out the "USR_CFLAGS += -DDEBUG" line in the NewportSrc/Makefile.Vx,
    etc., etc.,
    
Setting the motor record's Engineering Units field (EGU) to a value DIFFERENT
from the controller's EGU.
-------------------------------------------------------------------------------
In the above example the controller returned SU = "0.00003539317" and SN = "2"
for axis #1. If the user prefers the motor record EGU to be in inches rather
than millimeters, then set EGU = "inch" and,
MRES = (3.539317E-5 mm / 1 encoder tick) X (1 inch / 25.4 mm)
     = 1.39343189E-6 inch / 1 encoder tick

Newport ESP100
==============

Configuration
-------------

- Unlike the ESP300, the ESP100 must be told what type of motor it is connected
to.  This is done using the "Set Motor Type" command; QM.  "QM" arguments are
as follows:
0 - motor type undefined (default).
1 - DC servo motor.
2 - stepper motor.
3 - commutated stepper motor.
4 - commutated brushless DC servo motor.
After setting the motor type, the value must be saved to non-volatile memory
using the "SM" command.

Example
-------

Setting and saving an ESP100 for use with a DC servo motor driven stage (e.g.,
850G);

        1QM 1<CR>
        SM<CR>


Newport MM4000
==============

The MM4000 controller has an approximately 50ms delay before it responds to a
status query.  Hence, it is impossible to get more that a 20 Hz update rate
from the MM4000; 7 or 8 Hz is attainable.  This 50ms delay exists with both
RS232 and GPIB communication interfaces.


Newport PM500
=============

The PM500 has high and low speed loops. Since the EPICS PM500 device driver
does not set any of the low speed parameters (i.e., LSIZE, LACCEL, LDECEL, LV),
the low speed loop feature may interfere with EPICS setting the slew velocity.
I recommend preventing the PM500 from ever using the low speed velocity loop by
setting the Low Speed Loop Threshold (LSIZE) to the motor record's Retry
Deadband field (RDBD).

The LSIZE can be set from the EPICS motor record by entering the PM500 command
in the record's INIT field.  LSIZE is in units of either um or arc-sec.  For
example, if your RDBD = 0.123 mm, then set the INIT field to "LSIZE 123.0".


Newport SMC100
==============
The SMC100 controller has a fixed baud rate of 57,600.  This means that it
cannot be used with the IP-Octal232.  If you want to use it from a vxWorks ioc,
you will need to connect it via a Moxa or similar.  I have tested this code on
both Linux and Cygwin soft ioc's.  The stage I tested it with is a GTS30V.
Initially, the controller needs to be connected to the stage it will be running,
and then configured with Newport's software.  I used Newport's PC program called 
"SMC100 User Tool", which allows for the controller to set and keep all of the 
settings for the stage.


********************************************************************************
What's what in this directory
-----------------------------

misc EPICS stuff
----------------
NewportRegister.cc
NewportRegister.h

Model 2 asyn driver
-------------------
XPSAsynInterpose.c
XPSAsynInterpose.h
drvXPSAsyn.c
drvXPSAsyn.h
tclCall.cc
tclCall.h

asyn-model-independent
----------------------
drvXPSAsynAux.c (non-motor aspects of XPS controller)

Model 3 asyn driver
-------------------
XPSAxis.cpp
XPSAxis.h
XPSController.cpp
XPSController.h
SMC100Driver.cpp
SMC100Driver.h
SMC100Register.cc
SMC100Register.h

support code common to models 2 and 3
-------------------------------------
XPS_C8_drivers.cpp
XPS_C8_drivers.h
XPS_C8_errors.h
strtok_r.c
strtok_r.h
Socket.cpp
Socket.h
asynOctetSocket.cpp

Model 1 device support
----------------------
devESP300.cc
devMM3000.cc
devMM4000.cc
devPM500.cc


Model 1 drivers
---------------
drvESP300.cc
drvMM4000Asyn.c
drvMM4000Asyn.h
drvMM3000.cc
drvMM4000.cc
drvMMCom.h
drvPM500.cc

other - Note the XPS Model 3 driver has built-in trajectory scanning.  XPS_trajectoryScan.st is
      - for use with the Model 2 XPS driver.
-----
trajectoryScan.h
xps_ftp.c
xps_ftp.h
XPS_trajectoryScan.st
MM4005_trajectoryScan.st

test code
---------
XPSGathering.c
XPSGathering2.c
XPSGatheringMain.c
XPSGatheringRegister.c
