190 lines
4.5 KiB
Tcl
190 lines
4.5 KiB
Tcl
namespace eval warmup {
|
|
}
|
|
|
|
proc stdConfig::warmup {} {
|
|
variable name
|
|
|
|
controller syncedprot
|
|
pollperiod 1 1
|
|
|
|
obj Warmup wr
|
|
prop read warmup::poll
|
|
prop write warmup::write
|
|
prop enum 1
|
|
prop label "warmup control for SCH5"
|
|
prop endtime 0
|
|
prop start 0
|
|
default 1
|
|
kids "warmup control" {
|
|
node trig par 10
|
|
prop help "switch on sample heater when ts < target - trig and tm < target"
|
|
|
|
node weight par 0.4
|
|
prop help "switch off sample heater when ts > target - weight * (target - ts)"
|
|
|
|
node limit par 70
|
|
prop help "do not use warmup when target < limit"
|
|
|
|
node timef par 0.5
|
|
prop label "settle time factor"
|
|
prop help "reset double control after (timef * int2) sec"
|
|
|
|
node abruptstop par 1
|
|
prop enum 1
|
|
prop label "abrupt stop"
|
|
prop help "switch off sample heater immediately after tm > treg"
|
|
|
|
node warmup -int out
|
|
prop check warmup::check
|
|
prop write stdSct::complete
|
|
prop enum off,warmup,htroff,settle
|
|
default 0
|
|
}
|
|
}
|
|
|
|
proc warmup::check {} {
|
|
if {[sct target]} {
|
|
if {![hvali [sct]]} {
|
|
warmup::on
|
|
}
|
|
} else {
|
|
if {[hvali [sct]]} {
|
|
warmup::off
|
|
}
|
|
}
|
|
}
|
|
|
|
proc warmup::write {} {
|
|
if {[sct target]} {
|
|
if {![hvali [sct]]} {
|
|
warmup::off
|
|
}
|
|
} elseif {[hvali [sct]/warmup]} {
|
|
warmup::off
|
|
}
|
|
hsetprop /tt/dout reset_value 1
|
|
hsetprop /tt/dout reset_item "heater switch"
|
|
sct update [sct target]
|
|
return idle
|
|
}
|
|
|
|
proc warmup::on {} {
|
|
hupdate [sct objectPath]/warmup 1
|
|
nv autoflow/suspended 1
|
|
hsetprop /tt dblctrl_sleep [expr [DoubleTime] + 10]
|
|
}
|
|
|
|
proc warmup::htroff {} {
|
|
clientput "warmup: htr off"
|
|
hupdate [sct objectPath]/warmup 2
|
|
sct start [DoubleTime]
|
|
tt set/mode 0
|
|
tt dblctrl/tshift 0
|
|
}
|
|
|
|
proc warmup::settle {} {
|
|
clientput "warmup: autoflow off"
|
|
hupdate [sct objectPath]/warmup 3
|
|
tt dout 1
|
|
tt set/resist 50
|
|
# volodia wants to use ~55 Volts
|
|
tt set/maxheater 2A
|
|
# tt dblctrl/tshift [expr [hvali /tt/tm] - [hvali /tt/target]]
|
|
tt set/mode 1
|
|
# hsetprop /tt dblctrl_sleep 0
|
|
nv autoflow/suspended 1
|
|
sct start [DoubleTime]
|
|
}
|
|
|
|
proc warmup::off {} {
|
|
clientput "warmup: normal reg"
|
|
hupdate [sct objectPath]/warmup 0
|
|
nv autoflow/suspended 0
|
|
hsetprop /tt dblctrl_sleep 0
|
|
}
|
|
|
|
proc warmup::poll {} {
|
|
# if {[silent 0 sct setoff]} {
|
|
# tt set/mode 1
|
|
# sct setoff 0
|
|
# warmup::off
|
|
# }
|
|
if {[hvali [sct]] == 0} {
|
|
sct update 0
|
|
if {[silent 0 hgetpropval /tt/dout target] != 1} {
|
|
tt dout 1
|
|
}
|
|
return idle
|
|
}
|
|
set trig [hvali [sct]/trig]
|
|
set weight [hvali [sct]/weight]
|
|
set limit [hvali [sct]/limit]
|
|
set ts [hvali /tt/ts]
|
|
set tm [hvali /tt/tm]
|
|
set target [silent 0 hgetpropval tt target]
|
|
set d [expr ($ts - $target) * $weight]
|
|
switch -- [hvali [sct]/warmup] {
|
|
0 { # off
|
|
if {$ts < $target - $trig && $tm < $target + $d && $tm < $target && $target >= $limit} {
|
|
warmup::on
|
|
}
|
|
if {[silent 0 hgetpropval /tt/dout target] != 1} {
|
|
tt dout 1
|
|
}
|
|
}
|
|
1 { # warmup
|
|
set setp [expr $target + $d]
|
|
set now [DoubleTime]
|
|
if {[silent 0 hgetpropval /tt/dout target] != 2} {
|
|
tt dout 2
|
|
clientput "warmup: sample heater on $target $d"
|
|
tt set/resist 25
|
|
tt set/maxheater 2A
|
|
sct lasttm $tm
|
|
}
|
|
# dout will be reset to 1 when reset_time expires
|
|
hsetprop /tt/dout reset_time [expr [DoubleTime] + 10]
|
|
hupdate /tt/dblctrl/tshift $d
|
|
set setlimit [hvali /tt/set/limit]
|
|
if {$target <= $setlimit && $setp > $setlimit} {
|
|
set setp $setlimit
|
|
}
|
|
internalset /tt/set $setp
|
|
if {$ts >= $target || ([hvali [sct]/abruptstop] && $tm >= $setp)} {
|
|
if {[hvali [sct]/abruptstop]} {
|
|
warmup::htroff
|
|
} else {
|
|
warmup::settle
|
|
}
|
|
} elseif {$tm < $setp || $tm > [silent 0 sct lasttm]} {
|
|
sct lastinc $now
|
|
sct lasttm $tm
|
|
hsetprop /tt dblctrl_sleep [expr $now + 10]
|
|
} elseif {$now > [silent 0 sct lastinc] + 12} {
|
|
clientput tm_decrease
|
|
warmup::settle
|
|
}
|
|
}
|
|
2 { # htroff
|
|
hsetprop /tt dblctrl_sleep [expr [DoubleTime] + 10]
|
|
if {[DoubleTime] > [sct start] + 10} {
|
|
warmup::settle
|
|
}
|
|
}
|
|
3 { # settle
|
|
# hsetprop /tt dblctrl_sleep [expr [DoubleTime] + 10]
|
|
set tr [hvali /tt/set/reg]
|
|
set int2 [hvali /tt/dblctrl/int2]
|
|
set now [DoubleTime]
|
|
if {$ts > $target ||
|
|
[DoubleTime] > [sct start] + $int2 * [hvali [sct]/timef]} {
|
|
tt dblctrl/tshift 0
|
|
warmup::off
|
|
}
|
|
}
|
|
}
|
|
sct update [hvali [sct]]
|
|
return idle
|
|
}
|
|
|