diff --git a/motorApp/AcsTech80Src/SPiiPlus_EPICS.prg b/motorApp/AcsTech80Src/SPiiPlus_EPICS.prg index c5daf7a8..c6024027 100644 --- a/motorApp/AcsTech80Src/SPiiPlus_EPICS.prg +++ b/motorApp/AcsTech80Src/SPiiPlus_EPICS.prg @@ -1,25 +1,28 @@ -#/ Controller version = 4.50 -#/ Date = 04/26/2006 16:41 -#/ User remarks = hello -#0 -!Note: Each motor needs all the programs in BUFFER 0 copied into its corresponding buffer. -!Note: ie: motor 1 - buffer #0 , motor 2 - buffer #1 ..... etc. +#/ 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(4) -GLOBAL dcpar(4) -GLOBAL INT home_F(4) -GLOBAL INT home_R(4) -GLOBAL target_pos(4) -GLOBAL jog_vel(4) -GLOBAL Done(4) -GLOBAL opReq(4) +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 -Axis = 0 +LOCAL Buffer IF opReq(Axis) = 1 call ABS_MOVE @@ -37,6 +40,30 @@ 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) @@ -47,14 +74,18 @@ acpar(Axis)=1; TILL acpar(Axis)=0 PTP(Axis),target_pos(Axis) TILL ^MST(Axis).#MOVE ! Switch to DC(Position) Mode -dcpar(Axis)=1; TILL dcpar(Axis)=0 +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 -dcpar(Axis)=1; TILL dcpar(Axis)=0 +if dcEnable(Axis) > 0 + dcpar(Axis)=1; TILL dcpar(Axis)=0 +end RET @@ -62,7 +93,9 @@ JOG_MOVE: acpar(Axis)=1; TILL acpar(Axis)=0 JOG/v(Axis),jog_vel(Axis) TILL ^MST(Axis).#MOVE -dcpar(Axis)=1; TILL dcpar(Axis)=0 +if dcEnable(Axis) > 0 + dcpar(Axis)=1; TILL dcpar(Axis)=0 +end RET @@ -79,11 +112,6 @@ HOME_R: ! Load tuned parameters for AC mode for AB2 Amplifier !disable this when using AB5 amplifier acpar(Axis)=1; TILL acpar(Axis)=0 -!VEL(Axis) = 102400*2 !2 mm/sec !defined from EPICS -ACC(Axis) = VEL(Axis)*10 -DEC(Axis) = ACC(Axis) -KDEC(Axis) = DEC(Axis)*2 -JERK(Axis) = ACC(Axis)*20 DISP "Homing in negative direction is in PROGRESS ......" ENABLE (Axis) @@ -108,8 +136,11 @@ 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 -dcpar(Axis)=1; TILL dcpar(Axis)=0 +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 @@ -120,12 +151,6 @@ HOME_F: !disable this when using AB5 amplifier acpar(Axis)=1; TILL acpar(Axis)=0 -!VEL(Axis) = 102400*2 !2 mm/sec !defined from EPICS -ACC(Axis) = VEL(Axis)*10 -DEC(Axis) = ACC(Axis)*0.5 -KDEC(Axis) = DEC(Axis) -JERK(Axis) = ACC(Axis)*10 - DISP "Homing in positive direction is in PROGRESS ......" ENABLE (Axis) FDEF(Axis).#CL = 0 !disable default response of Current Limit fault @@ -149,8 +174,11 @@ 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 -dcpar(Axis)=1; TILL dcpar(Axis)=0 +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 @@ -173,73 +201,117 @@ RET !To switch from DC to AC you must disable the motor AC_TUNED_PAR: ! FOR LONG MOVE - !!!! BLOCK !All commands between BLOCK and END will be executed in one controller cycle (1 msec) -DISABLE(Axis); -SLCPRD(Axis)=1E9; !Set this parameter for Nanomotion with High res. on sin/cos encoder to over come a bug in ACS related to Commutating motors +! 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 -!SET DC_MODE to 0 and SET Nanomotion bit to 1 resp. -MFLAGS(Axis).30 = 0; -MFLAGS(Axis).7 = 1; -XVEL(Axis)=2.048E7; -SLPKP(Axis)=300; -SLVKP(Axis)=20; -SLVKI(Axis)= 1600; -SLFRC(Axis)=17; -SLDZMIN(Axis)=2; -SLDZMAX(Axis)=10; -TARGRAD(Axis) = SLDZMAX(Axis); -SETTLE(Axis) = 10; -DEC(Axis)=ACC(Axis)*0.5; -KDEC(Axis)=DEC(Axis); -JERK(Axis)=ACC(Axis)*10; - !!!! END !All commands between BLOCK and END will be executed in one controller cycle (1 msec) -ENABLE(Axis); +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. - !!!! BLOCK !All commands between BLOCK and END will be executed in one controller cycle (1 msec) VEL(Axis)=15; ACC(Axis)=VEL(Axis)*10; MFLAGS(Axis).30 = 1; MFLAGS(Axis).7 =0; -XVEL(Axis)=2.048E7; SLPKP(Axis)=2500; SLVKP(Axis)=20; SLVKI(Axis)= 9000; SLFRC(Axis)=0; -SETTLE(Axis) = 10; DEC(Axis)=ACC(Axis); KDEC(Axis)=DEC(Axis); JERK(Axis)=ACC(Axis)*10; -!SLDZMIN(Axis)=2;SLDZMAX(Axis)=10;TARGRAD(Axis) = SLDZMAX(Axis); - !!!! END !All commands between BLOCK and END will be executed in one controller cycle (1 msec) 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(0)=1; Axis = 0; CALL HOME_R; RET -ON home_F(0)=1; Axis = 0; CALL HOME_F; RET -ON acpar(0)=1;Axis=0;CALL AC_TUNED_PAR; RET -ON dcpar(0)=1;Axis=0;CALL DC_TUNED_PAR; 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 - - -#4 +#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(4) -GLOBAL Done(4) -GLOBAL acpar(4) -GLOBAL dcpar(4) -LOCAL INT Axis +GLOBAL stop_all(8) +GLOBAL Done(8) +GLOBAL acpar(8) +GLOBAL dcpar(8) +GLOBAL dcEnable(8) +LOCAL Axis + STOP STOP_MOVE: @@ -255,10 +327,12 @@ TILL ^MST(Axis).#MOVE TILL ^PST(Axis).#RUN & ^PST(Axis).#AUTO,500 !clear the AC and DC Flags to make sure they are cleared -acpar(0)=0;dcpar(0)=0; +acpar(Axis)=0;dcpar(Axis)=0; ! Switch to DC Mode -dcpar(Axis)=1; TILL dcpar(Axis)=0 +if dcEnable(Axis) > 0 + dcpar(Axis)=1; TILL dcpar(Axis)=0 +end ! Clear flags stop_all(Axis) = 0; Done(Axis) = 1; @@ -266,6 +340,16 @@ 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 + + + diff --git a/motorApp/AcsTech80Src/SPiiPlus_Epics_example.prg b/motorApp/AcsTech80Src/SPiiPlus_Epics_example.prg new file mode 100644 index 00000000..e01aa9d0 --- /dev/null +++ b/motorApp/AcsTech80Src/SPiiPlus_Epics_example.prg @@ -0,0 +1,357 @@ +#/ 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 + + + + + + + + +