1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 <2013> 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 <2013> 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | RE: Newport XPS-Q8 and Motor Record - RV120HAHL stage |
From: | Mark Rivers <[email protected]> |
To: | "'Tonia Batten'" <[email protected]>, "[email protected]" <[email protected]> |
Date: | Fri, 1 Nov 2013 21:53:14 +0000 |
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 From: [email protected] [mailto:[email protected]]
On Behalf Of Tonia Batten 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 |