135 lines
2.6 KiB
Tcl
135 lines
2.6 KiB
Tcl
namespace eval dilhtr {
|
|
}
|
|
|
|
proc stdConfig::dilhtr {} {
|
|
variable name
|
|
variable node
|
|
|
|
controller std timeout=20
|
|
prop startcmd id
|
|
set node $node/tasks
|
|
prop start dilhtr::start
|
|
|
|
pollperiod 1 1
|
|
|
|
obj DILHTR14 wr
|
|
prop label {power set [mW]}
|
|
prop write dilhtr::write
|
|
prop read dilhtr::poll
|
|
prop cmd p
|
|
prop fact 0.001
|
|
|
|
kids "dil heater ($name)" {
|
|
node resistance out
|
|
prop write dilhtr::write
|
|
prop cmd r
|
|
|
|
node power upd
|
|
prop label "power read"
|
|
prop cmd pr
|
|
prop fact 0.001
|
|
|
|
node sigma upd
|
|
prop label "power error"
|
|
prop cmd dp
|
|
prop fact 0.001
|
|
|
|
node current upd
|
|
prop help {heater current [mA]}
|
|
prop cmd i
|
|
|
|
node voltage upd
|
|
prop help {heater voltage [mV]}
|
|
prop cmd v
|
|
|
|
node state -int upd
|
|
prop enum ok,short,open
|
|
prop cmd h
|
|
|
|
node range -int upd
|
|
prop enum low=1,mid,high
|
|
prop cmd k
|
|
|
|
node lim out
|
|
prop write dilhtr::write
|
|
prop help "correction for resistor value and power\nhappens only above this value"
|
|
prop cmd l
|
|
prop fact 0.001
|
|
|
|
node tol out
|
|
prop write dilhtr::write
|
|
prop help "correction for resistor value and power\nhappens only when difference is < tol * sigma"
|
|
prop cmd t
|
|
|
|
node timeout out
|
|
prop write dilhtr::write
|
|
prop help "after 'timeout' seconds with no connection, the heater is switched off"
|
|
prop cmd tmo
|
|
|
|
node pmin upd
|
|
|
|
node pmax upd
|
|
|
|
node cor upd
|
|
prop cmd cor
|
|
|
|
node resAdjust -int out
|
|
prop cmd ra
|
|
}
|
|
}
|
|
|
|
proc dilhtr::start {} {
|
|
sct send id
|
|
return stdSct::start
|
|
}
|
|
|
|
proc dilhtr::cmds {} {
|
|
set base [sct objectPath]
|
|
sct cmd_p $base
|
|
foreach node [hlist $base] {
|
|
catch {
|
|
set cmd [hgetpropval $base/$node cmd]
|
|
sct cmd_$cmd $base/$node
|
|
lappend query $cmd
|
|
}
|
|
}
|
|
return [join $query " "]
|
|
}
|
|
|
|
proc dilhtr::poll {{query {}}} {
|
|
set base [sct objectPath]
|
|
sct send "p [dilhtr::cmds]"
|
|
return dilhtr::update
|
|
}
|
|
|
|
proc dilhtr::update {} {
|
|
variable pathlist
|
|
|
|
set kill ""
|
|
foreach item [split [sct result]] {
|
|
set itm [split $item =]
|
|
set var [lindex $itm 0]
|
|
set val [lindex $itm 1]
|
|
catch {
|
|
set path [sct cmd_$var]
|
|
set fact [silent 1 hgetpropval $path fact]
|
|
updateval $path [expr $fact * $val]
|
|
}
|
|
}
|
|
set pr [hvali [sct objectPath]/power]
|
|
set dp [hvali [sct objectPath]/sigma]
|
|
hupdate [sct objectPath]/pmin [expr $pr - $dp]
|
|
hupdate [sct objectPath]/pmax [expr $pr + $dp]
|
|
if {$kill eq ""} {
|
|
return idle
|
|
}
|
|
sct send [string trim $kill]
|
|
return stdSct::complete
|
|
}
|
|
|
|
proc dilhtr::write {} {
|
|
set p [expr [sct target]/double([silent 1 sct fact])]
|
|
sct send "[sct cmd]=$p [dilhtr::cmds]"
|
|
return dilhtr::update
|
|
}
|