Merge branch 'master' of gitlab.psi.ch-samenv:samenv/sea

Conflicts:
	tcl/drivers/hepump.tcl
This commit is contained in:
2023-10-24 13:21:16 +02:00
21 changed files with 229 additions and 167 deletions

View File

@@ -3,7 +3,7 @@ namespace eval ccu4ext {
}
# automatic fill with level reading from external source
proc stdConfig::ccu4ext {type {readlevel 0}} {
proc stdConfig::ccu4ext {type {readpath 0}} {
variable node
variable ctrl
@@ -27,13 +27,14 @@ proc stdConfig::ccu4ext {type {readlevel 0}} {
node state upd -text
node readlevel -text par $readlevel
node readpath -text par $readpath
prop visible false
node lowlevel par 10
node highlevel par 100
node smooth upd
prop fmt %.7g
prop geterror undefined
default -1
node minfillminutes par 3.0
@@ -89,7 +90,7 @@ proc ccu4ext::changestate {type state} {
proc ccu4ext::calcsmooth {level minspeed maxspeed} {
if {![string is double $level]} {
return 999.9
return 199
}
set now [clock seconds]
set lasttime [silent 0 sct lasttime]
@@ -98,10 +99,7 @@ proc ccu4ext::calcsmooth {level minspeed maxspeed} {
}
set delta [expr $now - $lasttime]
sct lasttime $now
set smooth [hvali [sct]/smooth]
if {$smooth < 0} {
set smooth $level
}
set smooth [silent $level hvali [sct]/smooth]
set gs [expr $smooth + $delta * $maxspeed]
if {$level > $gs} {
set smooth $gs
@@ -126,6 +124,7 @@ proc ccu4ext::calcsmooth {level minspeed maxspeed} {
}
}
hupdate [sct]/smooth $smooth
hdelprop [sct]/smooth geterror
return $smooth
}
@@ -148,7 +147,8 @@ proc ccu4ext::fillExt {type} {
}
}
set errtxt ""
set sm [expr [DoubleTime] > [silent 0 sct change_time] + 10]
set now [DoubleTime]
set sm [expr $now > [silent 0 sct change_time] + 10]
switch -- $valve {
0 {
set txt "fill valve off"
@@ -178,6 +178,12 @@ proc ccu4ext::fillExt {type} {
set errtxt "unknown error"
}
}
set rdpath [hvali [sct]/readpath]
set level [hvali $rdpath]
set levelerror [silent "" hgetpropval $rdpath geterror]
if {$levelerror ne "" && $errtxt eq "" && [hvali [sct]] < 2} {
set errtxt "$txt ($rdpath $levelerror)"
}
if {$errtxt eq ""} {
updateval [sct]/state $txt
hupdate [sct]/status ""
@@ -189,11 +195,6 @@ proc ccu4ext::fillExt {type} {
changestate $type fill
return idle
}
set level [silent invalid result [hvali [sct]/readlevel]]
if {! [string is double $level]} {
hsetprop [sct]/readlevel geterror "illegal $type level reading"
return idle
}
set state [sctval [sct]]
set now [clock seconds]
set lowlevel [hvali [sct]/lowlevel]
@@ -219,6 +220,7 @@ proc ccu4ext::fillExt {type} {
return idle
}
0 { # watching
validated_level
set minspeed [expr - 100.0 / [hvali [sct]/minholdhours] / 3600.]
set maxspeed [expr - 100.0 / [hvali [sct]/maxholdhours] / 3600.]
set s [calcsmooth $level $minspeed $maxspeed]
@@ -231,13 +233,18 @@ proc ccu4ext::fillExt {type} {
}
# start fill
hset [sct] 1
clientput "$type level low - start fill"
clientput "$type level low ($level smooth $s) - start fill"
} else {
changestate $type stop
}
return idle
}
1 {
1 { # filling
if {[validated_level] eq ""} {
hset [sct] 2
changestate $type off
return idle
}
set vcmd [silent 0 sct vessel_cmd]
# check that vessel command works
if {$vcmd ne "0" && [catch {[result $vcmd]}]} {
@@ -246,7 +253,7 @@ proc ccu4ext::fillExt {type} {
set vmd 0
}
set now [clock seconds]
set s [hvali [sct]/smooth]
set s [silent $level hval [sct]/smooth]
sct minlevel [silent 999 sct minlevel]
if {$s < [sct minlevel]} {
sct minlevel $s
@@ -321,12 +328,30 @@ proc ccu4ext::fillExt {type} {
return idle
}
proc ccu4ext::validated_level {} {
set rdpath [hval [sct]/readpath]
if {[DoubleTime] < [silent 0 hgetpropval $rdpath read_time] + 30} {
return [hval $rdpath]
}
if {[silent "" hgetpropval $rdpath geterror] eq ""} {
clientlog "ERROR: no reading of $rdpath within 30 sec"
}
hsetprop $rdpath geterror not_available
return ""
}
proc ccu4ext::writeExt {type {activate 1}} {
sct update [sct target]
hupdate [sct]/smooth [silent 0 result [hvali [sct]/readlevel]]
switch -- [sct target] {
# watching
0 {
set level [validated_level]
if {$level eq ""} {
changestate $type off
sct update 2
return idle
}
hupdate [sct]/smooth $level
catch {logsetup [sct]/vext clear}
hupdate [sct]/status ""
eval [silent "expr 0" sct slow_cmd]
@@ -350,6 +375,13 @@ proc ccu4ext::writeExt {type {activate 1}} {
}
# fill
1 {
set level [validated_level]
if {$level eq ""} {
changestate $type off
sct update 2
return idle
}
hupdate [sct]/smooth $level
hupdate [sct]/status ""
set vcmd [silent 0 sct vessel_cmd]
if {$vcmd ne "0"} {

View File

@@ -8,7 +8,7 @@ proc stdConfig::ccu4flow {args} {
obj ccu4flow wr
prop write ccu4flow::setmode
prop read "ccu4flow::read [silent 0 result instconfig sensirion]"
prop read ccu4flow::read
prop dir 1
prop enum fixed=0,controlled=1,automatic=2,close=3,open=4
prop filter 0
@@ -28,10 +28,14 @@ proc stdConfig::ccu4flow {args} {
prop lastmov 0
prop hystpulse 0
prop lastist 0
set sensirion 0
foreach arg $args {
if {$arg eq "release_blocked"} {
prop release_blocked 1
}
if {$arg eq "1"} {
set sensirion 1
}
}
default 0
kids "needle valve" {
@@ -48,29 +52,35 @@ proc stdConfig::ccu4flow {args} {
node flowmax par 20
prop label "flow maximum"
node flowp upd
prop help "flow calculated from pressure before pump"
node span upd
node use_pressure par -int [expr !$sensirion]
prop enum 1
prop help "use pressure instead of flow meter for control"
node ctrl -none
kids "control parameters" {
node regtext upd -text
default regulate
prop label status
prop width 40
node prop_o par 0.1
node prop_o par 0.05
prop help {prop [sec/mbar] when opening. above 4 mbar a 10 times lower value is used}
node prop_c par 0.05
node prop_c par 0.03
prop help {prop [sec/mbar] when closing. above 4 mbar a 10 times lower value is used}
node deriv_o par 30
prop help {convergence target time [sec] when opening}
node deriv_c par 30
prop help {convergence target time [sec] when closing}
node minpulse_o out
default 0.05
prop help {minimum close pulse [sec]}
@@ -92,11 +102,11 @@ proc stdConfig::ccu4flow {args} {
node tol par 0.25
prop label tolerance
prop help {valid below 3 mbar}
node tolhigh par 0.5
prop label tol. above 4
prop help {valid above 4 mbar}
node openpulse par 60
prop help {time to open from completely closed to a significant opening}
@@ -104,7 +114,7 @@ proc stdConfig::ccu4flow {args} {
prop enum 1
prop help {adjust minpulse automatically}
}
node autoflow -none
kids "autoflow control parameters" {
flow::make ccu4flow::tmts {result tt set/reg}
@@ -112,7 +122,7 @@ proc stdConfig::ccu4flow {args} {
node calib -none
kids calib {
node ln_per_min_per_mbar par 0.9
node mbar_offset par 0.5
node mbar_offset par 0.8
}
}
}
@@ -158,21 +168,19 @@ proc ccu4flow::check_minpulse {dir} {
sct update [sct target]
}
proc ccu4flow::read {{sensirion 0}} {
proc ccu4flow::read {} {
hsetprop /cc/fa nvpath [sct]
_cc updatescript /cc/fa ccu4flow::updatemode
hsetprop /cc/f nvpath [sct]
if {$sensirion} {
hsetprop /nvflow flowsource flowmeter
hsetprop /cc/f nvctrl [sct controller]
hsetprop /cc/f flowsource pressure
_cc updatescript /cc/f ccu4flow::updateflow
catch {
hsetprop /nvflow flowsource flow
hsetprop /nvflow nvpath [sct]
hsetprop /nvflow nvctrl [sct controller]
_hemot updatescript /nvflow ccu4flow::updateflow
hsetprop /cc/f flowsource pressref
} else {
hsetprop /cc/f nvctrl [sct controller]
hsetprop /cc/f flowsource flowpress
}
_cc updatescript /cc/f ccu4flow::updateflow
return unpoll
}
@@ -220,11 +228,10 @@ proc ccu4flow::updatemode {value} {
proc ccu4flow::updateflow {value} {
# flowsource:
# pressref: just update nv/flowp
# flowmeter: update nv/flow
# flowpress: flow from pressure
# pressure: this is a pressure
# flow: this is a flow from a flowmeter
set source [silent pressure sct flowsource]
set source [silent none sct flowsource]
set n [silent 9 sct filter_n]
set filter [lrange "[silent $value sct filter] $value" end-$n end]
sct filter $filter
@@ -257,9 +264,9 @@ proc ccu4flow::updateflow {value} {
}
}
sct filtered $flow
if {$source eq "flowmeter"} {
if {$source eq "flow"} {
updateval [sct nvpath]/flow $flow
} else {
} elseif {$source eq "pressure"} {
if {$flow < -50} {
set flow -62.5
} else {
@@ -267,12 +274,10 @@ proc ccu4flow::updateflow {value} {
set fpm [hval [sct nvpath]/calib/ln_per_min_per_mbar]
set flow [expr ($flow - $off) * $fpm]
}
if {$source eq "pressref"} {
hupdate [sct nvpath]/flowp $flow
return
}
updateval_e [sct nvpath]/flow $flow -62.5 no_sensor
updateval_e [sct nvpath]/flowp $flow -62.5 no_sensor
hupdate [sct nvpath]/span $span
} else {
error "[sct] illegal flowsource: $source"
}
[sct nvctrl] queue [sct nvpath] read ccu4flow::ctrl
}
@@ -384,7 +389,11 @@ proc ccu4flow::ctrl {} {
}
set regstate [sct regstate]
set now [DoubleTime]
set ist [hvali [sct]/flow]
if {[hval [sct]/use_pressure]} {
set ist [hvali [sct]/flowp]
} else {
set ist [hvali [sct]/flow]
}
set tol [hvali [sct]/ctrl/tol]
set tolhigh [hvali [sct]/ctrl/tolhigh]
set closestate 0

View File

@@ -821,8 +821,8 @@ proc dil12::autostep {phase init} {
dil12::msg "pump for 15 more seconds"
}
}
} elseif {[sct pumptime] != 0} {
dil12::msg "there might be some mixure in TRAP A, please check"
# } elseif {[sct pumptime] != 0} {
# dil12::msg "there might be some mixure in TRAP A, please check"
}
}
init_pipes_ready {

View File

@@ -160,29 +160,33 @@ proc hepump::set_calib {} {
hsetprop /nv off_reason "pump mode changed"
sct print "pump mode change: suspend needle valve control for 20 sec."
}
return idle
return idle
}
proc hepump::read {} {
set p [expr [silent 0 result cc f] * [silent 0.6 hvali /nv/calib/ln_per_min_per_mbar]]
set f [silent 0 result nvflow]
if {[hvali [sct]/eco] == 0 && $p > 1 && $f > 0.5 && $f < 25} {
set health [expr 100 * $f / ($p / 1.2 - 0.5)]
set health [expr [silent $health sct health] * 0.95 + 0.05 * $health]
sct health $health
if {abs($health - [silent 0 hval [sct]/health]) > 1} {
sct health_cnt 0
hupdate [sct]/health [format %.1f $health]
} else {
sct health_cnt [expr [sct health_cnt] + 1]
if {[sct health_cnt] == 10} {
if {$health > 100} {set health 100}
catch {prep0 / pump_health_update [result instrument] [format %.0f $health]} msg
}
set p [silent 0 result nv flowp]
set f [silent 0 result nv flow]
set p_buf [silent 0 sct p_buf]
set f_buf [silent 0 sct f_buf]
lappend p_buf $p
lappend f_buf $f
sct p_buf [lrange $p_buf end-30 end]
sct f_buf [lrange $f_buf end-30 end]
set pmin [tcl::mathfunc::min {*}$p_buf]
set pmax [tcl::mathfunc::max {*}$p_buf]
set fmin [tcl::mathfunc::min {*}$f_buf]
set fmax [tcl::mathfunc::max {*}$f_buf]
if {[silent 0 hval [sct]/eco] == 0 && $pmin >= 1 && $fmin >= 0.5 && $fmin < 25} {
set hmax [expr round(100 * $fmax / ($pmin - 0.4))]
set hmin [expr round(100 * $fmin / ($pmax - 0.4))]
set health [silent 100 hval [sct]/health]
if {$hmax < $health} {
set health $hmax
} elseif {$hmin > $health} {
set health $hmin
}
} else {
# reset filter
hdelprop [sct] health
hupdate [sct]/health $health
catch {prep0 / pump_health_update [result instrument] [expr min($health, 100)]} msg
}
return [hepump::set_calib]
}
@@ -401,7 +405,9 @@ proc hepump::get_auto {} {
set eco [sctval [sct parent]/eco]
set lim [sctval [sct parent]/eco_t_lim 7]
set target [silent [silent $lim hval /tt/target] hval /tt/set/reg]
if {$target < $lim && [silent $lim hval /tt] < 2 * $lim} {
if {[silent 0 result nv use_pressure]} {
set ecoset 0
} elseif {$target < $lim && [silent $lim hval /tt] < 2 * $lim} {
set ecoset 0
} elseif {$target > $lim || [silent $lim hval /tt] > 3 * $lim} {
set ecoset 1

View File

@@ -895,7 +895,7 @@ proc lsc::set_curve {} {
}
#write action, direct
proc lsc::check_header {id} {
proc lsc::check_header {{id unknown}} {
upvar #0 lsc::cache_$id cache
if {[lsc::hdreq $cache([sct curveno]) [sct result]]} {
sct oldhdr [sct result]
@@ -4628,6 +4628,7 @@ proc stdConfig::lsc_end {} {
if {$lsc(samplesensor) eq ""} {
set lsc(samplesensor) $lsc(mainsensor)
}
dolater 0 fix_stick_sensors
hsetprop $path getcmd "hvali $path/$lsc(mainsensor)"
hsetprop $path getsample "hvali $path/$lsc(samplesensor)"
if {[silent "" set lsc(setsample)] ne ""} {

View File

@@ -1,7 +1,7 @@
namespace eval nvstep {
}
proc stdConfig::nvstep {} {
proc stdConfig::nvstep {args} {
variable name
controller syncedprot
@@ -9,7 +9,7 @@ proc stdConfig::nvstep {} {
obj NvStep wr
prop write nvstep::write
prop read "nvstep::read [silent 0 result instconfig sensirion]"
prop read nvstep::read
prop enum fixed=0,controlled=1,automatic=2,close=3,open=4
prop write nvstep::write
prop lastpulse 0
@@ -22,6 +22,13 @@ proc stdConfig::nvstep {} {
prop maxflow 0
default 0
set sensirion 0
foreach arg $args {
if {$arg eq "1"} {
set sensirion 1
}
}
kids "needle value" {
node flow upd
@@ -39,6 +46,10 @@ proc stdConfig::nvstep {} {
node flowp upd
prop help "flow calculated from pressure before pump"
node use_pressure par -int [expr !$sensirion]
prop enum 1
prop help "use pressure instead of flow meter for control"
node ctrl -none
kids "control parameters" {
node prop par 10
@@ -172,7 +183,11 @@ proc nvstep::poll {} {
hupdate [sct]/status $umsg
}
}
set ist [hvali [sct]/flow]
if {[hval [sct]/use_pressure]} {
set ist [hvali [sct]/flowp]
} else {
set ist [hvali [sct]/flow]
}
set tol [hvali [sct]/ctrl/tol]
set a [sct amplitude]
set t [sct t_after_delay]
@@ -270,29 +285,26 @@ proc nvstep::poll {} {
return idle
}
proc nvstep::read {{sensirion 0}} {
proc nvstep::read {} {
hsetprop /cc/fa nvpath [sct]
_cc updatescript /cc/fa nvstep::updatemode
hsetprop /cc/f nvpath [sct]
if {$sensirion} {
hsetprop /nvflow flowsource flowmeter
hsetprop /cc/f nvctrl [sct controller]
hsetprop /cc/f flowsource pressure
_cc updatescript /cc/f nvstep::updateflow
catch {
hsetprop /nvflow flowsource flow
hsetprop /nvflow nvpath [sct]
hsetprop /nvflow nvctrl [sct controller]
_hemot updatescript /nvflow nvstep::updateflow
hsetprop /cc/f flowsource pressref
} else {
hsetprop /cc/f nvctrl [sct controller]
hsetprop /cc/f flowsource flowpress
}
_cc updatescript /cc/f nvstep::updateflow
return unpoll
}
proc nvstep::updateflow {value} {
# flowsource:
# pressref: just update nv/flowp
# flowmeter: update nv/flow
# flowpress: flow from pressure
# pressure: this is a pressure
# flow: this is a flow from a flowmeter
set source [silent pressure sct flowsource]
set filter [lrange "[silent $value sct filter] $value" end-9 10]
@@ -317,21 +329,27 @@ proc nvstep::updateflow {value} {
}
}
sct filtered $flow
if {$source eq "flowmeter"} {
if {$source eq "flow"} {
if {$flow < 1} {
# avoid negative flow values, but it smooth]
set flow [expr exp($flow - 1)]
}
updateval [sct nvpath]/flow $flow
} else {
} elseif {$source eq "pressure" {
if {$flow < -50} {
set flow -62.5
} else {
set off [hval [sct nvpath]/calib/mbar_offset]
set fpm [hval [sct nvpath]/calib/ln_per_min_per_mbar]
set flow [expr ($flow - $off) * $fpm]
if {$flow < 1} {
# avoid negative flow values, but keep it smooth]
set flow [expr exp($flow - 1)]
}
}
if {$source eq "pressref"} {
hupdate [sct nvpath]/flowp $flow
return
}
updateval_e [sct nvpath]/flow $flow -62.5 no_sensor
updateval_e [sct nvpath]/flowp $flow -62.5 no_sensor
} else {
error "[sct] illegal flowsource: $source"
}
[sct nvctrl] queue [sct nvpath] read nvstep::poll
}

View File

@@ -61,11 +61,11 @@ proc stdConfig::sensirion {} {
proc sensirion::updateFlow {} {
lassign [sct result] flow stddev
if {$flow == 0 && $stddev == 0} {
if {[hgetpropval /nvflow flowsource] eq "flowmeter"} {
hsetprop /nvflow flowsource flowpress
hepump eco 0
error "invalid flow -> switched to pressure"
if {$flow == 0 && $stddev == 0 || [silent 0 sct simerror]} {
set use_pressure [silent 0 hval /nv/use_pressure]
if {! $use_pressure} {
hset /nv/use_pressure 1
clientput "ERROR: invalid flow -> switched to pressure"
}
}
sct update $flow