diff --git a/tcl/drivers/simramp.tcl b/tcl/drivers/simramp.tcl new file mode 100644 index 0000000..94bf78f --- /dev/null +++ b/tcl/drivers/simramp.tcl @@ -0,0 +1,71 @@ +# simulate a ramping device +# + +namespace eval simramp {} { +} + +proc stdConfig::simramp {{initvalue 0} {minvalue 0} {maxvalue 100} {time_const 60} {ramp 1e10} } { + variable name + + controller syncedprot 30 + prop write stdSct::complete + + pollperiod 6 6 + + obj SIMRAMP_$name rd + default $initvalue + prop read simramp::poll + prop lasttime 0 + prop minvalue $minvalue + prop time_const $time_const + + kids $name { + node set out + default $initvalue + prop check simramp::check_set + + node limit par $maxvalue + + node reg upd + + node ramp par $ramp + + node command par -text noop + } +} + +proc simramp::check_set {} { + if {[sct target] > [hval [sct parent]/limit]} { + error "[sct] [sct target] is above limit ([hval [sct parent]/limit])" + } + sct update [sct target] +} + +proc simramp::poll {{step 0}} { + set now [doubleTime] + set delay [expr $now - [sct lasttime]] + sct lasttime $now + set weight [expr 1.0 - exp(-$delay / double([sct time_const]))] + putIntoLimits delay 0 10 + + get_values [sct] set reg ramp + set meas [hvali [sct]] + + if {$set > $reg} { + set reg [expr $reg + $delay * $ramp] + putIntoLimits reg [sct minvalue] $set + } else { + set reg [expr $reg - $delay * $ramp] + putIntoLimits reg $set 1e10 + } + update_values [sct] reg + + putIntoLimits reg [sct minvalue] $reg + set meas [expr $meas + $weight * ($reg - $meas)] + sct update $meas + eval "[hval [sct]/command] $meas" + return idle +} + +proc noop {value} { +} diff --git a/tcl/simramp.addon b/tcl/simramp.addon new file mode 100644 index 0000000..deb96d8 --- /dev/null +++ b/tcl/simramp.addon @@ -0,0 +1,3 @@ +addonDesc = simulate ramp + +makenv ramp -driver simramp 0 0 400 0.01 0.0166666666