427 lines
12 KiB
Tcl
427 lines
12 KiB
Tcl
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
|
|
set ss2v_Gap 205
|
|
|
|
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
|
|
|