Files
sea/tcl/drivers/magres.tcl
2022-08-22 14:59:00 +02:00

140 lines
2.7 KiB
Tcl

# magnet resistivity measured with IPS
namespace eval magres {} {
}
proc stdConfig::magres {} {
variable hostport none
variable name
controller syncedprot
pollperiod 1 1
obj magres rd
prop read magres::read
prop last 0
prop htr 0
prop exc 0
kids "magnet resistance" {
node active out
default 0
prop enum 1
prop write magres::setactive
node coil upd
node excitation par 0.1
}
}
proc magres::setactive {} {
if {[sct target]} {
sct init 1
mf persmode 3
} else {
sct init 11
}
sct update [sct target]
return idle
}
proc magres::read {} {
if {[result mf persmode] != 3} {
# switch off immedately as a run mf has been done
updateval [sct]/active 0
return idle
}
set ramp [result mf ramp]
set ampRamp [result mf ampRamp]
if {$ramp == 0 || $ampRamp == 0} {
mf ramp 0.5
sct init 1
return idle
}
set fact [expr $ramp / $ampRamp]
set exc [hvali [sct]/excitation]
if {abs($exc) > 0.1} {
clientput "excitation is limited to 0.1 A"
set exc 0.1
}
set init [sct init]
if {[hvali [sct]/active] == 0} {
sct geterror "off"
if {$init > 0} {
if {$init <= 10} {
if {abs([result mf current] - [sct exc] * $fact) > 0.001} {
clientput "bad state of power supply"
return idle
}
set init 11
}
switch $init {
11 { mf send C3 }
12 { mf send H2 }
30 { mf send I0 }
31 { mf send A1 }
32 { mf send H0 }
33 {
mf send C1
mf persmode 1
}
34 { return idle }
default {
}
}
incr init
sct init $init
}
return idle
}
if {$init > 10 || ($init == 10 && $exc != [sct exc])} {
set init 1
}
if {$init < 10} {
switch $init {
1 {
mf send C3
}
2 { mf send T0.5000 }
3 {
mf send [format I%.4f $exc]
sct exc $exc
}
4 { mf send A1 }
5 { mf send R0 }
default {
sct init 10
return idle
}
}
incr init
sct init $init
return idle
}
set mf [expr $fact * $exc]
set curT [result mf current]
set res [expr [result mf voltage] / $curT * $fact]
set now [DoubleTime]
if {[sct htr]} {
if {$now > [sct last] + 10} {
updateval [sct]/coil $res
if {$now > [sct last] + 20} {
sct last $now
sct htr 0
mf send H0
}
}
} else {
if {$now > [sct last] + 10} {
sct update $res
if {$res > 1} {
hsetprop [sct]/coil geterror off
} elseif {$now > [sct last] + 20} {
sct last $now
sct htr 1
mf send H2
}
}
}
return idle
}