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

2
.gitignore vendored
View File

@ -33,6 +33,7 @@ CVS
/focus /focus
/hifi /hifi
/hrpt /hrpt
/hrpt2
/morpheus /morpheus
/poldi /poldi
/ppms /ppms
@ -40,6 +41,7 @@ CVS
/seaman /seaman
/tasp /tasp
/zebra /zebra
/zebra2
/logger_tar /logger_tar
cheat_chart cheat_chart
tcl/stuff_before_2022 tcl/stuff_before_2022

View File

@ -28,7 +28,7 @@ GraphAdd 17tf.nlevel % N2_lev black
#makeCCU4 blank nv #makeCCU4 blank nv
#GraphAdd nv.flow mbar nv_flow red #GraphAdd nv.flow mbar nv_flow red
makenv ln2fill -driver ccu4ext n2 "17tf nlevel" makenv ln2fill -driver ccu4ext n2 /17tf/nlevel
#make17tfNv #make17tfNv

View File

@ -1,54 +1,13 @@
stickDesc = 100 mm dilution deviceDesc = DIL5 Frappy history recorder
set box linse-dil5 set ::secop_version 4
proc triton {kind obj name db col {htrdb ""}} { set ins [result instrument]
upvar box box if {[string match "prep*" $ins]} {
makenv $obj -driver itc$kind -port ${box}:33576 -controller _tritondil $db $htrdb set nr [string range $ins end end]
switch $kind { makenv frappy_stick -driver secop -port localhost:1521$nr
temp { } elseif {[lindex [split [info hostname] .] 0] ne $ins} {
GraphAdd $obj K_3 T_$name error "runs on instruments or prep0-9 only"
# GraphAdd $obj.raw Ohm_3 R_$name } else {
} makenv frappy_stick -driver secop -port localhost:15201
press {
GraphAdd $obj mbar_2 p_$name
}
}
} }
proc itcchan {obj name dbt dbh col setcol} {
upvar box box
makenv $obj -driver itctemp -port ${box}:3000 -controller _itcdil ${dbt}.T1 ${dbh}.H1
GraphAdd $obj K_5 T_$name
GraphAdd $obj.set K_5 T_${name}_set $setcol
# GraphAdd $obj.pow W_3 pow_$name
# GraphAdd $obj.raw Ohm_3 R_$name
}
itcchan twstill wupstill MB1 MB0 blue cyan
itcchan tonek oneK DB5 DB3 red orange
itcchan twmix wupMix DB6 DB1 green lightgreen
itcchan twivc wupIVC DB7 DB2 magenta violet
itcchan tcond cond DB8 DB3 yellow grey
triton temp tsorb sorb T1 dark_violet
triton temp tivc IVC T2 brown
triton temp tstill still T3 orange
triton temp tcp cond T4 grey
triton temp tmix mix T5 cyan H1
triton press pdump dump P1 cyan
triton press pcond cond P2 blue
triton press pstill still P3 black
triton press pfore fore P4 green
triton press pback back P5 red
makenv tmixdrv -driver drvpar /tmix
defineTemperature tmixdrv

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,5 +13,8 @@ tt set/limit 310
makeCCU4 ill5 nv n2 he makeCCU4 ill5 nv n2 he
nv set 1 nv set 1
nv ctrl/prop_o 0.05
nv ctrl/prop_c 0.03
source maxi_orange.table source maxi_orange.table

View File

@ -5,11 +5,11 @@ device stick_menu "ma6 dil2 dil3 dil4 coil"
makenv tt -driver [lsdriver] { makenv tt -driver [lsdriver] {
lsc_sensor tm A -sensor x48581 -sensorname VTI lsc_sensor tm A -sensor x48581 -sensorname VTI
lsc_sensor ts C -sensorname sample
lsc_sensor ts_2 D -sensor code -sensorname sample2
# 2023-07-06: sample sensor seems defect, use hx sensor # 2023-07-06: sample sensor seems defect, use hx sensor
# lsc_sensor ts C -sensorname sample # lsc_sensor ts D -sensorname sample
# lsc_sensor ts_2 D -sensor code -sensorname sample2 # lsc_sensor ts_2 C -sensor code -sensorname sample2
lsc_sensor ts D -sensorname sample
lsc_sensor ts_2 C -sensor code -sensorname sample2
lsc_loop set -loop 1 -channel A -maxheater 32W -resist 80Ohm -color green lsc_loop set -loop 1 -channel A -maxheater 32W -resist 80Ohm -color green
if {[lsdriver] eq "336_lsc"} { if {[lsdriver] eq "336_lsc"} {
lsc_loop setsamp -loop 2 -channel C -maxheater 62.5W -resist 20Ohm -color dark_green -loopname sample lsc_loop setsamp -loop 2 -channel C -maxheater 62.5W -resist 20Ohm -color dark_green -loopname sample
@ -20,7 +20,7 @@ makenv tt -driver [lsdriver] {
makeCCU4 ma6 nv he_ilm makeCCU4 ma6 nv he_ilm
hupdate /nv/set 1.2 hupdate /nv/set 1.5
makeN2Fill ccu4ilm { makeN2Fill ccu4ilm {
ln2fill lowlevel 10 ln2fill lowlevel 10
ln2fill highlevel 100 ln2fill highlevel 100

View File

@ -1,4 +1,4 @@
stickDesc = standard MA6 stick stickDesc = standard MA6 stick
stick_sensors x63163 undefined stick_sensors x63161 undefined
# stick_sensors x63161 x63163 #stick_sensors x63161 x63163 # sensor 2 wiring defect

View File

@ -1,4 +1,4 @@
deviceDesc = FRAPPY history recorder, with stick deviceDesc = MB11 Frappy history recorder
set ::secop_version 4 set ::secop_version 4
@ -11,6 +11,5 @@ if {[string match "prep*" $ins]} {
error "runs on instruments or prep0-9 only" error "runs on instruments or prep0-9 only"
} else { } else {
makenv frappy_main -driver secop -port localhost:15101 makenv frappy_main -driver secop -port localhost:15101
makenv frappy_stick -driver secop -port localhost:15201
makeHePump makeHePump
} }

13
tcl/mb11.stick Normal file
View File

@ -0,0 +1,13 @@
deviceDesc = MB11 stick Frappy history recorder
set ::secop_version 4
set ins [result instrument]
if {[string match "prep*" $ins]} {
set nr [string range $ins end end]
makenv frappy_stick -driver secop -port localhost:1521$nr
} elseif {[lindex [split [info hostname] .] 0] ne $ins} {
error "runs on instruments or prep0-9 only"
} else {
makenv frappy_stick -driver secop -port localhost:15201
}

View File

@ -628,7 +628,7 @@ proc stick_sensors {sensor1 sensor2} {
source config/stick.list source config/stick.list
if {[string match "code*" $sensor2]} { if {[string match "code*" $sensor2]} {
set code [lindex [split $sensor2=0 =] 1] set code [lindex [split $sensor2=0 =] 1]
set table_code [silent -1 set stick_cfgtable($stick_name)] set table_code [silent 0 set stick_cfgtable($stick_name)]
if {$table_code != $code} { if {$table_code != $code} {
clientput "ERROR: code $code in $stick_name.stick does not match value from config/sticklist: $table_code" clientput "ERROR: code $code in $stick_name.stick does not match value from config/sticklist: $table_code"
} }
@ -652,6 +652,16 @@ proc stick_sensors {sensor1 sensor2} {
} }
} }
proc fix_stick_sensors {} {
# fix stick sensors
foreach path {/tt/ts/curve /tt/ts_2/curve} {
set curv [silent "" sctval $path]
if {$curv ne ""} {
hset $path $curv
}
}
}
proc ts_sensor {sensor} { proc ts_sensor {sensor} {
catch { catch {
catch { catch {

View File

@ -19,7 +19,7 @@ proc makeHeFill {levcmd} {
if {$levcmd eq "ccu"} { if {$levcmd eq "ccu"} {
makenv hefill he_ext_ccu ccu makenv hefill he_ext_ccu ccu
} elseif {$levcmd eq "ccu4ilm"} { } elseif {$levcmd eq "ccu4ilm"} {
makenv hefill -driver ccu4ext he lev makenv hefill -driver ccu4ext he /lev
lappend fast_cmd {lev mode 1} lappend fast_cmd {lev mode 1}
lappend slow_cmd {lev mode 0} lappend slow_cmd {lev mode 0}
} else { } else {
@ -90,7 +90,7 @@ proc makeN2Fill {{option ccu} {code 0}} {
GraphAdd n2.upper K_2 N2_Upper red GraphAdd n2.upper K_2 N2_Upper red
GraphAdd n2.lower K_2 N2_Lower green GraphAdd n2.lower K_2 N2_Lower green
} elseif {$option eq "ccu4ilm"} { } elseif {$option eq "ccu4ilm"} {
makenv ln2fill -driver ccu4ext n2 "lev n2" makenv ln2fill -driver ccu4ext n2 /lev/n2
GraphAdd lev.n2 % "N2_level" black GraphAdd lev.n2 % "N2_level" black
if {! $c} { if {! $c} {
# switch silently to inactive # switch silently to inactive

View File

@ -20,13 +20,14 @@ proc makeCCU4 {args} {
set badargs [list] set badargs [list]
set cfgdev "0" set cfgdev "0"
set hepump 0 set hepump 0
set sensirion [silent 0 result instconfig sensirion]
foreach arg $args { foreach arg $args {
switch $arg { switch $arg {
nv - nv_release_blocked { nv - nv_release_blocked {
if {$arg eq "nv_release_blocked"} { if {$arg eq "nv_release_blocked"} {
makenv nv -driver ccu4flow release_blocked makenv nv -driver ccu4flow release_blocked $sensirion
} else { } else {
makenv nv -driver ccu4flow makenv nv -driver ccu4flow $sensirion
} }
# GraphAdd cc.f mbar nv_flow red # GraphAdd cc.f mbar nv_flow red
GraphAdd nv.flow ln/min nv_flow magenta GraphAdd nv.flow ln/min nv_flow magenta
@ -117,6 +118,7 @@ proc makeCCU4 {args} {
} }
if {$hepump} { if {$hepump} {
makeHePump makeHePump
hsetprop /nv hepump /hepump
} }
set cfg [ccu4_get_device_config $cfgdev codesfile] set cfg [ccu4_get_device_config $cfgdev codesfile]
if {$cfg eq "" || [llength $badargs] > 0} { if {$cfg eq "" || [llength $badargs] > 0} {

8
tcl/startup/dilpars.tcl Normal file
View File

@ -0,0 +1,8 @@
proc apply_dilpars {} {
catch {
ts auto/condenseflow [hval dilpars/condenseflow]
}
catch {
ts auto/circulateflow [hval dilpars/circulateflow]
}
}

View File

@ -161,7 +161,7 @@ proc flow::make {{getT flow::tmts} {getS "result tt tr"} {getF "result nv flow"}
node difRange par 7 node difRange par 7
node flowSize par 10 node flowSize par 10
node convTime par 30 node convTime par 30
node Tmin par 1.5 node Tmin par 10
node script -text par "flow::task" node script -text par "flow::task"
prop width 24 prop width 24
node getTemp -text par "$getT" node getTemp -text par "$getT"

View File

@ -177,7 +177,7 @@ proc get_param_values {hp} {
} }
proc check_or_do {doit service cfgs} { proc check_or_do {doit service cfgs} {
# result: 1: no change needed, 0: change needed, 2: failure # result: 1: no change needed, 0: change needed, "ERROR:...": failure
set result 1 set result 1
set config "" set config ""
set stick "" set stick ""
@ -199,7 +199,7 @@ proc check_or_do {doit service cfgs} {
if {$doit} { if {$doit} {
if {[hval /device/confirmed] eq [hval /device/name]} { if {[hval /device/confirmed] eq [hval /device/name]} {
set msg "do not allow frappy to change from [hval /device/name] to $config" set msg "do not allow frappy to change from [hval /device/name] to $config"
clientlog $msg clientlog ERROR:$msg
return $msg return $msg
} }
clientlog 0 clientlog 0