Hi Tonia,
It looks to me like the conversion from steps to XPS engineering units may be incorrect. The steps per unit you are passing in XPSConfigAxis looks OK, since it is 10000, which is the reciprocal of MRES (0.0001). The driver converts “steps
per units” to “stepSize” = 1./”steps per unit”, and it multiplies all velocity and position values from the motor record by this value.
You can determine what value of stepSize the driver is acutall using by typing the following command:
asynReport 10 XPS1
You can also get more complete debugging output by changing this line:
asynSetTraceMask("XPS1",0,0x9)
to this:
asynSetTraceMask("XPS1",0,0xFF)
That should enable this output in motorAxisMove:
PRINT(pAxis->logParam, FLOW, "Set card %d, axis %d move to %f, min vel=%f, max_vel=%f, accel=%f\n",
pAxis->card, pAxis->axis, position, min_velocity, max_velocity, acceleration);
That will show you the target position (in “steps”) and velocity (in “steps” per second) the motor record is requesting.
motorAxisMove then sets the velocity and acceleration as follows:
status = PositionerSGammaParametersSet(pAxis->pollSocket,
pAxis->positionerName,
max_velocity*pAxis->stepSize,
acceleration*pAxis->stepSize,
pAxis->minJerkTime,
pAxis->maxJerkTime);
It then moves the motor as follows:
deviceUnits = position * pAxis->stepSize;
..
status = GroupMoveAbsolute(pAxis->moveSocket,
pAxis->positionerName,
1,
&deviceUnits);
Cheers,
Mark
Good Afternoon,
I am using EPICS R3.14.12, MOTOR 6-5 and ASYN 4-13 with a Newport XPS-Q8 controller with an XPS-DRV03 card to try and move a RV120HAHL stage. Because the RV120HAHL stage is not supported by the Newport Controller I have
configured the RV120CCHL and adjusted the following parameters and then auto tuned the configuration for the stage.
EncoderResolution = 0.0001 ;--- units
MaximumVelocity = 8 ;--- units / s
MaximumAcceleration = 32 ;--- units / s²
HomeSearchMaximumVelocity = 4 ;--- units / s
HomeSearchMaximumAcceleration = 16 ;--- units / s²
MinimumTargetPosition=1;--- units
MaximumTargetPosition=59;--- units
HomePreset=6;--- units
Here is the information from the .ini file for the stage I have configured.
;RV@RV160CCHL@XPS-DRV03
;--- Unit = deg
;--- Configuration_Comment =
;--- Smart stage name
SmartStageName=
;--- Motor driver model parameters
DriverName=XPS-DRV03
DriverMaximumRMSCurrent=1.98;--- A
DriverRMSIntegrationTime=3;--- s
;--- Driver command interface parameters
MotorDriverInterface=AnalogVoltage
ScalingCurrent=5;--- A
CurrentLimit=3.96;--- A
ScalingVoltage=48;--- V
VoltageLimit=45.56;--- V
;--- Position encoder interface parameters
EncoderType=AquadB
EncoderResolution=0.0001;--- units
LinearEncoderCorrection=0;--- ppm
Backlash=0;--- units
CurrentVelocityCutOffFrequency=100;--- Hz
CurrentAccelerationCutOffFrequency=100;--- Hz
PositionerMappingFileName=
PositionerMappingLineNumber=
PositionerMappingMaxPositionError=;--- units
EncoderIndexOffset=0;--- units
;--- Limit sensor input plug parameters
ServitudesType=StandardEORDriverPlug
MinimumTargetPosition=1;--- units
MaximumTargetPosition=59;--- units
HomePreset=6;--- units
MaximumVelocity=8;--- units / s
MaximumAcceleration=32;--- units / s2
EmergencyDecelerationMultiplier=4
MinimumJerkTime=0.005;--- s
MaximumJerkTime=0.05;--- s
TrackingCutOffFrequency=25;--- Hz
;--- Home search process parameters
HomeSearchSequenceType=MechanicalZeroAndIndexHomeSearch
HomeSearchMaximumVelocity=4;--- units / s
HomeSearchMaximumAcceleration=16;--- units / s2
HomeSearchTimeOut=86;--- s
HomingSensorOffset=0;--- units
;--- Position servo loop type parameters
CorrectorType=PIDDualFFVoltage
ClosedLoopStatus=Closed
FatalFollowingError=1;--- units
KP=36
KI=650
KD=0.279
KS=0.8
GKP=0
GKD=0
GKI=0
KForm=0;--- units
IntegrationTime=1E+99;--- s
DerivativeFilterCutOffFrequency=4000;--- Hz
DeadBandThreshold=0;--- units
KFeedForwardVelocity=1.815
KFeedForwardAcceleration=0.0010378
KFeedForwardVelocityOpenLoop=1.815
Friction=0;--- V
NotchFrequency1=0;--- Hz
NotchBandwidth1=0;--- Hz
NotchGain1=0
NotchFrequency2=0;--- Hz
NotchBandwidth2=0;--- Hz
NotchGain2=0
;--- Motion done condition mode parameters
MotionDoneMode=Theoretical
After rebooting the controller I am able to successfully use the Newport web interface to initialize, home and move the stage. However when I try and move the stage with the Motor record I am seeing strange behaviour.
Here is my st.cmd file.
#!./bin/linux-armv5teb/ideasMonoMtr
## You may have to change ideasMonoMtr to something else
## everywhere it appears in this file
#< envPaths
## Register all support components
dbLoadDatabase("./dbd/ideasMonoMtr.dbd",0,0)
ideasMonoMtr_registerRecordDeviceDriver(pdbbase)
## Load record instances
dbLoadRecords("./db/IDEAS_MonoMtr.db")
dbLoadRecords("./db/IDEAS_MonoPseudoMtr.db")
dbLoadRecords("$(MOTOR)/db/motorUtil.db", "P=SMTR1608-9-B20-05:")
# cards (total controllers)
XPSSetup(1)
# card, IP, PORT, number of axes, active poll period (ms), idle poll period (ms)
XPSConfig(0, "192.168.0.254", 5001, 1, 10, 5000)
# asyn port, driverType, box number, number of axes)
drvAsynMotorConfigure("XPS1", "motorXPS", 0, 1)
XPSInterpose("XPS1")
# Turns off the ability of the motor record to change an actuator's position without moving it.
XPSEnableSetPosition(0)
# card, axis, postioner name, steps per unit
XPSConfigAxis(0,0,"S.Pos",10000)
asynSetTraceMask("XPS1",0,0x9)
#asynSetTraceMask("XPS1",0,255)
asynSetTraceIOMask("XPS1",0,0x2)
#asynSetTraceIOMask("XPS1",0,2)
iocInit()
Here is how my motor record and the XPS_extra records are defined. In addition I have some additional PV’s defined to calculate the ultimate position of the motor.
record(motor,"SMTR1608-9-B20-05:brag")
{
field(DESC,"Mono Brag")
field(DTYP,"asynMotor")
field(DIR,"Pos")
field(VELO,"1")
field(VBAS,".1")
field(ACCL,".2")
field(BDST,"0")
field(BVEL,"1")
field(BACC,".2")
field(OUT,"@asyn(XPS1,0)")
field(MRES,"0.0001")
field(PREC,"5")
field(EGU,"degrees")
field(DHLM,"59")
field(DLLM,"1")
field(INIT,"")
field(RTRY,"0")
field(TWV,"1")
}
# Database for Newport XPS
grecord(ao,"SMTR1608-9-B20-05:brag:MIN_JERK_TIME") {
field(DESC,"Min jerk time")
field(PREC,"3")
field(VAL,".01")
field(DTYP, "asynFloat64")
field(OUT,"@asyn(XPS1,0)MIN_JERK_TIME")
}
grecord(ao,"SMTR1608-9-B20-05:brag:MAX_JERK_TIME") {
field(DESC,"Max jerk time")
field(PREC,"3")
field(VAL,".03")
field(DTYP, "asynFloat64")
field(OUT,"@asyn(XPS1,0)MAX_JERK_TIME")
}
grecord(ai,"SMTR1608-9-B20-05:brag:READBACK") {
field(DESC,"Readback")
field(PREC,"4")
field(PINI, "1")
field(DTYP, "asynFloat64")
field(SCAN, "I/O Intr")
field(INP,"@asyn(XPS1,0)MOTOR_POSITION")
}
grecord(ai,"SMTR1608-9-B20-05:brag:XPS_STATUS") {
field(DESC,"XPS Group Status")
field(DTYP, "asynInt32")
field(PINI, "1")
field(PREC,"0")
field(SCAN, "I/O Intr")
field(INP,"@asyn(XPS1,0)XPS_STATUS")
}
I did an asyn trace and after starting up the motor records appears to be passing in the wrong values for the limits.
2013/11/01 14:03:31.880 motorAxisSetDouble[0,0]: error performing PositionerUserTravelLimitsSet for high limit=0.000000, status=-17
2013/11/01 14:03:31.888 drvMotorAsyn::writeFloat64, reason=4, value=0.000000
2013/11/01 14:03:31.895 devMotorAsyn::asynCallback: SMTR1608-9-B20-05:brag pasyn{Float64,Int32}->write returned
2013/11/01 14:03:31.904 motorAxisSetDouble[0,0]: error performing PositionerUserTravelLimitsSet for low limit=0.000000, status=-17
Upon initialization I am pushing in a movement from the home position of 6.000 to 8.54439294393059, however the motor is passing in a value below the low limit for an absolute move and is therefore not moving.
2013/11/01 14:03:36.041 SendAndReceive unexpected response =-17,GroupMoveAbsolute (S.Pos,1.398175069718e-312),EndOfAPI
epics> dbpr SMTR1608-9-B20-05:brag 10
ACCL: 0.2 ACKS: NO_ALARM ACKT: YES ADEL: 0
ALST: 0 ASG: ASP: (nil) ATHM: 0
BACC: 0.2 BDST: 0 BKPT: 00 BVEL: 1
CARD: -1 CBAK: 0xa0db8 CDIR: 1 CNEN: Disable
DCOF: 0 DESC: Mono Brag DHLM: 59
DIFF: 2.54329294393059 DINP:CONSTANT DIR: Pos
DISA: 0 DISP: 0 DISS: NO_ALARM DISV: 1
DLLM: 1 DLY: 0 DMOV: 1 DOL:CONSTANT
DPVT: 0xa0dd0 DRBV: 6.0011 DSET: 0x40109680 DTYP: asynMotor
DVAL: 8.54439294393059 EGU: degrees ERES: 1.0e-04
EVNT: 0 FLNK:CONSTANT 0 FOF: 0 FOFF: Variable
FRAC: 1 HHSV: NO_ALARM HIGH: 0 HIHI: 0
HLM: 59 HLS: 0 HLSV: NO_ALARM HOMF: 0
HOMR: 0 HOPR: 0 HSV: NO_ALARM HVEL: 0.1
ICOF: 0 INIT: JAR: 5 JOGF: 0
JOGR: 0 JVEL: 1 LCNT: 0
LDVL: 8.54439294393059 LLM: 1 LLS: 0
LLSV: NO_ALARM LOCK: NO LOLO: 0 LOPR: 0
LOW: 0 LRLV: 0 LRVL: 85444 LSET: 0xa18f8
LSPG: Go LSV: NO_ALARM LVAL: 8.54439294393059
LVIO: 0 MDEL: 0 MIP: 0 MISS: 0
MLIS: 00 0d 84 38 00 0d 82 f8 00 00 00 04 MLOK: 00 09 e1 10
MLST: 0 MMAP: 0 MOVN: 0 MRES: 1.0e-04
MSTA: 2050 NAME: SMTR1608-9-B20-05:brag NMAP: 0
NSEV: NO_ALARM NSTA: NO_ALARM NTM: YES NTMF: 2
OFF: 0 OMSL: supervisory OUT:INST_IO @asyn(XPS1,0)
PACT: 0 PCOF: 0 PHAS: 0 PINI: NO
POST: PP: 0 PPN: (nil) PPNR: (nil)
PREC: 5 PREM: PRIO: LOW PROC: 0
PUTF: 0 RBV: 6.0011 RCNT: 0 RDBD: 1.0e-04
RDBL:CONSTANT RDES: 0x651d0 RDIF: 25433 REP: 60011
RHLS: 0 RINP:CONSTANT RLLS: 0 RLNK:CONSTANT
RLV: 0 RMOD: Default RMP: 60011 RPRO: 0
RRBV: 60011 RRES: 0 RSET: 0x40109488 RTRY: 0
RVAL: 85444 RVEL: 0 S: 50 SBAK: 50
SBAS: 5 SCAN: Passive SDIS:CONSTANT SET: Use
SEVR: NO_ALARM SMAX: 0 SPMG: Go SPVT: (nil)
SREV: 200 SSET: 0 STAT: NO_ALARM STOO:CONSTANT
STOP: 0 STUP: OFF SUSE: 0 SYNC: 0
TDIR: 0 TIME: 2013-11-01 14:04:06.363958000 TPRO: 0
TSE: 0 TSEL:CONSTANT TWF: 0 TWR: 0
TWV: 1 UDF: 0 UEIP: No UREV: 0.02
URIP: No VAL: 8.54439294393059 VBAS: 0.1
VELO: 1 VERS: 6.5 VMAX: 0 VOF: 0
What is even stranger is that the velocity and acceleration are then set to values much smaller than then should be (e-312)
I am sure I must have something configured incorrectly. At this point it appears that the problem is associated with something configured incorrectly with the motor record. I would greatly appreciate any feedback or
insight anyone can provide.
Thanks,
Tonia Batten, P.Eng
Control System Analyst
Canadian Light Source
44 Innovation Blvd.
Saskatoon, SK S7N 2V3
Tel: 306-657-3865
Email: [email protected]