diff --git a/site_ansto/instrument/util/motor_utility.tcl b/site_ansto/instrument/util/motor_utility.tcl new file mode 100644 index 00000000..1e9aba5c --- /dev/null +++ b/site_ansto/instrument/util/motor_utility.tcl @@ -0,0 +1,123 @@ +# Some useful functions for SICS motor configuration. + +# $Revision: 1.1 $ +# $Date: 2007-10-29 02:58:12 $ +# Author: Douglas Clowes (dcl@ansto.gov.au) +# Last revision by $Author: dcl $ + +# Functions for the slit motors (echidna, wombat, platypus, ...) +# +# functions used by the generated functions +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 [$m1]] + $diff/2] + set newD1L [expr [SplitReply [$m2]] - $diff/2] + return "$m1=$newD1R,$m2=$newD1L" +} + +proc get_gap_offset {m1 m2} { + set S1 [SplitReply [$m1]] + set S2 [SplitReply [$m2]] + return [ expr ($S1 + $S2)/2.0 ] +} + +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" +} + +# Generator functions +proc make_gap_motors {vm1 vm1_name vm2 vm2_name m1 m2 aunits agroup} { + 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 + +sicslist setatt $vm1 units $aunits +sicslist setatt $vm1 klass aperture +sicslist setatt $vm1 long_name $vm1_name +sicslist setatt $vm1 group $agroup +sicslist setatt $vm2 units $aunits +sicslist setatt $vm2 klass aperture +sicslist setatt $vm2 long_name $vm2_name +sicslist setatt $vm2 group $agroup +} + +# Functions for motors with defined positions (quokka, platypus) +# +# functions used by the generated functions +proc set_virtual_1 { phys1 posit } { + set units [expr [SplitReply [$phys1 posit2unit $posit]]] + return "$phys1=$units" +} + +proc set_virtual_2 { phys1 phys2 posit } { + set unit1 [expr [SplitReply [$phys1 posit2unit $posit]]] + set unit2 [expr [SplitReply [$phys2 posit2unit $posit]]] + return "$phys1=$unit1,$phys2=$unit2" +} + +proc get_virtual_1 { phys1 } { + set p1 [expr [SplitReply [$phys1 posit]]] + return $p1 +} + +proc get_virtual_2 { phys1 phys2 } { + set p1 [expr [SplitReply [$phys1 posit]]] + set p2 [expr [SplitReply [$phys2 posit]]] + return [expr ($p1 + $p2) / 2.0] +} +#publish set_virtual_1 user +#publish set_virtual_2 user +#publish get_virtual_1 user +#publish get_virtual_2 user + +# Generator functions +proc make_coll_motor_1 { vm1 vm1_name pm1 aunits } { + eval "proc get_$vm1 {} { get_virtual_1 $pm1 }" + set v {$var} + eval "proc set_$vm1 {var} { set_virtual_1 $pm1 $v }" + MakeConfigurableMotor $vm1 + $vm1 readscript get_$vm1 + $vm1 drivescript set_$vm1 + sicslist setatt $vm1 units $aunits + sicslist setatt $vm1 klass collimator + sicslist setatt $vm1 long_name $vm1_name +} + +proc make_coll_motor_2 { vm1 vm1_name pm1 pm2 aunits } { + eval "proc get_$vm1 {} { get_virtual_2 $pm1 $pm2 }" + set v {$var} + eval "proc set_$vm1 {var} { set_virtual_2 $pm1 $pm2 $v }" + MakeConfigurableMotor $vm1 + $vm1 readscript get_$vm1 + $vm1 drivescript set_$vm1 + sicslist setatt $vm1 units $aunits + sicslist setatt $vm1 klass collimator + sicslist setatt $vm1 long_name $vm1_name +} + +