Hi Mark,
That sounds correct.
In a group move (for a multi-axis group) they will start at the same time and then also stop at the same time, and the speeds and accelerations are changed to enable that to happen – and that’s a controller
feature and not handled by the EPICS driver.
I’m looking at the code to try to understand what happens for axes not in the same group. I think it will call GroupMoveAbsolute/Relative for each unique group name, so we’d end up with multiple un-related
moves at the default speeds for each motor. They would start almost synchronously and then end at different times.
Cheers,
Matt
From: Mark Rivers <rivers at cars.uchicago.edu>
Sent: Wednesday, November 13, 2024 1:30 PM
To: Pearson, Matthew <pearsonmr at ornl.gov>; Jesse Hopkins <jhopkins1 at iit.edu>
Cc: EPICS Tech Talk <tech-talk at aps.anl.gov>
Subject: [EXTERNAL] RE: [Ext] RE: Help with motorNewport config
Hi Matt,
Thanks for the information. I have a couple of questions:
-
Assuming m1, m2, and m3 are in the same XPS MultiAxisGroup, then what happens when it does the GroupMoveAbsolute? The axes start at the same time, but do they also finish their motion at the same
time? That would imply that the acceleration and velocity for some of the axes are temporarily changed to allow that happen. Does it figure out which axis has the limiting acceleration and which has the limiting velocity and slow the others down?
-
Assuming m1, m2, and m3 are in separate groups, does deferred moves still work in the sense that it will start them all at about the same time, but make no attempt to have them stop at the same time?
Thanks,
Mark
Hi,
Thanks Mark, that pretty much explains it. Here’s a record that can provide the interface:
# ///
# /// Deferred moves flag for this controller
# ///
record(bo, "$(S):Defer") {
field(DESC, "Defer Moves")
field(DTYP, "asynInt32")
field(OUT, "@asyn($(PORT),$(ADDR),$(TIMEOUT))MOTOR_DEFER_MOVES")
field(SCAN, "Passive")
field(ZNAM, "GO")
field(ONAM, "DEFER")
field(VAL, "0")
}
One record per-controller.
For the Newport XPS deferred moves take advantage of the GroupMove functionality, which can start and stop a group of motors synchronously. For other controllers it likely just means
a synchronized start.
It would be used like:
caput $(S):Defer 1
caput $(S):M1 1.0
caput $(S):M2 2.0
caput $(S):M3 3.0
caput $(S):Defer 0
To cancel a deferred move without moving, you need to issue STOPs and then unset the deferred move flag, like:
caput $(S):Defer 1
caput $(S):M1 1.0
caput $(S):M2 2.0
caput $(S):M3 3.0
caput $(S):M1.STOP 1
caput $(S):M2.STOP 1
caput $(S):M3.STOP 1
caput $(S):Defer 0
Cheers,
Matt
I just found the documentation that explains how to enable/disable deferred moves. It is not specific to the XPS driver, it is part of the asyn motor interface.
It is documented in the R6-4 release notes here:
Deferred moves for asyn motors
The asyn motor framework now supports a flag to indicate that moves should be deferred. When at zero, moves proceed as normal. When set to one, moves should be deferred
and remembered by the controller driver, but not executed immediately. When set back to zero, the controller driver should then start all the moves (or at least moves to the last requested demand positions) that have been deferred, as near to simultaneously
as is possible for the particular model of controller. The flag is implemented per-controller, so all axes on a particular controller instance are affected, but axes on other controllers via the same driver are unaffected.
It is the responsibility of the motor controller driver to actually provide such functionality, or to give an error if the parameter is not recognised. Currently the Newport
XPS controller driver and the Delta Tau PMAC driver (in the tpmac module available from Diamond) support this.
To use the flag, connect to any asyn port/addr combination on the controller, using the parameter "DEFER". e.g. for a bo record, use DTYP=asynUInt32Digital, OUT=@asynMask(port,1,1)DEFER,
ZNAM="Go", _ONAM_="Defer"
However, I think the documentation is incorrect about the parameter name. It appears to actually be MOTOR_DEFER_MOVES, not DEFER.
·
For the GroupMoveAbsolute, what I'm actually interested in is the Newport's ability to start the motors in a group simultaneously with the GroupMoveAbsolute command.
That is supported. The feature is called "deferred moves". You enable deferred moves, move each motor with the motor record (which just sets the target position), and
then disable deferred moves. It will then move all the axes synchronously with GroupMoveAbsolute.
I have never used this feature. I see how it is implemented in the driver, but I don't see how it is controlled from a client. I don't see a record to enable/disable
deferred moves, or a GUI widget for it.
I think Matt Pearson has used this, so perhaps he can explain.
·
though I'm sure the same thing could be replicated with a trajectory.
The limitation of GroupMoveAbsolute is that each axis motion is restricted to being linear. Trajectories allow non-linear motions of each axis; the trajectory is defined
by a waveform record for each axis with the target position for the motor in each element of the trajectory. The Galil controller also supports this, as do several others.
Great thanks. I'll try setting up the PCO and let you know if I run into issues.
For the GroupMoveAbsolute, what I'm actually interested in is the Newport's ability to start the motors in a group simultaneously with the GroupMoveAbsolute command. It does its best to ensure synchronous motion,
which is important for our application. This has been working well for us, and I was hoping to continue to use it, though I'm sure the same thing could be replicated with a trajectory. Is there a way to command all the motors in a group to start at once such
that they are part of the same GroupMoveAbsolute command?
----
Jesse Hopkins, PhD
Deputy Director
BioCAT, Sector 18
Advanced Photon Source
Hi Jesse,
·
What I'm not sure about is whether the EPICS driver can do the GroupStatusGet and GroupMoveAbsolute commands, and if so where to find those
Yes, all moves are done with either GroupMoveAbsolute or GroupMoveRelative.
https://github.com/epics-motor/motorNewport/blob/c86aeb8f653787ac0d52cb1ddeab5c19af7ec74c/newportApp/src/XPSAxis.cpp#L289
GroupStatusGet is used in the XPSAxis::poll() method:
https://github.com/epics-motor/motorNewport/blob/c86aeb8f653787ac0d52cb1ddeab5c19af7ec74c/newportApp/src/XPSAxis.cpp#L563
·
First, how do you set up the PCO PVs? I found the XPSPositionCompare.db file, but there's no example in the sample IOC of how to configure it in the st.cmd file. Do you have an example handy you
could share?
I don’t think we have used that from EPICS at GSECARS beamlines. We mostly use ProfileMove with detector trigger outputs along the trajectory.
You load the database per axis, with either dbLoadRecords or dbLoadTemplate. For example:
dbLoadRecords($(MOTOR)/db/XPSPositionCompare.db”, “P=13IDA,R=m1,PORT=XPS1,ADDR=0”)
This is the medm screen where you configure 8 axes. There is also a single-axis screen.

This has not been used much, so if you find problems please let me know.
Mark
Hi Mark (and anyone else who wants to chime in),
Sounds good, I'll let you know if it becomes an issue at some point. I was in the process of writing you another email with a couple more questions. First, how do you set up the PCO PVs? I found the XPSPositionCompare.db file, but
there's no example in the sample IOC of how to configure it in the st.cmd file. Do you have an example handy you could share?
I also have a functional question. Up to now, I've been using the XPS python driver that Matt Newville wrote (https://github.com/pyepics/newportxps).
We're in the process of trying to move all our controls into EPICS on the backend (to make support easier, in theory), so I'm trying to get this set up so I can use the motorNewport controls instead of the python for the communication with the XPS, and then
just use python as the control layer for the user. Basically, besides basic single axis motion, the functions I've been using are: GroupStatusGet, GroupMoveAbsolute, and various setting/getting PCO parameters. The PCO I'm assuming will be accessible once I
set up those PVs. What I'm not sure about is whether the EPICS driver can do the GroupStatusGet and GroupMoveAbsolute commands, and if so where to find those. Alternatively, does the driver support a way to send commands directly to the controller that I could
use for those?
All the best.
- Jesse
----
Jesse Hopkins, PhD
Deputy Director
BioCAT, Sector 18
Advanced Photon Source
On Tue, Nov 12, 2024 at 4:47 PM Mark Rivers <rivers at cars.uchicago.edu> wrote:
Hi Jesse,
I don’t understand what is causing those error messages. I suggest you ignore them until you want to use profile moves, which are multi-axis coordinated motions. If you want to use profile moves
we can track down the issue.
Mark
Hi Mark,
This is an XPS-D8, so it makes sense that the Aux isn't working based on that.
Here's my motor.substitutions.xps5 contents. I was getting errors explicitly related to the axes that aren't configured in the Newport (I only have motors attached to 6, 7, and 8 right now), so I commented those out:
file "$(MOTOR)/db/basic_asyn_motor.db"
{
pattern
{P, N, M, DTYP, PORT, ADDR, DESC, EGU, DIR, VELO, VBAS, ACCL, BDST, BVEL, BACC, MRES, PREC, DHLM, DLLM, INIT}
#{18ID_D_Newport:, 1, "m$(N)", "asynMotor", XPS1, 0, "Dummy1", degrees, Neg, 4.0, 0.1, .5, 0, 1, .2, .00025, 4, 190, -190, ""}
#{18ID_D_Newport:, 2, "m$(N)", "asynMotor", XPS1, 1, "Dummy1", degrees, Neg, 4.0, 0.1, .5, 0, 1, .2, .00025, 4, 190, -190, ""}
#{18ID_D_Newport:, 3, "m$(N)", "asynMotor", XPS1, 2, "Dummy1", degrees, Neg, 4.0, 0.1, .5, 0, 1, .2, .00025, 4, 190, -190, ""}
#{18ID_D_Newport:, 4, "m$(N)", "asynMotor", XPS1, 3, "Dummy1", degrees, Neg, 4.0, 0.1, .5, 0, 1, .2, .00025, 4, 190, -190, ""}
#{18ID_D_Newport:, 5, "m$(N)", "asynMotor", XPS1, 4, "Dummy1", degrees, Neg, 4.0, 0.1, .5, 0, 1, .2, .00025, 4, 190, -190, ""}
{18ID_D_Newport:, 6, "m$(N)", "asynMotor", XPS1, 5, "size Rot", deg, Pos, 20., 0, 0.25, 0, 1, .2, 0.02, 2, 1000000.0, -1000000.0, ""}
{18ID_D_Newport:, 7, "m$(N)", "asynMotor", XPS1, 6, "size X", mm, Pos, 50., 0, 0.25, 0, 1, .2, 0.0005, 4, 25.0, -25.0, ""}
{18ID_D_Newport:, 8, "m$(N)", "asynMotor", XPS1, 7, "size Y", mm, Pos, 50., 0, 0.25, 0, 1, .2, 0.0005, 4, 25.0, -25.0, ""}
}
file "$(MOTOR)/db/XPS_extra.db"
{
pattern
{P, R, PORT, ADDR}
#{18ID_D_Newport:, m1, XPS1 0}
#{18ID_D_Newport:, m2, XPS1 1}
#{18ID_D_Newport:, m3, XPS1 2}
#{18ID_D_Newport:, m4, XPS1 3}
#{18ID_D_Newport:, m5, XPS1 4}
{18ID_D_Newport:, m6, XPS1 5}
{18ID_D_Newport:, m7, XPS1 6}
{18ID_D_Newport:, m8, XPS1 7}
}
file "$(MOTOR)/db/profileMoveController.template"
{
pattern
{P, R, PORT, NAXES, NPOINTS, NPULSES, TIMEOUT}
{18ID_D_Newport:, Prof1:, XPS1, 8, 2000, 2000, 1}
}
file "$(MOTOR)/db/profileMoveControllerXPS.template"
{
pattern
{P, R, PORT, NAXES, NPOINTS, NPULSES, TIMEOUT}
{18ID_D_Newport:, Prof1:, XPS1, 8, 2000, 2000, 1}
}
file "$(MOTOR)/db/profileMoveAxis.template"
{
pattern
{P, R, M, PORT, ADDR,NPOINTS, NREADBACK, MOTOR, PREC, TIMEOUT}
#{18ID_D_Newport:, Prof1:, 1, XPS1, 0, 2000, 2000, 18ID_D_Newport:m1, 3, 1}
#{18ID_D_Newport:, Prof1:, 2, XPS1, 1, 2000, 2000, 18ID_D_Newport:m2, 4, 1}
#{18ID_D_Newport:, Prof1:, 3, XPS1, 2, 2000, 2000, 18ID_D_Newport:m3, 4, 1}
#{18ID_D_Newport:, Prof1:, 4, XPS1, 3, 2000, 2000, 18ID_D_Newport:m4, 4, 1}
#{18ID_D_Newport:, Prof1:, 5, XPS1, 4, 2000, 2000, 18ID_D_Newport:m5, 4, 1}
{18ID_D_Newport:, Prof1:, 6, XPS1, 5, 2000, 2000, 18ID_D_Newport:m6, 4, 1}
{18ID_D_Newport:, Prof1:, 7, XPS1, 6, 2000, 2000, 18ID_D_Newport:m6, 4, 1}
{18ID_D_Newport:, Prof1:, 8, XPS1, 7, 2000, 2000, 18ID_D_Newport:m6, 4, 1}
}
file "$(MOTOR)/db/profileMoveAxisXPS.template"
{
pattern
{P, R, M, PORT, ADDR,NPOINTS, NREADBACK, PREC, TIMEOUT}
#{18ID_D_Newport:, Prof1:, 1, XPS1, 0, 2000, 2000, 3, 1}
#{18ID_D_Newport:, Prof1:, 2, XPS1, 1, 2000, 2000, 4, 1}
#{18ID_D_Newport:, Prof1:, 3, XPS1, 2, 2000, 2000, 4, 1}
#{18ID_D_Newport:, Prof1:, 4, XPS1, 3, 2000, 2000, 4, 1}
#{18ID_D_Newport:, Prof1:, 5, XPS1, 4, 2000, 2000, 4, 1}
{18ID_D_Newport:, Prof1:, 6, XPS1, 5, 2000, 2000, 4, 1}
{18ID_D_Newport:, Prof1:, 7, XPS1, 6, 2000, 2000, 4, 1}
{18ID_D_Newport:, Prof1:, 8, XPS1, 7, 2000, 2000, 4, 1}
}
Here's the current set of errors with this file:
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-03-01T16:24-0600
## Rev. Date build date/time:
############################################################################
drvStreamInit: Warning! STREAM_PROTOCOL_PATH not set.
2024/11/12 15:48:16.669 18ID_D_Newport:Prof1:FixedTime devAsynFloat64::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:Acceleration devAsynFloat64::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:TimeMode devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:MoveMode devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:NumAxes devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:NumPoints devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:NumPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:StartPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 15:48:16.670 18ID_D_Newport:Prof1:EndPulses devAsynInt32::processCallbackOutput process write error
All the best.
- Jesse
----
Jesse Hopkins, PhD
Deputy Director
BioCAT, Sector 18
Advanced Photon Source
On Tue, Nov 12, 2024 at 3:24 PM Mark Rivers <rivers at cars.uchicago.edu> wrote:
Hi Jesse,
·
2024/11/12 14:15:20.402 XPSAxis:getPID:. XPS XPS1 axis 5 corrector type is NoCorrector. Cannot get PID.
That message is normal for axes without feedback, not a problem.
·
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:FixedTime devAsynFloat64::processCallbackOutput process write error
I don’t know what is causing those errors. How have you changed motor.substitutions.xps5?
·
I also tried enabling the Aux configuration and still get the same kinds of errors:
·
2024/11/12 14:15:11.994 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
What version of the XPS is this, XPS-C8, XPS-Q8, or XPS-D8? As I recall the XPSAux code needs work to run on the XPS-D8.
·
The only output we use from the XPS controllers at the moment is the PCO, I don't know if this will affect our ability to use that or not. If not, I'm happy to just leave it
disabled/ignore it.
The XPSAux code is not needed for the PCO output, or the trigger pulse output from trajectory scans/profile moves. It is only needed for direct digital I/O and analog I/O.
Mark
Hi Mark,
Thanks for the quick response! Changing to the correct version of the config commands seems to have fixed most of the issues. There are still a few more things I'm not sure about. After configuring one of the axes I get the following
message. Should I be concerned? This motor doesn't have encoders, so my suspicion is it's about that:
XPSCreateAxis("XPS1",5,"Group6.Pos", "50")
2024/11/12 14:15:20.402 XPSAxis:getPID:. XPS XPS1 axis 5 corrector type is NoCorrector. Cannot get PID.
And on iocInit I get some errors about the profile:
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-03-01T16:24-0600
## Rev. Date build date/time:
############################################################################
drvStreamInit: Warning! STREAM_PROTOCOL_PATH not set.
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:FixedTime devAsynFloat64::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:Acceleration devAsynFloat64::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:TimeMode devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:MoveMode devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M1UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M2UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M3UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M4UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M5UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumAxes devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumPoints devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:StartPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:EndPulses devAsynInt32::processCallbackOutput process write error
Here's the full IOC startup in case it's useful:
(main) biocat@dalek:/opt/epics/epics_iocs/soft_iocs/newport_test/iocBoot/iocnewport_test$ ./st.cmd
#!../../bin/linux-x86_64/newport_test
#errlogInit(5000)
< envPaths
epicsEnvSet("IOC","iocnewport_test")
epicsEnvSet("TOP","/opt/epics/epics_iocs/soft_iocs/newport_test")
epicsEnvSet("SUPPORT","/opt/epics/synApps_6_3/support")
epicsEnvSet("EPICS_BASE","/opt/epics/base")
epicsEnvSet("ALIVE","/opt/epics/synApps_6_3/support/alive-R1-4-1")
epicsEnvSet("ASYN","/opt/epics/synApps_6_3/support/asyn-R4-44-2")
epicsEnvSet("AUTOSAVE","/opt/epics/synApps_6_3/support/autosave-R5-11")
epicsEnvSet("BUSY","/opt/epics/synApps_6_3/support/busy-R1-7-4")
epicsEnvSet("CALC","/opt/epics/synApps_6_3/support/calc-R3-7-5")
epicsEnvSet("CAMAC","/opt/epics/synApps_6_3/support/camac-R2-7-5")
epicsEnvSet("CAPUTRECORDER","/opt/epics/synApps_6_3/support/caputRecorder-R1-7-6")
epicsEnvSet("DAC128V","/opt/epics/synApps_6_3/support/dac128V-R2-10-1")
epicsEnvSet("DELAYGEN","/opt/epics/synApps_6_3/support/delaygen-R1-2-4")
epicsEnvSet("DEVIOCSTATS","/opt/epics/synApps_6_3/support/iocStats-3-1-16")
epicsEnvSet("ETHERIP","/opt/epics/synApps_6_3/support/ether_ip-ether_ip-3-3")
epicsEnvSet("GALIL","/opt/epics/synApps_6_3/support/Galil-4-0-02")
epicsEnvSet("IP","/opt/epics/synApps_6_3/support/ip-R2-22")
epicsEnvSet("IP330","/opt/epics/synApps_6_3/support/ip330-R2-10")
epicsEnvSet("IPAC","/opt/epics/synApps_6_3/support/ipac-2-16")
epicsEnvSet("IPUNIDIG","/opt/epics/synApps_6_3/support/ipUnidig-R2-12")
epicsEnvSet("LABJACK","/opt/epics/synApps_6_3/support/LabJack-master")
epicsEnvSet("LOVE","/opt/epics/synApps_6_3/support/love-R3-2-9")
epicsEnvSet("LUA","/opt/epics/synApps_6_3/support/lua-R3-1")
epicsEnvSet("MCA","/opt/epics/synApps_6_3/support/mca-R7-10")
epicsEnvSet("MEASCOMP","/opt/epics/synApps_6_3/support/measComp-master")
epicsEnvSet("MODBUS","/opt/epics/synApps_6_3/support/modbus-R3-3")
epicsEnvSet("MOTOR","/opt/epics/synApps_6_3/support/motor-R7-3-1")
epicsEnvSet("OPTICS","/opt/epics/synApps_6_3/support/optics-R2-14")
epicsEnvSet("SCALER","/opt/epics/synApps_6_3/support/scaler-4-1")
epicsEnvSet("SNCSEQ","/opt/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
epicsEnvSet("SOFTGLUE","/opt/epics/synApps_6_3/support/softGlue-R2-8-4")
epicsEnvSet("SOFTGLUEZYNQ","/opt/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
epicsEnvSet("SSCAN","/opt/epics/synApps_6_3/support/sscan-R2-11-6")
epicsEnvSet("STD","/opt/epics/synApps_6_3/support/std-R3-6-4")
epicsEnvSet("STREAM","/opt/epics/synApps_6_3/support/StreamDevice-2-8-24")
epicsEnvSet("VAC","/opt/epics/synApps_6_3/support/vac-R1-9-2")
epicsEnvSet("VME","/opt/epics/synApps_6_3/support/vme-R2-9-5")
epicsEnvSet("XXX","/opt/epics/synApps_6_3/support/xxx-R6-3")
epicsEnvSet("YOKOGAWA_DAS","/opt/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
epicsEnvSet("ALLENBRADLEY","/opt/epics/synApps_6_3/support/allenBradley-2-3")
epicsEnvSet("ULDAQ","/opt/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
# Tell EPICS all about the record types, device-support modules, drivers,
# etc. in this build from CARS
dbLoadDatabase("../../dbd/iocnewport_testLinux.dbd")
iocnewport_testLinux_registerRecordDeviceDriver(pdbbase)
### Motors
dbLoadTemplate "motor.substitutions.xps5"
#dbLoadTemplate "XPSAux.substitutions"
# asyn port, IP address, IP port, number of axes,
# active poll period (ms), idle poll period (ms),
# enable set position, set position settling time (ms)
XPSCreateController("XPS1", "164.54.204.74", 5001, 8, 10, 500, 0, 500)
#asynSetTraceIOMask("XPS1", 0, 2)
#asynSetTraceMask("XPS1", 0, 255)
# asynPort, IP address, IP port, poll period (ms)
#XPSAuxConfig("XPS_AUX1", "164.54.204.74", 5001, 50)
#asynSetTraceIOMask("XPS_AUX1", 0, 2)
#asynSetTraceMask("XPS_AUX1", 0, 255)
# XPS asyn port, axis, groupName.positionerName, stepSize
#XPSCreateAxis("XPS1",0,"GROUP.PHI", "1000")
# PR50PP
XPSCreateAxis("XPS1",5,"Group6.Pos", "50")
2024/11/12 14:15:20.402 XPSAxis:getPID:. XPS XPS1 axis 5 corrector type is NoCorrector. Cannot get PID.
# ILS50PP
XPSCreateAxis("XPS1",6,"Group7.Pos", "2000")
# ILS50PP
XPSCreateAxis("XPS1",7,"Group8.Pos", "5000")
# XPS asyn port, max points, FTP username, FTP password
# Note: this must be done after configuring axes
XPSCreateProfile("XPS1", 2000, "Administrator", "Administrator")
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-03-01T16:24-0600
## Rev. Date build date/time:
############################################################################
drvStreamInit: Warning! STREAM_PROTOCOL_PATH not set.
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:FixedTime devAsynFloat64::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:Acceleration devAsynFloat64::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:TimeMode devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:MoveMode devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M1UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M2UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M3UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M4UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:M5UseAxis devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumAxes devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumPoints devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:NumPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:StartPulses devAsynInt32::processCallbackOutput process write error
2024/11/12 14:15:20.944 18ID_D_Newport:Prof1:EndPulses devAsynInt32::processCallbackOutput process write error
iocRun: All initialization complete
I also tried enabling the Aux configuration and still get the same kinds of errors:
2024/11/12 14:15:11.994 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
2024/11/12 14:15:11.994 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 14:15:11.995 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 14:15:11.995 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 14:15:12.046 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
The only output we use from the XPS controllers at the moment is the PCO, I don't know if this will affect our ability to use that or not. If not, I'm happy to just leave it disabled/ignore it.
All the best.
- Jesse
----
Jesse Hopkins, PhD
Deputy Director
BioCAT, Sector 18
Advanced Photon Source
On Tue, Nov 12, 2024 at 1:59 PM Mark Rivers <rivers at cars.uchicago.edu> wrote:
Hi Jesse,
I suggest commenting out this line, at least to start:
XPSAuxConfig("XPS_AUX1", "164.54.204.74", 5001, 50)
That is used only for auxiliary analog and digital I/O, not for motor control. It is generating a lot of your error messages.
·
IOC:m6Offset devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_OFFSET
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m6Offset
IOC:m6Resolution devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_RESOLUTION
The above messages are because you are using the old Model 2 driver via the XPSConfig command. You should use the new Model 3 driver, which uses XPSCreateController. Look at st.cmd.xps5
for an example.
Mark
Hi folks,
I'm attempting to set up a Newport XPS-D8 using the motorNewport module, and having some trouble. Basically, the configuration seems to go fine, but as soon as I call iocInit I get a bunch of error messages. I suspect I'm not actually
configuring it correctly, there are ~5 XPS start.cmd files in the example IOC, and they're all a bit different, so I wasn't quite sure how to proceed there. Any help anyone can provide would be greatly appreciated!
For reference:
EPICS: 7.0.8
Motor: 7-3-1
Asyn: 4-44-2
motorNewport: 1-2-1
OS: Debian 12
XPS firmware: XPS-D-N13019
Here's an abbreviated output from trying to start the IOC.
biocat@dalek:/opt/epics/epics_iocs/soft_iocs/newport_test/iocBoot/iocnewport_test$ ./st.cmd
#!../../bin/linux-x86_64/newport_test
#errlogInit(5000)
< envPaths
epicsEnvSet("IOC","iocnewport_test")
epicsEnvSet("TOP","/opt/epics/epics_iocs/soft_iocs/newport_test")
epicsEnvSet("SUPPORT","/opt/epics/synApps_6_3/support")
epicsEnvSet("EPICS_BASE","/opt/epics/base")
epicsEnvSet("ALIVE","/opt/epics/synApps_6_3/support/alive-R1-4-1")
epicsEnvSet("ASYN","/opt/epics/synApps_6_3/support/asyn-R4-44-2")
epicsEnvSet("AUTOSAVE","/opt/epics/synApps_6_3/support/autosave-R5-11")
epicsEnvSet("BUSY","/opt/epics/synApps_6_3/support/busy-R1-7-4")
epicsEnvSet("CALC","/opt/epics/synApps_6_3/support/calc-R3-7-5")
epicsEnvSet("CAMAC","/opt/epics/synApps_6_3/support/camac-R2-7-5")
epicsEnvSet("CAPUTRECORDER","/opt/epics/synApps_6_3/support/caputRecorder-R1-7-6")
epicsEnvSet("DAC128V","/opt/epics/synApps_6_3/support/dac128V-R2-10-1")
epicsEnvSet("DELAYGEN","/opt/epics/synApps_6_3/support/delaygen-R1-2-4")
epicsEnvSet("DEVIOCSTATS","/opt/epics/synApps_6_3/support/iocStats-3-1-16")
epicsEnvSet("ETHERIP","/opt/epics/synApps_6_3/support/ether_ip-ether_ip-3-3")
epicsEnvSet("GALIL","/opt/epics/synApps_6_3/support/Galil-4-0-02")
epicsEnvSet("IP","/opt/epics/synApps_6_3/support/ip-R2-22")
epicsEnvSet("IP330","/opt/epics/synApps_6_3/support/ip330-R2-10")
epicsEnvSet("IPAC","/opt/epics/synApps_6_3/support/ipac-2-16")
epicsEnvSet("IPUNIDIG","/opt/epics/synApps_6_3/support/ipUnidig-R2-12")
epicsEnvSet("LABJACK","/opt/epics/synApps_6_3/support/LabJack-master")
epicsEnvSet("LOVE","/opt/epics/synApps_6_3/support/love-R3-2-9")
epicsEnvSet("LUA","/opt/epics/synApps_6_3/support/lua-R3-1")
epicsEnvSet("MCA","/opt/epics/synApps_6_3/support/mca-R7-10")
epicsEnvSet("MEASCOMP","/opt/epics/synApps_6_3/support/measComp-master")
epicsEnvSet("MODBUS","/opt/epics/synApps_6_3/support/modbus-R3-3")
epicsEnvSet("MOTOR","/opt/epics/synApps_6_3/support/motor-R7-3-1")
epicsEnvSet("OPTICS","/opt/epics/synApps_6_3/support/optics-R2-14")
epicsEnvSet("SCALER","/opt/epics/synApps_6_3/support/scaler-4-1")
epicsEnvSet("SNCSEQ","/opt/epics/synApps_6_3/support/sequencer-mirror-R2-2-9")
epicsEnvSet("SOFTGLUE","/opt/epics/synApps_6_3/support/softGlue-R2-8-4")
epicsEnvSet("SOFTGLUEZYNQ","/opt/epics/synApps_6_3/support/softGlueZynq-R2-0-5")
epicsEnvSet("SSCAN","/opt/epics/synApps_6_3/support/sscan-R2-11-6")
epicsEnvSet("STD","/opt/epics/synApps_6_3/support/std-R3-6-4")
epicsEnvSet("STREAM","/opt/epics/synApps_6_3/support/StreamDevice-2-8-24")
epicsEnvSet("VAC","/opt/epics/synApps_6_3/support/vac-R1-9-2")
epicsEnvSet("VME","/opt/epics/synApps_6_3/support/vme-R2-9-5")
epicsEnvSet("XXX","/opt/epics/synApps_6_3/support/xxx-R6-3")
epicsEnvSet("YOKOGAWA_DAS","/opt/epics/synApps_6_3/support/Yokogawa_DAS-R2-0-2")
epicsEnvSet("ALLENBRADLEY","/opt/epics/synApps_6_3/support/allenBradley-2-3")
epicsEnvSet("ULDAQ","/opt/epics/synApps_6_3/support/measComp-R4-2/libuldaq-1.2.1")
# Tell EPICS all about the record types, device-support modules, drivers,
# etc. in this build from CARS
dbLoadDatabase("../../dbd/iocnewport_testLinux.dbd")
iocnewport_testLinux_registerRecordDeviceDriver(pdbbase)
### Motors
dbLoadTemplate "motor.substitutions.xps3"
dbLoadTemplate "XPSAux.substitutions"
# asyn port, IP address, IP port, number of axes, active poll period (ms), idle poll period (ms)
#XPSConfig("XPS1", "164.54.204.74", 5001, 8, 20, 500)
# asynPort, IP address, IP port, poll period (ms)
#XPSAuxConfig("XPS_AUX1", "164.54.204.74", 5001, 50)
#asynSetTraceMask("XPS_AUX1", 0, 255)
#asynSetTraceIOMask("XPS_AUX1", 0, 2)
##### Maybe this
# cards (total controllers)
XPSSetup(1)
# card, IP, PORT, number of axes, active poll period (ms), idle poll period (ms)
XPSConfig(0, "164.54.204.74", 5001, 8, 10, 5000)
# asynPort, IP address, IP port, poll period (ms)
XPSAuxConfig("XPS_AUX1", "164.54.204.74", 5001, 50)
#asynSetTraceMask("XPS_AUX1", 0, 255)
#asynSetTraceIOMask("XPS_AUX1", 0, 2)
# asyn port, driver name, controller index, max. axes)
drvAsynMotorConfigure("XPS1", "motorXPS", 0, 8)
XPSInterpose("XPS1")
# card, axis, groupName.positionerName, stepSize
# PR50PP
XPSConfigAxis(0,5,"Group6.Pos", 50)
# ILS50PP
XPSConfigAxis(0,6,"Group7.Pos", 2000)
# ILS50PP
XPSConfigAxis(0,7,"Group8.Pos", 5000)
#XPSEnableSetPosition(XPS1, 0)
#XPSSetPositionSettlingTime(XPS1, 200)
#dbLoadRecords("$(MOTOR)/motorApp/Db/trajectoryScan.db", "P=IOC:,R=traj1,NAXES=2,NELM=2000,NPULSE=2000,DONPV=13LAB:str:EraseStart,DONV=1,DOFFPV=13LAB:str:StopAll,DOFFV=1")
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.8
## Rev. 2024-03-01T16:24-0600
## Rev. Date build date/time:
############################################################################
drvStreamInit: Warning! STREAM_PROTOCOL_PATH not set.
IOC:m6Offset devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_OFFSET
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m6Offset
IOC:m6Resolution devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_RESOLUTION
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m6Resolution
IOC:m7Offset devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_OFFSET
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m7Offset
IOC:m7Resolution devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_RESOLUTION
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m7Resolution
IOC:m8Offset devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_OFFSET
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m8Offset
IOC:m8Resolution devAsynFloat64::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_RESOLUTION
recGblRecordError: ao: init_record Error (514,11) PV: IOC:m8Resolution
IOC:m6Direction devAsynInt32::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_DIRECTION
IOC:m7Direction devAsynInt32::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_DIRECTION
IOC:m8Direction devAsynInt32::initCommon drvUserCreate drvmotorAsyn::drvUserCreate, unknown command=MOTOR_REC_DIRECTION
2024/11/12 13:27:13.484 motorAxisSetDouble: XPS does not support setting encoder ratio
2024/11/12 13:27:13.484 devMotorAsyn::init_controller, IOC:m6 failed to set encoder ratio to inf
2024/11/12 13:27:13.486 motorAxisSetDouble: XPS does not support setting encoder ratio
2024/11/12 13:27:13.486 devMotorAsyn::init_controller, IOC:m7 failed to set encoder ratio to inf
2024/11/12 13:27:13.487 motorAxisSetDouble: XPS does not support setting encoder ratio
2024/11/12 13:27:13.487 devMotorAsyn::init_controller, IOC:m8 failed to set encoder ratio to inf
2024/11/12 13:27:13.501 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
...
2024/11/12 13:27:13.942 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 13:27:13.991 IOC:XPSAux1Bi0 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.992 IOC:XPSAux1Bi1 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.992 IOC:XPSAux1Bi2 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.993 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
2024/11/12 13:27:13.993 IOC:XPSAux1Bi3 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.994 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 13:27:13.994 IOC:XPSAux1Bi4 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.995 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 13:27:13.995 IOC:XPSAux1Bi5 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.996 IOC:XPSAux1Bi6 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.996 drvXPSAsynAux::XPSAuxPoller error calling GPIODigitalGet=-8
2024/11/12 13:27:13.997 IOC:XPSAux1Bi7 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.997 IOC:XPSAux2Bi0 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.998 IOC:XPSAux2Bi1 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.998 IOC:XPSAux2Bi2 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:13.999 IOC:XPSAux2Bi3 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.008 IOC:XPSAux2Bi4 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.009 IOC:XPSAux2Bi5 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.012 IOC:XPSAux4Bi0 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.012 IOC:XPSAux4Bi1 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.012 IOC:XPSAux4Bi2 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.013 IOC:XPSAux4Bi3 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.013 IOC:XPSAux4Bi4 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.014 IOC:XPSAux4Bi5 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.014 IOC:XPSAux4Bi6 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.015 IOC:XPSAux4Bi7 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.015 IOC:XPSAux4Bi8 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.015 IOC:XPSAux4Bi9 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.017 IOC:XPSAux4Bi10 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.024 IOC:XPSAux4Bi11 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.025 IOC:XPSAux4Bi12 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.025 IOC:XPSAux4Bi13 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.026 IOC:XPSAux4Bi14 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.026 IOC:XPSAux4Bi15 devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.026 IOC:XPSAux1Li devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.027 IOC:XPSAux2Li devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
2024/11/12 13:27:14.028 IOC:XPSAux4Li devAsynUInt32Digital::processCallbackInput process read error drvXPSAsynAux::readUInt32D error calling GPIODigitalGet=-8
iocRun: All initialization complete
# This IOC does not use save/restore, so set values of some PVs
#dbpf("IOC:m1.RTRY", "0")
#dbpf("IOC:m1.TWV", "0.1")
#dbpf("IOC:m2.RTRY", "0")
#dbpf("IOC:m2.TWV", "0.1")
#dbpf("IOC:m3.RTRY", "0")
#dbpf("IOC:m3.TWV", "0.1")
#dbpf("IOC:m4.RTRY", "0")
#dbpf("IOC:m4.TWV", "0.1")
#dbpf("IOC:m5.RTRY", "0")
#dbpf("IOC:m5.TWV", "0.1")
dbpf("IOC:m6.RTRY", "0")
DBF_SHORT: 0 = 0x0
dbpf("IOC:m6.TWV", "0.1")
DBF_DOUBLE: 0.1
dbpf("IOC:m7.RTRY", "0")
DBF_SHORT: 0 = 0x0
dbpf("IOC:m7.TWV", "0.1")
DBF_DOUBLE: 0.1
dbpf("IOC:m8.RTRY", "0")
DBF_SHORT: 0 = 0x0
dbpf("IOC:m8.TWV", "0.1")
DBF_DOUBLE: 0.1
2024/11/12 13:27:14.047 drvXPSAsynAux::XPSAuxPoller error calling GPIOAnalogGet=-8
...
Here's the contents of my motor.substitutions file:
file "$(MOTOR)/db/basic_asyn_motor.db"
{
pattern
{P, N, M, DTYP, PORT, ADDR, DESC, EGU, DIR, VELO, VBAS, ACCL, BDST, BVEL, BACC, MRES, PREC, DHLM, DLLM, INIT}
{IOC:, 6, "m$(N)", "asynMotor", XPS1, 5, "size Rot", deg, Pos, 20., 0, 0.25, 0, 1, .2, 0.02, 2, 1000000.0, -1000000.0, ""}
{IOC:, 7, "m$(N)", "asynMotor", XPS1, 6, "size X", mm, Pos, 50., 0, 0.25, 0, 1, .2, 0.0005, 4, 25.0, -25.0, ""}
{IOC:, 8, "m$(N)", "asynMotor", XPS1, 7, "size Y", mm, Pos, 50., 0, 0.25, 0, 1, .2, 0.0005, 4, 25.0, -25.0, ""}
}
file "$(MOTOR)/db/XPS_extra.db"
{
pattern
{P, R, PORT, ADDR}
{IOC:, m6, XPS1, 5}
{IOC:, m7, XPS1 6}
{IOC:, m8, XPS1 7}
}
Here's the contents of my XPSAux.substitions file:
file "$(MOTOR)/db/XPSAuxLi.db"
{
pattern
{P, R, PORT, CHAN, SCAN}
{IOC:, XPSAux1Li, XPS_AUX1, 0, "I/O Intr"}
{IOC:, XPSAux2Li, XPS_AUX1, 1, "I/O Intr"}
{IOC:, XPSAux3Li, XPS_AUX1, 2, "I/O Intr"}
{IOC:, XPSAux4Li, XPS_AUX1, 3, "I/O Intr"}
}
file "$(MOTOR)/db/XPSAuxBi.db"
{
pattern
{P, R, PORT, CHAN, MASK, SCAN}
{IOC:, XPSAux1Bi0, XPS_AUX1, 0, 0x000001, "I/O Intr"}
{IOC:, XPSAux1Bi1, XPS_AUX1, 0, 0x000002, "I/O Intr"}
{IOC:, XPSAux1Bi2, XPS_AUX1, 0, 0x000004, "I/O Intr"}
{IOC:, XPSAux1Bi3, XPS_AUX1, 0, 0x000008, "I/O Intr"}
{IOC:, XPSAux1Bi4, XPS_AUX1, 0, 0x000010, "I/O Intr"}
{IOC:, XPSAux1Bi5, XPS_AUX1, 0, 0x000020, "I/O Intr"}
{IOC:, XPSAux1Bi6, XPS_AUX1, 0, 0x000040, "I/O Intr"}
{IOC:, XPSAux1Bi7, XPS_AUX1, 0, 0x000080, "I/O Intr"}
{IOC:, XPSAux2Bi0, XPS_AUX1, 1, 0x000001, "I/O Intr"}
{IOC:, XPSAux2Bi1, XPS_AUX1, 1, 0x000002, "I/O Intr"}
{IOC:, XPSAux2Bi2, XPS_AUX1, 1, 0x000004, "I/O Intr"}
{IOC:, XPSAux2Bi3, XPS_AUX1, 1, 0x000008, "I/O Intr"}
{IOC:, XPSAux2Bi4, XPS_AUX1, 1, 0x000010, "I/O Intr"}
{IOC:, XPSAux2Bi5, XPS_AUX1, 1, 0x000020, "I/O Intr"}
{IOC:, XPSAux3Bi0, XPS_AUX1, 2, 0x000001, "I/O Intr"}
{IOC:, XPSAux3Bi1, XPS_AUX1, 2, 0x000002, "I/O Intr"}
{IOC:, XPSAux3Bi2, XPS_AUX1, 2, 0x000004, "I/O Intr"}
{IOC:, XPSAux3Bi3, XPS_AUX1, 2, 0x000008, "I/O Intr"}
{IOC:, XPSAux3Bi4, XPS_AUX1, 2, 0x000010, "I/O Intr"}
{IOC:, XPSAux3Bi5, XPS_AUX1, 2, 0x000020, "I/O Intr"}
{IOC:, XPSAux4Bi0, XPS_AUX1, 3, 0x000001, "I/O Intr"}
{IOC:, XPSAux4Bi1, XPS_AUX1, 3, 0x000002, "I/O Intr"}
{IOC:, XPSAux4Bi2, XPS_AUX1, 3, 0x000004, "I/O Intr"}
{IOC:, XPSAux4Bi3, XPS_AUX1, 3, 0x000008, "I/O Intr"}
{IOC:, XPSAux4Bi4, XPS_AUX1, 3, 0x000010, "I/O Intr"}
{IOC:, XPSAux4Bi5, XPS_AUX1, 3, 0x000020, "I/O Intr"}
{IOC:, XPSAux4Bi6, XPS_AUX1, 3, 0x000040, "I/O Intr"}
{IOC:, XPSAux4Bi7, XPS_AUX1, 3, 0x000080, "I/O Intr"}
{IOC:, XPSAux4Bi8, XPS_AUX1, 3, 0x000100, "I/O Intr"}
{IOC:, XPSAux4Bi9, XPS_AUX1, 3, 0x000200, "I/O Intr"}
{IOC:, XPSAux4Bi10, XPS_AUX1, 3, 0x000400, "I/O Intr"}
{IOC:, XPSAux4Bi11, XPS_AUX1, 3, 0x000800, "I/O Intr"}
{IOC:, XPSAux4Bi12, XPS_AUX1, 3, 0x001000, "I/O Intr"}
{IOC:, XPSAux4Bi13, XPS_AUX1, 3, 0x002000, "I/O Intr"}
{IOC:, XPSAux4Bi14, XPS_AUX1, 3, 0x004000, "I/O Intr"}
{IOC:, XPSAux4Bi15, XPS_AUX1, 3, 0x008000, "I/O Intr"}
}
file "$(MOTOR)/db/XPSAuxBo.db"
{
pattern
{P, R, PORT, CHAN, MASK}
{IOC:, XPSAux1Bo0, XPS_AUX1, 0, 0x000001}
{IOC:, XPSAux1Bo1, XPS_AUX1, 0, 0x000002}
{IOC:, XPSAux1Bo2, XPS_AUX1, 0, 0x000004}
{IOC:, XPSAux1Bo3, XPS_AUX1, 0, 0x000008}
{IOC:, XPSAux1Bo4, XPS_AUX1, 0, 0x000010}
{IOC:, XPSAux1Bo5, XPS_AUX1, 0, 0x000020}
{IOC:, XPSAux1Bo6, XPS_AUX1, 0, 0x000040}
{IOC:, XPSAux1Bo7, XPS_AUX1, 0, 0x000080}
{IOC:, XPSAux3Bo0, XPS_AUX1, 1, 0x000001}
{IOC:, XPSAux3Bo1, XPS_AUX1, 1, 0x000002}
{IOC:, XPSAux3Bo2, XPS_AUX1, 1, 0x000004}
{IOC:, XPSAux3Bo3, XPS_AUX1, 1, 0x000008}
{IOC:, XPSAux3Bo4, XPS_AUX1, 1, 0x000010}
{IOC:, XPSAux3Bo5, XPS_AUX1, 1, 0x000020}
{IOC:, XPSAux4Bo0, XPS_AUX1, 2, 0x000001}
{IOC:, XPSAux4Bo1, XPS_AUX1, 2, 0x000002}
{IOC:, XPSAux4Bo2, XPS_AUX1, 2, 0x000004}
{IOC:, XPSAux4Bo3, XPS_AUX1, 2, 0x000008}
{IOC:, XPSAux4Bo4, XPS_AUX1, 2, 0x000010}
{IOC:, XPSAux4Bo5, XPS_AUX1, 2, 0x000020}
{IOC:, XPSAux4Bo6, XPS_AUX1, 2, 0x000040}
{IOC:, XPSAux4Bo7, XPS_AUX1, 2, 0x000080}
{IOC:, XPSAux4Bo8, XPS_AUX1, 2, 0x000100}
{IOC:, XPSAux4Bo9, XPS_AUX1, 2, 0x000200}
{IOC:, XPSAux4Bo10, XPS_AUX1, 2, 0x000400}
{IOC:, XPSAux4Bo11, XPS_AUX1, 2, 0x000800}
{IOC:, XPSAux4Bo12, XPS_AUX1, 2, 0x001000}
{IOC:, XPSAux4Bo13, XPS_AUX1, 2, 0x002000}
{IOC:, XPSAux4Bo14, XPS_AUX1, 2, 0x004000}
{IOC:, XPSAux4Bo15, XPS_AUX1, 2, 0x008000}
}
file "$(MOTOR)/db/XPSAuxLo.db"
{
pattern
{P, R, PORT, CHAN}
{IOC:, XPSAux1Lo, XPS_AUX1, 0}
{IOC:, XPSAux3Lo, XPS_AUX1, 1}
{IOC:, XPSAux4Lo, XPS_AUX1, 2}
}
file "$(MOTOR)/db/XPSAuxAi.db"
{
pattern
{P, R, PORT, CHAN, LOPR, HOPR, PREC, SCAN}
{IOC:, XPSAuxAi0, XPS_AUX1, 0, -10.0, 10.0, 4, "1 second"}
{IOC:, XPSAuxAi1, XPS_AUX1, 1, -10.0, 10.0, 4, "1 second"}
{IOC:, XPSAuxAi2, XPS_AUX1, 2, -10.0, 10.0, 4, "1 second"}
{IOC:, XPSAuxAi3, XPS_AUX1, 3, -10.0, 10.0, 4, "1 second"}
}
file "$(MOTOR)/db/XPSAuxAo.db"
{
pattern
{P, R, PORT, CHAN, DRVL, LOPR, DRVH, HOPR, PREC}
{IOC:, XPSAuxAo0, XPS_AUX1, 0, -10.0, -10.0, 10.0, 10.0, 4}
{IOC:, XPSAuxAo1, XPS_AUX1, 1, -10.0, -10.0, 10.0, 10.0, 4}
{IOC:, XPSAuxAo2, XPS_AUX1, 2, -10.0, -10.0, 10.0, 10.0, 4}
{IOC:, XPSAuxAo3, XPS_AUX1, 3, -10.0, -10.0, 10.0, 10.0 4}
}
All the best.
- Jesse
----
Jesse Hopkins, PhD
Deputy Director
BioCAT, Sector 18
Advanced Photon Source
|