Alternative Oxford Magnet Labview interface
This commit is contained in:
@ -0,0 +1,188 @@
|
||||
# vim: ft=tcl ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent
|
||||
driver oxford10tlv = {
|
||||
protocol = std
|
||||
class = environment
|
||||
simulation_group = environment_simulation
|
||||
add_args = 'id datype interval'
|
||||
make_args = 'id datype interval'
|
||||
|
||||
group magnet = {
|
||||
type = float;
|
||||
var setpoint = {
|
||||
driveable = 'magnet/field';
|
||||
lowerlimit = -10; upperlimit = 10; tolerance = 0.01;
|
||||
property settle_time = 30;
|
||||
write_function = write_setpoint;
|
||||
checkrange_function = check_error;
|
||||
}
|
||||
var htr_sw = {
|
||||
type = int;
|
||||
writeable = 1;
|
||||
write_function = write_heater;
|
||||
read_function = read_heater; # Used in the write function
|
||||
allowed = '0,1';
|
||||
}
|
||||
var rate = {
|
||||
writeable = 1;
|
||||
write_function = write_rate;
|
||||
read_function = read_rate; # Used in the write function
|
||||
}
|
||||
var field = {
|
||||
readable = 5;
|
||||
read_command = "getF";
|
||||
read_function = read_field;
|
||||
}
|
||||
var current = { }
|
||||
var state = {
|
||||
type = text; data = false; nxsave = false; mutable = false;
|
||||
readable = 1;
|
||||
fetch_function = fetch_state;
|
||||
read_function = read_state;
|
||||
value = 'IDLE';
|
||||
property htron_delay = 10;
|
||||
property htroff_delay = 10;
|
||||
}
|
||||
}
|
||||
|
||||
code check_error = {
|
||||
@TCL
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
set my_state [hval ${tc_root}/magnet/state]
|
||||
if {${my_state} != "IDLE"} {
|
||||
error "Cannot run/drive in state '${my_state}', must be 'IDLE'"
|
||||
}
|
||||
} else {
|
||||
error "Use run/drive and not hset"
|
||||
}
|
||||
}
|
||||
@END
|
||||
}
|
||||
|
||||
code checkstatus = {
|
||||
@TCL
|
||||
@END
|
||||
}
|
||||
|
||||
code fetch_state = {
|
||||
@TCL
|
||||
set my_state [hval [sct]]
|
||||
set cmd "@@NOSEND@@"
|
||||
if {${my_state} == "START"} {
|
||||
set cmd "setHS ON\r\n@@NOREPLY@@"
|
||||
sct utime start_time
|
||||
hupdate [sct] "HTRON"
|
||||
} elseif {${my_state} == "HTRON"} {
|
||||
if {[hpropexists [sct] htron_delay]} {
|
||||
set htron_delay [sct htron_delay]
|
||||
if {$htron_delay < 10} {
|
||||
set htron_delay 30
|
||||
} elseif {$htron_delay > 60} {
|
||||
set htron_delay 30
|
||||
}
|
||||
} else {
|
||||
set htron_delay 30
|
||||
}
|
||||
if {[sct utime] - [sct start_time] > $htron_delay} {
|
||||
set cmd "setF [hval ${tc_root}/magnet/setpoint]\r\n@@NOREPLY@@"
|
||||
hupdate [sct] "DRIVE"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "DRIVE"} {
|
||||
if {[hgetpropval ${tc_root}/magnet/setpoint driving] == 0} {
|
||||
set cmd "setHS OFF\r\n@@NOREPLY@@"
|
||||
sct utime start_time
|
||||
hupdate [sct] "HTROFF"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "HTROFF"} {
|
||||
if {[hpropexists [sct] htroff_delay]} {
|
||||
set htroff_delay [sct htroff_delay]
|
||||
if {$htroff_delay <= 10} {
|
||||
set htroff_delay 30
|
||||
} elseif {$htroff_delay >= 60} {
|
||||
set htroff_delay 30
|
||||
}
|
||||
} else {
|
||||
set htroff_delay 30
|
||||
}
|
||||
if {[sct utime] - [sct start_time] > $htroff_delay} {
|
||||
hupdate [sct] "IDLE"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "IDLE"} {
|
||||
set nextState "idle"
|
||||
}
|
||||
@END
|
||||
}
|
||||
|
||||
code read_field = {
|
||||
@TCL
|
||||
set s1 [string trimright [sct result] "\n"]
|
||||
set s2 [split $s1 ";"]
|
||||
if {[llength $s2] > 1} {
|
||||
if {[string equal -nocase -length 14 "Field_Current=" [lindex $s2 0]]} {
|
||||
#hupdateif ${tc_root}/magnet/current [string range [lindex $s2 0] 14 end]
|
||||
set current [string range [lindex $s2 0] 14 end]
|
||||
hsetprop ${tc_root}/magnet/current result ${current}
|
||||
set ns [namespace current]
|
||||
sct with ${tc_root}/magnet/current "${ns}::rdValue ${tc_root}"
|
||||
}
|
||||
if {[string equal -nocase -length 12 "Field_Tesla=" [lindex $s2 1]]} {
|
||||
set data [string range [lindex $s2 1] 12 end]
|
||||
}
|
||||
}
|
||||
@END
|
||||
}
|
||||
|
||||
code read_state = {
|
||||
@TCL
|
||||
return "idle"
|
||||
@END
|
||||
}
|
||||
|
||||
code write_heater = {
|
||||
@TCL
|
||||
if {${par} == 0} {
|
||||
set cmd "setHS OFF\r\n@@NOREPLY@@"
|
||||
} elseif {${par} == 1} {
|
||||
set cmd "setHS ON\r\n@@NOREPLY@@"
|
||||
} else {
|
||||
error "Invalid parameter '${par}' should be 0 or 1"
|
||||
}
|
||||
# Invoke the read function to set the value as if read back
|
||||
sct result $par
|
||||
read_heater ${tc_root}
|
||||
@END
|
||||
}
|
||||
|
||||
code write_setpoint = {
|
||||
@TCL
|
||||
hset ${tc_root}/magnet/state "START"
|
||||
# Force the driving flag for the state check
|
||||
sct driving 1
|
||||
# Set the value on the field
|
||||
hupdateif [sct] $par
|
||||
# It's all over now
|
||||
set cmd "@@NOSEND@@"
|
||||
set nextState "idle"
|
||||
@END
|
||||
}
|
||||
|
||||
code write_rate = {
|
||||
@TCL
|
||||
if {${par} >= 0 && ${par} <= 10} {
|
||||
set cmd "setR ${par}\r\n@@NOREPLY@@"
|
||||
} else {
|
||||
error "Invalid parameter '${par}' should be 0 to 10"
|
||||
}
|
||||
# Invoke the read function to set the value as if read back
|
||||
sct result $par
|
||||
read_rate ${tc_root}
|
||||
@END
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user