namespace eval ccu4he { } proc stdConfig::ccu4he {} { variable node variable path controller syncedprot pollperiod 5 5 obj ccu4flow wr prop check ccu4he::writeCmd prop write stdSct::complete prop read ccu4he::readCmd prop enum watching,fill,inactive,manualfill kids "LHe fill" { node fast alias /cc/hf node state upd -text node hefull alias /cc/hh node helow alias /cc/hl node smooth upd node undershoot par 30 node minfillminutes par 3.0 node maxfillminutes par 30.0 } } proc ccu4he::writeCmd {} { switch -- [sct target] { 0 { # watching cc hcd 0 cc ha 1 } 1 - 3 { # fill / manualfill cc hf 1 cc hcd 1 cc ha 1 sct smooth [silent 10 hval /cc/h] } 2 { # inactive cc hcd 0 cc ha 0 } } hupdate [sct]/status "" sct update [sct target] } proc ccu4he::readCmd {} { set stxt "" switch -- [hvali /cc/hsf] { 1 { set stxt " / LHe sensor warm" } 2 { set stxt " / no LHe sensor connected" } 3 { set stxt " / LHe measure timeout" } 4 { set stxt " / LHe sensor not yet read" } default { } } if {[sctval [sct]] == 3} { # manual fill cc hf 1 cc hcd 1 cc ha 1 updateval [sct]/state manual_fill$stxt return idle } set level [hvali /cc/h] if {[sctval [sct]] == 1} { # filling set full_level [hval /cc/hh] if {$level < $full_level} { # else CCU4 will stop set now [DoubleTime] set delta [expr min(30, $now - [silent $now sct last_time])] sct last_time $now set smooth [silent $level sct smooth] # minimum fill speed set smooth [expr $smooth + $delta / 0.6 / [hval [sct]/maxfillminutes]] if {$level > $smooth} { # maximum fill speed set smooth [expr $smooth + $delta / 0.6 / [hval [sct]/minfillminutes]] } sct smooth $smooth hupdate [sct]/smooth $smooth if {$smooth > min($full_level, $level + [hval [sct]/undershoot])} { if {$smooth > $full_level} { sct update 0 # watching cc hcd 0 cc ha 1 clientput "stopped LHe fill at $level %, as projected level [format %.4g $smooth] > $full_level" } else { sct update 2 # timeout cc hcd 0 cc ha 0 hupdate [sct]/status "fill timeout: not increasing enough" clientput "stopped and disabled LHe fill, as level is not increasing enough" } return idle } } } elseif {[sctval [sct]] == 0} { # watching sct smooth $level hupdate [sct]/smooth [sct smooth] if {[hval [sct]/status] ne ""} { hupdate [sct]/status "" } } else { sct smooth $level hupdate [sct]/smooth [sct smooth] } switch -- [hvali /cc/hv] { 0 { set txt "fill valve off" if {[hvali /cc/hsf] == 2} { # no sensor sct update 2 } else { if {[hvali /cc/ha]} { sct update 0 } else { sct update 2 } } } 1 { set txt "filling" sct update 1 } 2 { set txt "no fill valve" sct update 2 } 3 { set txt timeout sct update 2 } 4 { set txt timeout1 sct update 2 } default { set txt "unknown error" sct update 2 } } updateval [sct]/state "$txt$stxt" return idle }