Create fake DMC2280 controllers.
r1138 | ffr | 2006-10-13 09:06:05 +1000 (Fri, 13 Oct 2006) | 2 lines
This commit is contained in:
committed by
Douglas Clowes
parent
fdd815680f
commit
572b77fac2
108
site_ansto/instrument/TEST_SICS/fakeDMC/simAxis.tcl
Normal file
108
site_ansto/instrument/TEST_SICS/fakeDMC/simAxis.tcl
Normal file
@@ -0,0 +1,108 @@
|
||||
# $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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user