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

69 lines
1.6 KiB
Tcl

namespace eval lambdawatch {} {
}
proc stdConfig::lambdawatch {safefield maxfield safetemp args} {
controller syncedprot
prop write lambdawatch::write
pollperiod 15 15
obj LambdaWatch rd
prop read lambdawatch::loop
prop cntlim 10
prop cnt 0
kids "lambda watch" {
node safefield out
default $safefield
node maxfield out
default $maxfield
node safetemp out
default $safetemp
node coiltemp -text par "$args"
prop width 32
}
}
proc lambdawatch::write {} {
hupdate [sct parent]/status ""
sct update [sct target]
return idle
}
proc lambdawatch::loop {} {
set saff [hval [sct]/safefield]
set mf [result mf]
if {$mf <= $saff} {
if {[hval [sct]/status] ne "" && ([result mf limit] > $saff || [result mf] < $saff - 0.01)} {
hupdate [sct]/status ""
}
sct update 4.5
return idle
}
set saft [hval [sct]/safetemp]
set maxf [hval [sct]/maxfield]
set limt [expr $saft + ($maxf - $mf) / ($maxf - $saff) * (4.5 - $saft)]
sct update $limt
set cnt [sct cnt]
foreach node [hval [sct]/coiltemp] {
if {[hval $node] > $limt} {
clientput [format "WARNING: %s > %g" $node $limt]
incr cnt 2
} else {
incr cnt -1
}
}
if {$cnt < [sct cntlim]} {
sct cnt [expr max(0, $cnt)]
return idle
}
if {[result mf targetValue] > $saff || ![string match "* mf *" " [split [listexe]] "]} {
set txt [format "lambda controller getting warm, set mf and limit to %s" $saff]
hupdate [sct]/status $txt
run mf $saff
mf limit $saff
clientlog "ERROR: $txt"
}
return idle
}