set slit2active 1 # START MOTOR CONFIGURATION set animal koala #set sim_mode [SplitReply [motor_simulation]] set sim_mode false # Setup addresses of Galil DMC2280 controllers. set dmc2280_controller2(host) mc2-$animal set dmc2280_controller2(port) 1044 if {$sim_mode == "true"} { set motor_driver_type asim } else { set motor_driver_type DMC2280 MakeAsyncQueue mc2 DMC2280 $dmc2280_controller2(host) $dmc2280_controller2(port) } #Measured or computed slit motor steps per millimetre # 125 steps * 161:1 gears = 20125 set slitStepRate 20125 #Measured slit gap, in units, after homing on limit switches set ss1h_Gap 52.6 set ss1v_Gap 128.6 set ss2h_Gap 51.0 set ss2v_Gap 205.0 set ss1r_Home [expr $ss1h_Gap/2*$slitStepRate] set ss1l_Home [expr $ss1h_Gap/2*$slitStepRate] set ss1u_Home [expr $ss1v_Gap/2*$slitStepRate] set ss1d_Home [expr $ss1v_Gap/2*$slitStepRate] set ss2r_Home [expr $ss2h_Gap/2*$slitStepRate] set ss2l_Home [expr $ss2h_Gap/2*$slitStepRate] set ss2u_Home [expr $ss2v_Gap/2*$slitStepRate] set ss2d_Home [expr $ss2v_Gap/2*$slitStepRate] #Default upper and lower ranges for vertical slits set vertSlitLowRange 64 set vertSlitUpRange 64 #Default upper and lower ranges for horizontal slits set horSlitLowRange 25 set horSlitUpRange 25 #Default upper and lower ranges for vertical slits set vSlitHome 0 set vSlitLoRange 20 set vSlitHiRange 100 #Default upper and lower ranges for horizontal slits set hSlitHome 0 set hSlitLoRange 15 set hSlitHiRange 35 #calculate individual slit motor low ranges set ss1r_LoRange [expr $hSlitHome - $hSlitLoRange] set ss1l_LoRange [expr $hSlitHome - $hSlitHiRange] set ss1u_LoRange [expr $vSlitHome - $vSlitLoRange] set ss1d_LoRange [expr $vSlitHome - $vSlitHiRange] set ss2r_LoRange [expr $hSlitHome - $hSlitLoRange] set ss2l_LoRange [expr $hSlitHome - $hSlitHiRange] set ss2u_LoRange [expr $vSlitHome - $vSlitLoRange] set ss2d_LoRange [expr $vSlitHome - $vSlitHiRange] #calculate individual slit motor high ranges set ss1r_HiRange [expr $hSlitHome + $hSlitHiRange] set ss1l_HiRange [expr $hSlitHome + $hSlitLoRange] set ss1u_HiRange [expr $vSlitHome + $vSlitHiRange] set ss1d_HiRange [expr $vSlitHome + $vSlitLoRange] set ss2r_HiRange [expr $hSlitHome + $hSlitHiRange] set ss2l_HiRange [expr $hSlitHome + $hSlitLoRange] set ss2u_HiRange [expr $vSlitHome + $vSlitHiRange] set ss2d_HiRange [expr $vSlitHome + $vSlitLoRange] set slit1VGroup first/vertical set slit1HGroup first/horizontal set slit2VGroup second/vertical set slit2HGroup second/horizontal # set movecount high to reduce the frequency of # hnotify messages to a reasonable level set move_count 10 # Slit 1, right Motor ss1r $motor_driver_type [params \ asyncqueue mc2\ axis A\ units mm\ hardlowerlim $ss1r_LoRange\ hardupperlim $ss1r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1r_Home] ss1r softlowerlim $ss1r_LoRange ss1r softupperlim $ss1r_HiRange ss1r home 0 ss1r movecount $move_count ss1r part aperture.first ss1r long_name right Motor ss1l $motor_driver_type [params \ asyncqueue mc2\ axis B\ units mm\ hardlowerlim $ss1l_LoRange\ hardupperlim $ss1l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX $slitStepRate\ motorHome $ss1l_Home] ss1l softlowerlim $ss1l_LoRange ss1l softupperlim $ss1l_HiRange ss1l home 0 ss1l movecount $move_count ss1l part aperture.first ss1l long_name left Motor ss1u $motor_driver_type [params \ asyncqueue mc2\ axis C\ units mm\ hardlowerlim $ss1u_LoRange\ hardupperlim $ss1u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1u_Home] ss1u softlowerlim $ss1u_LoRange ss1u softupperlim $ss1u_HiRange ss1u home 0 ss1u movecount $move_count ss1u part aperture.first ss1u long_name top Motor ss1d $motor_driver_type [params \ asyncqueue mc2\ axis D\ units mm\ hardlowerlim $ss1d_LoRange\ hardupperlim $ss1d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX $slitStepRate\ motorHome $ss1d_Home] ss1d softlowerlim $ss1d_LoRange ss1d softupperlim $ss1d_HiRange ss1d home 0 ss1d movecount $move_count ss1d part aperture.first ss1d long_name bottom if {$slit2active} { # Slit 2, right Motor ss2r $motor_driver_type [params \ asyncqueue mc2\ axis E\ units mm\ hardlowerlim $ss2r_LoRange\ hardupperlim $ss2r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2r_Home] ss2r softlowerlim $ss2r_LoRange ss2r softupperlim $ss2r_HiRange ss2r home 0 ss2r movecount $move_count ss2r part aperture.second ss2r long_name right Motor ss2l $motor_driver_type [params \ asyncqueue mc2\ axis F\ units mm\ hardlowerlim $ss2l_LoRange\ hardupperlim $ss2l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX $slitStepRate\ motorHome $ss2l_Home] ss2l softlowerlim $ss2l_LoRange ss2l softupperlim $ss2l_HiRange ss2l home 0 ss2l movecount $move_count ss2l part aperture.second ss2l long_name left # Slit 2, up Motor ss2u $motor_driver_type [params \ asyncqueue mc2\ axis G\ units mm\ hardlowerlim $ss2u_LoRange\ hardupperlim $ss2u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2u_Home] ss2u softlowerlim $ss2u_LoRange ss2u softupperlim $ss2u_HiRange ss2u home 0 ss2u movecount $move_count ss2u part aperture.second ss2u long_name top Motor ss2d $motor_driver_type [params \ asyncqueue mc2\ axis H\ units mm\ hardlowerlim $ss2d_LoRange\ hardupperlim $ss2d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX $slitStepRate\ motorHome $ss2d_Home] ss2d softlowerlim $ss2d_LoRange ss2d softupperlim $ss2d_HiRange ss2d home 0 ss2d movecount $move_count ss2d part aperture.second ss2d long_name bottom } make_gap_motors ss1vg gap ss1vo offset ss1u ss1d mm $slit1VGroup make_gap_motors ss1hg gap ss1ho offset ss1r ss1l mm $slit1HGroup if {$slit2active} { make_gap_motors ss2vg gap ss2vo offset ss2u ss2d mm $slit2VGroup make_gap_motors ss2hg gap ss2ho offset ss2r ss2l mm $slit2HGroup } if {0} { #-------------------------------------------------------- proc ss1widthscript {val} { set currentWidth [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] set diff [expr $val - $currentWidth] set newD1R [expr [SplitReply [ss1r]] + $diff/2] set newD1L [expr [SplitReply [ss1l]] + $diff/2] return "ss1r=$newD1R,ss1l=$newD1L" } publish ss1widthscript user #------------------------------------------------------- proc ss1readwidth {} { return [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] } publish ss1readwidth user MakeConfigurableMotor ss1hg ss1hg drivescript ss1widthscript ss1hg readscript ss1readwidth #-------------------------------------------------------- proc ss1horoffsetscript {val} { set SR [SplitReply [ss1r]] set SL [SplitReply [ss1l]] set currentOffset [ expr $SR - ($SR + $SL)/2.0 ] set diff [expr $val - $currentOffset] set newD1R [expr $SR + $diff] set newD1L [expr $SL - $diff] return "ss1r=$newD1R,ss1l=$newD1L" } publish ss1horoffsetscript user #------------------------------------------------------- proc ss1readhoroffset {} { set SR [SplitReply [ss1r]] return [ expr $SR - ($SR + [SplitReply [ss1l]])/2.0 ] } publish ss1readhoroffset user #------------------------------------------------------- MakeConfigurableMotor ss1ho ss1ho drivescript ss1horoffsetscript ss1ho readscript ss1readhoroffset #----------------------------------------------------- proc ss1heightscript {val} { set currentWidth [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]] set diff [expr $val - $currentWidth] set newD1B [expr [SplitReply [ss1d]] + $diff/2] set newD1T [expr [SplitReply [ss1u]] + $diff/2] return "ss1d=$newD1B,ss1u=$newD1T" } publish ss1heightscript user #------------------------------------------------------- proc ss1readheight {} { return [expr [SplitReply [ss1u]] + [SplitReply [ss1d]]] } publish ss1readheight user #--------------------------------------------------------- MakeConfigurableMotor ss1vg ss1vg drivescript ss1heightscript ss1vg readscript ss1readheight #-------------------------------------------------------- proc ss1vertoffsetscript {val} { set SU [SplitReply [ss1u]] set SD [SplitReply [ss1d]] set currentOffset [ expr $SU - ($SU + $SD)/2.0 ] set diff [expr $val - $currentOffset] set newD1U [expr $SU + $diff] set newD1D [expr $SD - $diff] return "ss1u=$newD1U,ss1d=$newD1D" } publish ss1vertoffsetscript user #------------------------------------------------------- proc ss1readvertoffset {} { set SU [SplitReply [ss1u]] return [ expr $SU - ($SU + [SplitReply [ss1d]])/2.0 ] } publish ss1readvertoffset user #------------------------------------------------------- MakeConfigurableMotor ss1vo ss1vo drivescript ss1vertoffsetscript ss1vo readscript ss1readvertoffset ############################################### if {$slit2active} { #-------------------------------------------------------- proc ss2widthscript {val} { set currentWidth [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]] set diff [expr $val - $currentWidth] set newD1R [expr [SplitReply [ss2r]] + $diff/2] set newD1L [expr [SplitReply [ss2l]] + $diff/2] return "ss2r=$newD1R,ss2l=$newD1L" } publish ss2widthscript user #------------------------------------------------------- proc ss2readwidth {} { return [expr [SplitReply [ss2r]] + [SplitReply [ss2l]]] } publish ss2readwidth user MakeConfigurableMotor ss2hg ss2hg drivescript ss2widthscript ss2hg readscript ss2readwidth #-------------------------------------------------------- proc ss2horoffsetscript {val} { set SR [SplitReply [ss2r]] set SL [SplitReply [ss2l]] set currentOffset [ expr $SR - ($SR + $SL)/2.0 ] set diff [expr $val - $currentOffset] set newD1R [expr $SR + $diff] set newD1L [expr $SL - $diff] return "ss2r=$newD1R,ss2l=$newD1L" } publish ss2horoffsetscript user #------------------------------------------------------- proc ss2readhoroffset {} { set SR [SplitReply [ss2r]] return [ expr $SR - ($SR + [SplitReply [ss2l]])/2.0 ] } publish ss2readhoroffset user #------------------------------------------------------- MakeConfigurableMotor ss2ho ss2ho drivescript ss2horoffsetscript ss2ho readscript ss2readhoroffset #----------------------------------------------------- proc ss2heightscript {val} { set currentWidth [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]] set diff [expr $val - $currentWidth] set newD1B [expr [SplitReply [ss2d]] + $diff/2] set newD1T [expr [SplitReply [ss2u]] + $diff/2] return "ss2d=$newD1B,ss2u=$newD1T" } publish ss2heightscript user #------------------------------------------------------- proc ss2readheight {} { return [expr [SplitReply [ss2u]] + [SplitReply [ss2d]]] } publish ss2readheight user #--------------------------------------------------------- MakeConfigurableMotor ss2vg ss2vg drivescript ss2heightscript ss2vg readscript ss2readheight #-------------------------------------------------------- proc ss2vertoffsetscript {val} { set SU [SplitReply [ss2u]] set SD [SplitReply [ss2d]] set currentOffset [ expr $SU - ($SU + $SD)/2.0 ] set diff [expr $val - $currentOffset] set newD1U [expr $SU + $diff] set newD1D [expr $SD - $diff] return "ss2u=$newD1U,ss2d=$newD1D" } publish ss2vertoffsetscript user #------------------------------------------------------- proc ss2readvertoffset {} { set SU [SplitReply [ss2u]] return [ expr $SU - ($SU + [SplitReply [ss2d]])/2.0 ] } publish ss2readvertoffset user #------------------------------------------------------- MakeConfigurableMotor ss2vo ss2vo drivescript ss2vertoffsetscript ss2vo readscript ss2readvertoffset } ############################################### } # END MOTOR CONFIGURATION