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]