72 lines
1.4 KiB
Tcl
72 lines
1.4 KiB
Tcl
# 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} {
|
|
}
|