# $Revision: 1.1 $ # $Date: 2006-10-12 23:06:05 $ # Author: Ferdi Franceschini (ffr@ansto.gov.au) # Last revision by: $Author: ffr $ # Requires a configuration array for each axis that you want to simulate. # eg #array set B [list AC 25000 TP 7827107 TD 25000 PA 25000 stepsPerX 25000 cntsPerX 8192 DC 25000 SP 25000] # The mkSimAxes.tcl script creates files with arrays like the example above. # Substitutes position values for _TDx and _TPx # then evaluates the expression. proc evaluate {args} { regsub -all {_T[DP][ABCDEFGH]} $args {[eval [parse &]]} expression; regsub -all {\d+} $expression {&.0} expression; return [uplevel #0 expr $expression]; } proc dmset {cmd axis args} { set num [scan $args {%d} val]; if {$num == 1} { set val $args; } else { set val [evaluate $args] } if {[string first $cmd "PA SP AC DC"] != -1} { uplevel #0 set ${axis}($cmd) $val; } else { uplevel #0 $cmd $axis $val; } } proc dmget {cmd axis} { uplevel #0 set ${axis}($cmd) } proc dmcall {cmd paxis} { upvar $paxis axis; uplevel #0 eval $cmd $paxis } proc DP {axis val} { uplevel #0 eval set ${axis}(TD) $val } proc TS {axis} { uplevel #0 eval set ${axis}(TS) } proc SH {args} {} proc MO {args} {} proc BG {_axis} { upvar #0 $_axis axis; set axis(TS) 140; # moving, limit switches open set timeStep 0.1; # seconds set target $axis(PA); set diff [expr $target - $axis(TD)]; set sign [expr ($axis(PA) - $axis(TD)) < 0 ? -1 : 1]; set step [expr $sign * $timeStep * $axis(SP) ]; if {[expr abs($diff) < abs($step)]} { set step $diff; set timeStep [expr abs($step / $axis(SP))]; } every [expr round($timeStep * 1000)] "nextstep $_axis $step $target" # set diff [expr $target - $axis(TD)]; # set mult [expr $axis(cntsPerX).0/$axis(stepsPerX)]; # set axis(TP) [expr round($diff*$mult + $axis(TP))]; # set axis(TD) $target; } # Don't handle _XQ _HX proc MG {msg} { # If msg starts with _ then return val for axis if {[string index $msg 0] == "_"} { return [eval [parse $msg]]; } else { return $msg; } } proc every {ms body} { if [eval $body] { after $ms [list every $ms $body]; } return; } proc nextstep {paxis step target} { upvar #0 $paxis axis; set mult [expr $axis(cntsPerX).0/$axis(stepsPerX)]; set axis(TP) [expr $step * $mult + $axis(TP)]; set axis(TD) [expr $axis(TD) + $step]; if {[expr abs($axis(TD) - $target.0)] < 0.5} { set axis(TS) 44; # Stopped, limit switches open return 0; } elseif {[expr abs($target - $axis(TD)) < abs($step)]} { set diff [expr $target - $axis(TD)]; set axis(TP) [expr round($diff*$mult + $axis(TP))]; set axis(TD) $target; set axis(TS) 44; # Stopped, limit switches open return 0; } else { return 1; } }