#/ Controller version = 5.00 #/ Date = 08/08/2006 17:03 #/ User remarks = #0 ! X-AXIS ! Ibex dual rotary stage, 4xHR2 Nanomotiion motors per axis, AB5 amplifier, firmware 3.2 ! Renishaw encoders, 20 micron pitch, X2000 interpolator, 1 count = 10 nm, 15 counts = 1 micro-radian ! ACS-Tech80 SpiPlus PCI-4 controller, firmware 5.0 !Note: Set dcEnable flag in AUTOEXEC routine to select AB2 or AB5 amplifier !Note: VEL and ACC are commented out for the AC mode as they are set from EPICS MEDM screens. !Note: VEL and ACC are DEFINED for the DC mode as they are not defined from EPICS MEDM screens !ACC is defined in the homing routines as they are defined from EPICS during Homing but VEL is defined. GLOBAL acpar(8) GLOBAL dcpar(8) GLOBAL dcEnable(8) GLOBAL INT home_F(8) GLOBAL INT home_R(8) GLOBAL target_pos(8) GLOBAL jog_vel(8) GLOBAL Done(8) GLOBAL opReq(8) ! Each AXIS has a copy of these functions in a corresponding buffer LOCAL Axis LOCAL Buffer IF opReq(Axis) = 1 call ABS_MOVE ELSEIF opReq(Axis) = 2 call REL_MOVE ELSEIF opReq(Axis) = 3 call JOG_MOVE ELSEIF opReq(Axis) = 4 call HOME_F ELSEIF opReq(Axis) = 5 call HOME_R END opReq(Axis) = 0; Done(Axis) = 1 STOP !Powerup Routine AUTOEXEC: !Buffer = sysinfo(3) Buffer = 0 Axis = Buffer ! Set AC/DC Switching Amplifier (AB2) enable flag ! Enable = 1, Disable = 0 dcEnable(Axis) = 0 DISP "Buffer 0: Axis:", Axis ! Set all axis configuration parmeters call AXIS_CFG acpar(Axis)=1; TILL acpar(Axis)=0 if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 else acpar(Axis)=1; TILL acpar(Axis)=0 end STOP !THESE PROGRAMS ARE SMALL ROUTINES THAT ARE REQUIRED FOR CO-ORDINATING MOVEMENT WITH EPICS. THIS IS ESPECIALLY NEEDED !BECAUSE OF THE AC AND DC MODE SWITCHING NEEDED for AB2 amplifier BEFORE AND AFTER EVERY MOVE. !Written by Joe Sullivan (BCDA) and Suresh (8-ID) (March 2006) ABS_MOVE: ! Switch to AC(Servo) Mode acpar(Axis)=1; TILL acpar(Axis)=0 PTP(Axis),target_pos(Axis) TILL ^MST(Axis).#MOVE ! Switch to DC(Position) Mode if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end RET REL_MOVE: acpar(Axis)=1; TILL acpar(Axis)=0 PTP/r(Axis),target_pos(Axis) TILL ^MST(Axis).#MOVE if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end RET JOG_MOVE: acpar(Axis)=1; TILL acpar(Axis)=0 JOG/v(Axis),jog_vel(Axis) TILL ^MST(Axis).#MOVE if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end RET !These program are for homing X and was written by Aaron Dietrich, ACS-Tech80 and modified by Suresh, 8-ID (March 2006) !EPICS calls these routines when you Home from the MEDM screen. !HOME_R homes in the -ve direction and HOME_F homes in the +ve direction !If you desire to home in the same direction due to constraints, change the last 2 lines !in this program accordingly. !Note: this program is written for AB2 amplifier. If using with AB5, comment out acpar and dcpar lines !and rest should be fine. HOME_R: ! Load tuned parameters for AC mode for AB2 Amplifier !disable this when using AB5 amplifier acpar(Axis)=1; TILL acpar(Axis)=0 DISP "Homing in negative direction is in PROGRESS ......" ENABLE (Axis) FDEF(Axis).#CL = 0 !disable default response of Current Limit fault FDEF(Axis).#CPE = 0 !disable default response of Critical Postion Error fault FDEF(Axis).#SRL = 0 !disable default response of Software Right Limit fault FDEF(Axis).#SLL = 0 !disable default response of Software Left Limit fault JOG (Axis), - TILL (ABS(PE(Axis))>10000) JOG (Axis), + IST(Axis).#IND = 0 !enables the index capture TILL IST(Axis).#IND = 1 !wait till index capture happens KILL (Axis) SET FPOS(Axis)=FPOS(Axis)-IND(Axis) !this sets index position as 0 reference point PTP (Axis), 0 TILL ^MST(Axis).#MOVE FDEF(Axis).#CL = 1 !re-enable default response of Current Limit fault FDEF(Axis).#CPE = 1 !re-enable default response of Critical Postion Error fault FDEF(Axis).#SRL = 1 !re-enable default response of Software Right Limit fault FDEF(Axis).#SLL = 1 !re-enable default response of Software Left Limit fault !Put the stage in DC Mode if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end !DISABLE (Axis) call AXIS_CFG DISP "Homing is DONE ......" home_R(Axis) = 0; RET HOME_F: ! Load tuned parameters for AC mode for AB2 Amplifier !disable this when using AB5 amplifier acpar(Axis)=1; TILL acpar(Axis)=0 DISP "Homing in positive direction is in PROGRESS ......" ENABLE (Axis) FDEF(Axis).#CL = 0 !disable default response of Current Limit fault FDEF(Axis).#CPE = 0 !disable default response of Critical Postion Error fault FDEF(Axis).#SRL = 0 !disable default response of Software Right Limit fault FDEF(Axis).#SLL = 0 !disable default response of Software Left Limit fault JOG (Axis), + TILL (ABS(PE(Axis))>10000) JOG (Axis), - IST(Axis).#IND = 0 !enables the index capture TILL IST(Axis).#IND = 1 !wait till index capture happens KILL (Axis) SET FPOS(Axis)=FPOS(Axis)-IND(Axis) !this sets index position as 0 reference point PTP (Axis), 0 TILL ^MST(Axis).#MOVE FDEF(Axis).#CL = 1 !re-enable default response of Current Limit fault FDEF(Axis).#CPE = 1 !re-enable default response of Critical Postion Error fault FDEF(Axis).#SRL = 1 !re-enable default response of Software Right Limit fault FDEF(Axis).#SLL = 1 !re-enable default response of Software Left Limit fault !Put the stage in DC Mode if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end !DISABLE (Axis) call AXIS_CFG DISP "Homing is DONE ......" home_F(Axis) = 0; RET !THESE PROGRAMS TUNE PARAMETERS SAVED FOR AB2 and AB5 AND THE GOOD !STAGE TO BE USED IN THE MONO IN 8-ID !MOSTLY WE WILL NEVER USE AB5 AMPLIFIER AS THE MOTOR IS ALWAYS SERVOING IN THIS MODE !AND IS NOT GOOD FOR VACUUM USE AS THE MOTOR GETS HOT AND CANNOT BE ENABLED FOR MORE THAN !10 MINUTES OR SO. IN AB2, DEADBAND IS ACTIVE AND SO THE MOTOR IS BASICALLY DISABLED !ONCE THE STAGE IS WITHIN THE DEADBAND MAX WHICH IS LIKE 10 COUNTS IN THE CURRENT TUNING !CONFIGURATION AND IS ABOUT 100 nm. !In the DC mode, the motor can be kept enabled forever in vacuum and holds position to within 1 count !which is currently 10 nm. !Written by Suresh (8-ID) (March 2006) !Note: VEL and ACC are commented out for the AC mode as they are set from EPICS MEDM screens. !Note: VEL and ACC are DEFINED for the DC mode as they are not defined from EPICS MEDM screens !To switch from DC to AC you must disable the motor AC_TUNED_PAR: ! FOR LONG MOVE ! Switching only neccessary if DC mode enabled if dcEnable(Axis) > 0 DISABLE(Axis); !SET DC_MODE to 0 and SET Nanomotion bit to 1 resp. MFLAGS(Axis).30 = 0; MFLAGS(Axis).7 = 1; SLPKP(Axis)=300; SLVKP(Axis)=20; SLVKI(Axis)= 1600; SLFRC(Axis)=17; end !VEL(Axis)= 102400 * 1.0; !defined from EPICS !ACC(Axis)=VEL(Axis)*10; !defined from EPICS DEC(Axis)=ACC(Axis); KDEC(Axis)=DEC(Axis)*1E4; JERK(Axis)=ACC(Axis)*1E3; if dcEnable(Axis) > 0 ENABLE(Axis); end acpar(Axis)=0; RET DC_TUNED_PAR: !SET DC_MODE to 1 and SET Nanomotion bit to 0 resp. VEL(Axis)=15; ACC(Axis)=VEL(Axis)*10; MFLAGS(Axis).30 = 1; MFLAGS(Axis).7 =0; SLPKP(Axis)=2500; SLVKP(Axis)=20; SLVKI(Axis)= 9000; SLFRC(Axis)=0; DEC(Axis)=ACC(Axis); KDEC(Axis)=DEC(Axis); JERK(Axis)=ACC(Axis)*10; dcpar(Axis)=0; RET ! ********************* ! Axis Configuration ! ********************* AXIS_CFG: DISABLE (Axis) ! Configuration Parameters MFLAGS(Axis).#OPEN = 0 DCOM(Axis)= 0 MFLAGS(Axis).12=0 ! Encoder Direction, 0 = direct, 1 = invereted MFLAGS(Axis).13=0 ! Driver Output, 0 = direct, 1 = inverted SLCPRD(Axis) = 1E9 ! Safety Parameters XVEL(Axis) = 2E8 ! Maximum Velocity XCURV(Axis) = 75 ! Maximum motor command during motion, 100% = 10V XCURI(Axis) = 75 ! Maximum motor command during rest, 100% = 10V XRMS(Axis) = 50 ! Maximum RMS of motor command. Do not exceed 75% XRMST(Axis)= 3230 ! RMS time constant CERRI(Axis) = 1E4 ! Critical position error at rest CERRV(Axis) = 1E5 ! Critical position error at CV CERRA(Axis) = 1E5 ! Critical position error at Accel FMASK(Axis).#CPE = 1! Enable critical position error protection FMASK(Axis).#CL = 1 ! Enable current limit protection !LEFT_LIM = 3E6 !RIGHT_LIM = -3E6 ! Nanomotion Parameters MFLAGS(Axis).7 = 0! Disable Enable Nanomotion mode, since we are using an AB5 amplifier SETTLE(Axis)=5 ! Require motor to be within TARGRAD consecutively for 5 msec before declaring end of move. TARGRAD(Axis)= 10 ! Target radius = 50 nm SLDZMAX(Axis)= 0 ! Dead Zone Maximum SLDZMIN(Axis)= 0 ! Dead Zone Minimum SLZFF(Axis) = 0 ! Zero feed forward at 0 counts before target SLFRC(Axis) = 0 ! friction offset compensation SLFRCD(Axis) = 0 ! Dynamic friction offset compensation SLIOFFS(Axis) = 0 ! DAC offset SLVSOFD(Axis) = 0.707 ! Low pass filter damping ! Default Motion Parameters VEL(Axis)= 1E4 ! Velocity ACC(Axis)= 1E5 ! Accel DEC(Axis)= 1E5 ! Decel KDEC(Axis)= 1E9 ! Kill decel JERK(Axis)= 1E8 ! ! Servo Parameters, relaexed SLPKP(Axis)=40 ! KP (POSITION GAIN) SLVKP(Axis)=2000 ! KV (VELOCITY GAIN) SLVKI(Axis)=500 ! KI (INTEGRATOR GAIN) SLVLI(Axis)=50 ! Anti windup integrator limit, % of 100% SLVSOF(Axis)=1000 ! Low pass filter bandwidth SLAFF(Axis) = 0 ! Accel feed forward MFLAGS(Axis).14 = 0! Enable notch filter RET ON home_R(Axis)=1; CALL HOME_R; RET ON home_F(Axis)=1; CALL HOME_F; RET ON acpar(Axis)=1; CALL AC_TUNED_PAR; RET ON dcpar(Axis)=1; CALL DC_TUNED_PAR; RET #8 !THIS BUFFER STOPS MOTION PROGRAMS ON A PER AXIS BASES AND RETURNS TO DC MODE !Done(Axis) Flag is used by EPICS to check when op operation is complete !Written by Joe Sullivan (BCDA) and Suresh (8-ID) (March 2006) GLOBAL stop_all(8) GLOBAL Done(8) GLOBAL acpar(8) GLOBAL dcpar(8) GLOBAL dcEnable(8) LOCAL Axis STOP STOP_MOVE: ! Stop corresponding buffer stop Axis ! Halt motor motion and wait until done HALT(Axis) TILL ^MST(Axis).#MOVE !Test that buffer and autoroutine are stopped (with timeout) TILL ^PST(Axis).#RUN & ^PST(Axis).#AUTO,500 !clear the AC and DC Flags to make sure they are cleared acpar(Axis)=0;dcpar(Axis)=0; ! Switch to DC Mode if dcEnable(Axis) > 0 dcpar(Axis)=1; TILL dcpar(Axis)=0 end ! Clear flags stop_all(Axis) = 0; Done(Axis) = 1; RET ON stop_all(0)=1; Axis=0;CALL STOP_MOVE; RET ON stop_all(1)=1; Axis=1;CALL STOP_MOVE; RET ON stop_all(2)=1; Axis=2;CALL STOP_MOVE; RET ON stop_all(3)=1; Axis=3;CALL STOP_MOVE; RET ON stop_all(4)=1; Axis=4;CALL STOP_MOVE; RET ON stop_all(5)=1; Axis=5;CALL STOP_MOVE; RET ON stop_all(6)=1; Axis=6;CALL STOP_MOVE; RET ON stop_all(7)=1; Axis=7;CALL STOP_MOVE; RET