Files
sea/tcl/drivers/warmup.tcl
2022-08-18 15:04:28 +02:00

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
}