diff --git a/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl b/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl index fdf4f56b..f9a9882b 100644 --- a/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl @@ -1,7 +1,7 @@ -# $Revision: 1.8 $ -# $Date: 2007-04-01 01:58:57 $ +# $Revision: 1.9 $ +# $Date: 2007-04-02 05:00:03 $ # Author: Ferdi Franceschini (ffr@ansto.gov.au) -# Last revision by: $Author: ffr $ +# Last revision by: $Author: dcl $ # START MOTOR CONFIGURATION @@ -25,16 +25,12 @@ MakeMultiChan mc3 $dmc2280_controller3(host) $dmc2280_controller3(port) MakeMultiChan mc4 $dmc2280_controller4(host) $dmc2280_controller4(port) #Measured absolute encoder reading at home position -# 7613185, 7504518, 6770094, 7463036, 8901369, 19927837, 22369621, 22369621 -# 7613516, 7503905, 6767221, 7464891 set mphi_Home 7613516 set mchi_Home 7503905 set my_Home 6767221 set mx_Home 7464891 set mom_Home 9274794 set mtth_Home 19927837 -# 7938155, 7585392, 7556982, 7563854, 17214054, 22369621, 22369621, 22369621 -# 7937974, 7585956, 7557524, 7557304, 16992893, 1497938, 7788744, 22369621 set sphi_Home 7937974 set schi_Home 7585956 set sy_Home 7557524 @@ -63,29 +59,39 @@ 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 vertSlitHome 0 -set vertSlitLowRange 25 -set vertSlitUpRange 100 +set vSlitHome 0 +set vSlitLoRange 25 +set vSlitHiRange 100 #Default upper and lower ranges for horizontal slits -set horSlitHome 0 -set horSlitLowRange 25 -set horSlitUpRange 25 +set hSlitHome 0 +set hSlitLoRange 25 +set hSlitHiRange 25 -# set movecount high to reduce the frequency of +#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 movecount high to reduce the frequency of # hnotify messages to a reasonable level set move_count 100 -# Run slit homing routines on controllers 3 and 4 -#if [catch {dmc_connect dmc2280_controller3} ] { -# dmc_sendCmd dmc2280_controller3 "XQ#HOME,1" -# dmc_close dmc2280_controller3 -#} -#if [catch {dmc_connect dmc2280_controller4} ] { -# dmc_sendCmd dmc2280_controller4 "XQ#HOME,1" -# dmc_close dmc2280_controller4 -#} - ############################ # Motor Controller 1 # Motor Controller 1 @@ -115,7 +121,7 @@ mphi speed 1 mphi movecount $move_count mphi precision 0.01 mphi part crystal -mphi long_name phi +mphi long_name phi # Monochromator chi, Tilt 2, lower Motor mchi DMC2280 [params \ @@ -138,7 +144,7 @@ mchi speed 1 mchi movecount $move_count mchi precision 0.01 mchi part crystal -mchi long_name chi +mchi long_name chi # Monochromator Trans 1, upper Motor my DMC2280 [params \ @@ -161,7 +167,7 @@ my speed 1 my movecount $move_count my precision 0.01 my part crystal -my long_name translate_y +my long_name translate_y # Monochromator Trans 2, lower Motor mx DMC2280 [params \ @@ -184,7 +190,7 @@ mx speed 1 mx movecount $move_count mx precision 0.01 mx part crystal -mx long_name translate_x +mx long_name translate_x # Monochromator omega, rotate Motor mom DMC2280 [params \ @@ -207,7 +213,7 @@ mom speed 1 mom movecount $move_count mom precision 0.01 mom part crystal -mom long_name rotate +mom long_name rotate # Monochromator two-theta, flight-tube rotate Motor mtth DMC2280 [params \ @@ -269,7 +275,7 @@ sphi speed 1 sphi movecount $move_count sphi precision 0.01 sphi part sample -sphi long_name phi +sphi long_name phi # Sample Tilt 2, lower, chi Motor schi DMC2280 [params \ @@ -292,7 +298,7 @@ schi speed 1 schi movecount $move_count schi precision 0.01 schi part sample -schi long_name chi +schi long_name chi # Sample Trans 1, upper, y Motor sy DMC2280 [params \ @@ -315,7 +321,7 @@ sy speed 1 sy movecount $move_count sy precision 0.01 sy part sample -sy long_name translate_y +sy long_name translate_y # Sample Trans2, lower, x Motor sx DMC2280 [params \ @@ -338,7 +344,7 @@ sx speed 1 sx movecount $move_count sx precision 0.01 sx part sample -sx long_name translate_x +sx long_name translate_x # Sample Omega, rotate Motor som DMC2280 [params \ @@ -360,7 +366,7 @@ setHomeandRange -motor som -home 0 -lowrange 54 -uprange 120 som speed 1 som precision 0.01 som part sample -som long_name rotate +som long_name rotate # Sample two-theta, detector rotate Motor stth DMC2280 [params \ @@ -409,7 +415,7 @@ oct home 0 oct speed 0.5 oct precision 0.01 oct part collimator -oct long_name oct +oct long_name oct ############################ # Motor Controller 3 @@ -439,7 +445,7 @@ oct long_name oct #mfl movecount $move_count #mf1 precision 0.01 #mf1 part monochromator -#mf1 long_name mf1 +#mf1 long_name mf1 # Monochromator Focusing (Ge) Motor mf2 DMC2280 [params \ @@ -461,7 +467,7 @@ setHomeandRange -motor mf2 -home 0 -lowrange 0 -uprange 1 mf2 speed 0.1 mf2 precision 0.01 mf2 part monochromator -mf2 long_name mf2 +mf2 long_name mf2 # Slit 1, right Motor ss1r DMC2280 [params \ @@ -470,17 +476,19 @@ Motor ss1r DMC2280 [params \ port $dmc2280_controller3(port)\ axis E\ units mm\ - hardlowerlim [expr $horSlitHome - $horSlitLowRange]\ - hardupperlim [expr $horSlitHome + $horSlitUpRange]\ + hardlowerlim $ss1r_LoRange\ + hardupperlim $ss1r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1r_Home] -setHomeandRange -motor ss1r -home $horSlitHome -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss1r softlowerlim $ss1r_LoRange +ss1r softupperlim $ss1r_HiRange +ss1r home 0 ss1r movecount $move_count ss1r part sample -ss1r long_name right +ss1r long_name right # Slit 1, left Motor ss1l DMC2280 [params \ @@ -489,17 +497,19 @@ Motor ss1l DMC2280 [params \ port $dmc2280_controller3(port)\ axis F\ units mm\ - hardlowerlim [expr $horSlitHome - $horSlitLowRange]\ - hardupperlim [expr $horSlitHome + $horSlitUpRange]\ + hardlowerlim $ss1l_LoRange\ + hardupperlim $ss1l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ - stepsPerX -$slitStepRate\ + stepsPerX $slitStepRate\ motorHome $ss1l_Home] -setHomeandRange -motor ss1l -home $horSlitHome -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss1l softlowerlim $ss1l_LoRange +ss1l softupperlim $ss1l_HiRange +ss1l home 0 ss1l movecount $move_count ss1l part sample -ss1l long_name left +ss1l long_name left # Slit 1, up Motor ss1u DMC2280 [params \ @@ -508,17 +518,19 @@ Motor ss1u DMC2280 [params \ port $dmc2280_controller3(port)\ axis G\ units mm\ - hardlowerlim [expr $horSlitHome - $horSlitLowRange]\ - hardupperlim [expr $horSlitHome + $horSlitUpRange]\ + hardlowerlim $ss1u_LoRange\ + hardupperlim $ss1u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1u_Home] -setHomeandRange -motor ss1u -home $horSlitHome -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss1u softlowerlim $ss1u_LoRange +ss1u softupperlim $ss1u_HiRange +ss1u home 0 ss1u movecount $move_count ss1u part sample -ss1u long_name top +ss1u long_name top # Slit 1, down Motor ss1d DMC2280 [params \ @@ -527,17 +539,19 @@ Motor ss1d DMC2280 [params \ port $dmc2280_controller3(port)\ axis H\ units mm\ - hardlowerlim [expr $vertSlitHome - $vertSlitLowRange]\ - hardupperlim [expr $vertSlitHome + $vertSlitUpRange]\ + hardlowerlim $ss1d_LoRange\ + hardupperlim $ss1d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ - stepsPerX -$slitStepRate\ + stepsPerX $slitStepRate\ motorHome $ss1d_Home] -setHomeandRange -motor ss1d -home $vertSlitHome -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss1d softlowerlim $ss1d_LoRange +ss1d softupperlim $ss1d_HiRange +ss1d home 0 ss1d movecount $move_count ss1d part sample -ss1d long_name bottom +ss1d long_name bottom ############################ # Motor Controller 4 @@ -553,17 +567,19 @@ Motor ss2r DMC2280 [params \ port $dmc2280_controller4(port)\ axis E\ units mm\ - hardlowerlim [expr $vertSlitHome - $vertSlitLowRange]\ - hardupperlim [expr $vertSlitHome + $vertSlitUpRange]\ + hardlowerlim $ss2r_LoRange\ + hardupperlim $ss2r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2r_Home] -setHomeandRange -motor ss2r -home $vertSlitHome -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss2r softlowerlim $ss2r_LoRange +ss2r softupperlim $ss2r_HiRange +ss2r home 0 ss2r movecount $move_count ss2r part sample -ss2r long_name right +ss2r long_name right # Slit 2, left Motor ss2l DMC2280 [params \ @@ -572,17 +588,19 @@ Motor ss2l DMC2280 [params \ port $dmc2280_controller4(port)\ axis F\ units mm\ - hardlowerlim [expr $vertSlitHome - $vertSlitLowRange]\ - hardupperlim [expr $vertSlitHome + $vertSlitUpRange]\ + hardlowerlim $ss2l_LoRange\ + hardupperlim $ss2l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ - stepsPerX -$slitStepRate\ + stepsPerX $slitStepRate\ motorHome $ss2l_Home] -setHomeandRange -motor ss2l -home $vertSlitHome -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss2l softlowerlim $ss2l_LoRange +ss2l softupperlim $ss2l_HiRange +ss2l home 0 ss2l movecount $move_count ss2l part sample -ss2l long_name left +ss2l long_name left # Slit 2, up Motor ss2u DMC2280 [params \ @@ -591,17 +609,19 @@ Motor ss2u DMC2280 [params \ port $dmc2280_controller4(port)\ axis G\ units mm\ - hardlowerlim [expr $vertSlitHome - $vertSlitLowRange]\ - hardupperlim [expr $vertSlitHome + $vertSlitUpRange]\ + hardlowerlim $ss2u_LoRange\ + hardupperlim $ss2u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2u_Home] -setHomeandRange -motor ss2u -home $vertSlitHome -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss2u softlowerlim $ss2u_LoRange +ss2u softupperlim $ss2u_HiRange +ss2u home 0 ss2u movecount $move_count ss2u part sample -ss2u long_name top +ss2u long_name top # Slit 2, down Motor ss2d DMC2280 [params \ @@ -610,17 +630,19 @@ Motor ss2d DMC2280 [params \ port $dmc2280_controller4(port)\ axis H\ units mm\ - hardlowerlim [expr $vertSlitHome - $vertSlitLowRange]\ - hardupperlim [expr $vertSlitHome + $vertSlitUpRange]\ + hardlowerlim $ss2d_LoRange\ + hardupperlim $ss2d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ - stepsPerX -$slitStepRate\ + stepsPerX $slitStepRate\ motorHome $ss2d_Home] -setHomeandRange -motor ss2d -home $vertSlitHome -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss2d softlowerlim $ss2d_LoRange +ss2d softupperlim $ss2d_HiRange +ss2d home 0 ss2d movecount $move_count ss2d part sample -ss2d long_name bottom +ss2d long_name bottom proc mthGet {} { return [expr [SplitReply [mtth]]/2.0]} proc mthSet {val} { return "mtth=[SplitReply [mtth]]"} @@ -638,182 +660,59 @@ MakeConfigurableMotor sth sth readscript sthGet sth drivescript sthSet -#-------------------------------------------------------- -proc ss1widthscript {val} { - set currentWidth [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] +proc get_gap_width {m1 m2} { + return [expr [SplitReply [$m1]] - [SplitReply [$m2]]] +} + +proc set_gap_width {m1 m2 val} { + set currentWidth [expr [SplitReply [$m1]] - [SplitReply [$m2]]] set diff [expr $val - $currentWidth] - set newD1R [expr [SplitReply [ss1r]] + $diff/2] - set newD1L [expr [SplitReply [ss1l]] + $diff/2] - return "ss1r=$newD1R,ss1l=$newD1L" + set newD1R [expr [SplitReply [$m1]] + $diff/2] + set newD1L [expr [SplitReply [$m2]] - $diff/2] + return "$m1=$newD1R,$m2=$newD1L" } -publish ss1widthscript user -#------------------------------------------------------- -proc ss1readwidth {} { - return [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] +proc get_gap_offset {m1 m2} { + set S1 [SplitReply [$m1]] + set S2 [SplitReply [$m2]] + return [ expr ($S1 + $S2)/2.0 ] } -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" +proc set_gap_offset {m1 m2 val} { + set S1 [SplitReply [$m1]] + set S2 [SplitReply [$m2]] + set currentoffset [expr ($S1 + $S2)/2.0 ] + set diff [expr $val - $currentoffset] + set newD1R [expr $S1 + $diff] + set newD1L [expr $S2 + $diff] + return "$m1=$newD1R,$m2=$newD1L" } -publish ss1horoffsetscript user -#------------------------------------------------------- -proc ss1readhoroffset {} { - set SR [SplitReply [ss1r]] - return [ expr $SR - ($SR + [SplitReply [ss1l]])/2.0 ] +# make_gap_motors virt_width_motor virt_offset_motor real_high_motor real_low_motor +proc make_gap_motors {vm1 vm2 m1 m2} { + eval "proc get_$vm1 {} { get_gap_width $m1 $m2 }" + set v {$var} + eval "proc set_$vm1 {var} { set_gap_width $m1 $m2 $v }" + MakeConfigurableMotor $vm1 + $vm1 readscript get_$vm1 + $vm1 drivescript set_$vm1 +publish get_$vm1 user +publish set_$vm1 user + + eval "proc get_$vm2 {} { get_gap_offset $m1 $m2 }" + set v {$var} + eval "proc set_$vm2 {var} { set_gap_offset $m1 $m2 $v }" + MakeConfigurableMotor $vm2 + $vm2 readscript get_$vm2 + $vm2 drivescript set_$vm2 +publish get_$vm2 user +publish set_$vm2 user } -publish ss1readhoroffset user -#------------------------------------------------------- -MakeConfigurableMotor ss1ho -ss1ho drivescript ss1horoffsetscript -ss1ho readscript ss1readhoroffset +make_gap_motors ss1vg ss1vo ss1u ss1d +make_gap_motors ss1hg ss1ho ss1r ss1l -#----------------------------------------------------- -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 -############################################### - - -#-------------------------------------------------------- -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 +make_gap_motors ss2vg ss2vo ss2u ss2d +make_gap_motors ss2hg ss2ho ss2r ss2l # END MOTOR CONFIGURATION diff --git a/site_ansto/instrument/hrpd/config/motors/motor_configuration.tcl b/site_ansto/instrument/hrpd/config/motors/motor_configuration.tcl index 0fafdf80..9144455c 100644 --- a/site_ansto/instrument/hrpd/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/hrpd/config/motors/motor_configuration.tcl @@ -1,7 +1,7 @@ -# $Revision: 1.11 $ -# $Date: 2007-04-01 02:24:16 $ +# $Revision: 1.12 $ +# $Date: 2007-04-02 05:00:20 $ # Author: Ferdi Franceschini (ffr@ansto.gov.au) -# Last revision by: $Author: ffr $ +# Last revision by: $Author: dcl $ # START MOTOR CONFIGURATION @@ -60,27 +60,39 @@ 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 25 -set vertSlitUpRange 100 +set vSlitHome 0 +set vSlitLoRange 20 +set vSlitHiRange 100 #Default upper and lower ranges for horizontal slits -set horSlitLowRange 25 -set horSlitUpRange 25 +set hSlitHome 0 +set hSlitLoRange 15 +set hSlitHiRange 35 -# set movecount high to reduce the frequency of +#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 movecount high to reduce the frequency of # hnotify messages to a reasonable level set move_count 100 -# Run slit homing routines on controllers 3 and 4 -#if [catch {dmc_connect dmc2280_controller3} ] { -# dmc_sendCmd dmc2280_controller3 "XQ#HOME,1" -# dmc_close dmc2280_controller3 -#} -#if [catch {dmc_connect dmc2280_controller4} ] { -# dmc_sendCmd dmc2280_controller4 "XQ#HOME,1" -# dmc_close dmc2280_controller4 -#} - ############################ # Motor Controller 1 # Motor Controller 1 @@ -463,14 +475,16 @@ Motor ss1r DMC2280 [params \ port $dmc2280_controller3(port)\ axis E\ units mm\ - hardlowerlim -15\ - hardupperlim 35\ + hardlowerlim $ss1r_LoRange\ + hardupperlim $ss1r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1r_Home] -setHomeandRange -motor ss1r -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss1r softlowerlim $ss1r_LoRange +ss1r softupperlim $ss1r_HiRange +ss1r home 0 ss1r movecount $move_count ss1r part filter ss1r long_name right @@ -482,14 +496,16 @@ Motor ss1l DMC2280 [params \ port $dmc2280_controller3(port)\ axis F\ units mm\ - hardlowerlim -15\ - hardupperlim 35\ + hardlowerlim $ss1l_LoRange\ + hardupperlim $ss1l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1l_Home] -setHomeandRange -motor ss1l -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss1l softlowerlim $ss1l_LoRange +ss1l softupperlim $ss1l_HiRange +ss1l home 0 ss1l movecount $move_count ss1l part filter ss1l long_name left @@ -501,14 +517,16 @@ Motor ss1u DMC2280 [params \ port $dmc2280_controller3(port)\ axis G\ units mm\ - hardlowerlim -20\ - hardupperlim 100\ + hardlowerlim $ss1u_LoRange\ + hardupperlim $ss1u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1u_Home] -setHomeandRange -motor ss1u -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss1u softlowerlim $ss1u_LoRange +ss1u softupperlim $ss1u_HiRange +ss1u home 0 ss1u movecount $move_count ss1u part filter ss1u long_name top @@ -520,14 +538,16 @@ Motor ss1d DMC2280 [params \ port $dmc2280_controller3(port)\ axis H\ units mm\ - hardlowerlim -20\ - hardupperlim 100\ + hardlowerlim $ss1d_LoRange\ + hardupperlim $ss1d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss1d_Home] -setHomeandRange -motor ss1d -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss1d softlowerlim $ss1d_LoRange +ss1d softupperlim $ss1d_HiRange +ss1d home 0 ss1d movecount $move_count ss1d part filter ss1d long_name bottom @@ -578,14 +598,16 @@ Motor ss2r DMC2280 [params \ port $dmc2280_controller4(port)\ axis E\ units mm\ - hardlowerlim -15\ - hardupperlim 35\ + hardlowerlim $ss2r_LoRange\ + hardupperlim $ss2r_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2r_Home] -setHomeandRange -motor ss2r -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss2r softlowerlim $ss2r_LoRange +ss2r softupperlim $ss2r_HiRange +ss2r home 0 ss2r movecount $move_count ss2r part filter ss2r long_name right @@ -597,14 +619,16 @@ Motor ss2l DMC2280 [params \ port $dmc2280_controller4(port)\ axis F\ units mm\ - hardlowerlim -15\ - hardupperlim 35\ + hardlowerlim $ss2l_LoRange\ + hardupperlim $ss2l_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2l_Home] -setHomeandRange -motor ss2l -home 0 -lowrange $horSlitLowRange -uprange $horSlitUpRange +ss2l softlowerlim $ss2l_LoRange +ss2l softupperlim $ss2l_HiRange +ss2l home 0 ss2l movecount $move_count ss2l part filter ss2l long_name left @@ -616,14 +640,16 @@ Motor ss2u DMC2280 [params \ port $dmc2280_controller4(port)\ axis G\ units mm\ - hardlowerlim -20\ - hardupperlim 100\ + hardlowerlim $ss2u_LoRange\ + hardupperlim $ss2u_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2u_Home] -setHomeandRange -motor ss2u -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss2u softlowerlim $ss2u_LoRange +ss2u softupperlim $ss2u_HiRange +ss2u home 0 ss2u movecount $move_count ss2u part filter ss2u long_name top @@ -635,14 +661,16 @@ Motor ss2d DMC2280 [params \ port $dmc2280_controller4(port)\ axis H\ units mm\ - hardlowerlim -20\ - hardupperlim 100\ + hardlowerlim $ss2d_LoRange\ + hardupperlim $ss2d_HiRange\ maxSpeed 1\ maxAccel 1\ maxDecel 1\ stepsPerX -$slitStepRate\ motorHome $ss2d_Home] -setHomeandRange -motor ss2d -home 0 -lowrange $vertSlitLowRange -uprange $vertSlitUpRange +ss2d softlowerlim $ss2d_LoRange +ss2d softupperlim $ss2d_HiRange +ss2d home 0 ss2d movecount $move_count ss2d part filter ss2d long_name bottom @@ -663,182 +691,59 @@ MakeConfigurableMotor sth sth readscript sthGet sth drivescript sthSet -#-------------------------------------------------------- -proc ss1widthscript {val} { - set currentWidth [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] +proc get_gap_width {m1 m2} { + return [expr [SplitReply [$m1]] - [SplitReply [$m2]]] +} + +proc set_gap_width {m1 m2 val} { + set currentWidth [expr [SplitReply [$m1]] - [SplitReply [$m2]]] set diff [expr $val - $currentWidth] - set newD1R [expr [SplitReply [ss1r]] + $diff/2] - set newD1L [expr [SplitReply [ss1l]] + $diff/2] - return "ss1r=$newD1R,ss1l=$newD1L" + set newD1R [expr [SplitReply [$m1]] + $diff/2] + set newD1L [expr [SplitReply [$m2]] - $diff/2] + return "$m1=$newD1R,$m2=$newD1L" } -publish ss1widthscript user -#------------------------------------------------------- -proc ss1readwidth {} { - return [expr [SplitReply [ss1r]] + [SplitReply [ss1l]]] +proc get_gap_offset {m1 m2} { + set S1 [SplitReply [$m1]] + set S2 [SplitReply [$m2]] + return [ expr ($S1 + $S2)/2.0 ] } -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" +proc set_gap_offset {m1 m2 val} { + set S1 [SplitReply [$m1]] + set S2 [SplitReply [$m2]] + set currentoffset [expr ($S1 + $S2)/2.0 ] + set diff [expr $val - $currentoffset] + set newD1R [expr $S1 + $diff] + set newD1L [expr $S2 + $diff] + return "$m1=$newD1R,$m2=$newD1L" } -publish ss1horoffsetscript user -#------------------------------------------------------- -proc ss1readhoroffset {} { - set SR [SplitReply [ss1r]] - return [ expr $SR - ($SR + [SplitReply [ss1l]])/2.0 ] +# make_gap_motors virt_width_motor virt_offset_motor real_high_motor real_low_motor +proc make_gap_motors {vm1 vm2 m1 m2} { + eval "proc get_$vm1 {} { get_gap_width $m1 $m2 }" + set v {$var} + eval "proc set_$vm1 {var} { set_gap_width $m1 $m2 $v }" + MakeConfigurableMotor $vm1 + $vm1 readscript get_$vm1 + $vm1 drivescript set_$vm1 +publish get_$vm1 user +publish set_$vm1 user + + eval "proc get_$vm2 {} { get_gap_offset $m1 $m2 }" + set v {$var} + eval "proc set_$vm2 {var} { set_gap_offset $m1 $m2 $v }" + MakeConfigurableMotor $vm2 + $vm2 readscript get_$vm2 + $vm2 drivescript set_$vm2 +publish get_$vm2 user +publish set_$vm2 user } -publish ss1readhoroffset user -#------------------------------------------------------- -MakeConfigurableMotor ss1ho -ss1ho drivescript ss1horoffsetscript -ss1ho readscript ss1readhoroffset +make_gap_motors ss1vg ss1vo ss1u ss1d +make_gap_motors ss1hg ss1ho ss1r ss1l -#----------------------------------------------------- -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 -############################################### - - -#-------------------------------------------------------- -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 +make_gap_motors ss2vg ss2vo ss2u ss2d +make_gap_motors ss2hg ss2ho ss2r ss2l # END MOTOR CONFIGURATION