Restructure knauer_pump.sct

This commit is contained in:
Douglas Clowes
2014-09-19 12:07:51 +10:00
parent 1a15aa5de6
commit 522865f264

View File

@ -6,7 +6,7 @@ driver knauer_pump = {
debug_threshold = 0;
vendor = knauer; device = pump40p; protocol = knauer_ap;
class = environment;
simulation_group = environment_simulation
simulation_group = environment_simulation;
#
group dummy = {
type = text; readable = 1; data = false; control = false; nxsave = false;
@ -14,53 +14,68 @@ driver knauer_pump = {
var glp = { read_command = 'GLP?'; read_function = read_glp; }
}
group volume = {
type = float;
property 'units' = 'mL';
var sensor = {
group pump = {
var state = {
type = text;
readable = 1;
read_command = ' ';
fetch_function = state_fetch;
}
var status = {
type = text;
readable = 1;
read_command = ' ';
fetch_function = status_fetch;
}
var volume_pv = {
type = float;
readable = 1;
read_command = ' ';
fetch_function = volume_fetch;
#checkrange_function = volume_reject;
#checkrange_function = volume_reject;
property 'units' = 'mL';
}
var setpoint = {
var volume_sp = {
type = float;
writeable = 1;
write_command = ' ';
write_function = volume_write;
driveable = volume/sensor;
checkstatus_function = volume_checkstatus;
driveable = pump/volume_pv
checkstatus_function = volume_checkstatus;
halt_function = volume_halt;
lowerlimit = 0; upperlimit = 100; tolerance = 0.01;
readable = 1;
read_command = ' ';
fetch_function = volume_checkpumping;
property 'units' = 'mL';
}
}
group ratios = {
type = text;
property 'units' = 'percent';
var sensor = {
var ratio_pv = {
type = text;
readable = 1; read_command = ' '; fetch_function = ratios_fetch;
property 'units' = 'percent';
}
var setpoint = {
var ratio_sp = {
type = text;
writeable = 1; write_command = ' '; write_function = ratios_write; checkrange_function = ratios_check;
property 'units' = 'percent';
}
}
group flow = {
type = float;
property 'units' = 'mL/min';
var sensor = {
var flow_pv = {
type = float;
readable = 1; read_command = ' '; fetch_function = flow_fetch;
property 'units' = 'mL/min';
}
var setpoint = {
var flow_sp = {
type = float;
writeable = 1; write_command = ' '; write_function = flow_write;
lowerlimit = 0; upperlimit = 10;
property 'units' = 'mL/min';
}
}
group stuff = {
readable = 60;
type = text;
data = false; control = false; nxsave = false;
var an_out = { read_command = 'AN_OUT?'; }
var boardinfo = { read_command = 'BOARDINFO?'; }
var config = { read_command = 'CONFIG?'; }
@ -164,18 +179,52 @@ driver knauer_pump = {
sct real_data "[join [lrange ${dlist} 0 end] ,]"
set data "Hidden in real_data property"
%%}
code status_fetch = {%%
set index 1
set data [hgetpropval ${tc_root}/dummy/status real_data]
set dlist [split ${data} ","]
set status_code [lindex ${dlist} ${index}]
set cmd "@@NOSEND@@"
if { ${status_code} == 3 } {
sct result "PUMPING"
} else {
sct result "IDLE"
}
%%}
code state_fetch = {%%
set index 1
set data [hgetpropval ${tc_root}/dummy/status real_data]
set dlist [split ${data} ","]
set state_code [lindex ${dlist} ${index}]
set cmd "@@NOSEND@@"
if { ${state_code} < 0 || ${state_code} > 9 } {
sct geterror "Invalid device_state ${state_code}"
error "[sct geterror]"
}
set slist [list "SYS_ST_INITIALIZING" \
"SYS_ST_OFF" \
"SYS_ST_IDLE" \
"SYS_ST_RUN" \
"SYS_ST_HOLD" \
"SYS_ST_PURGE" \
"SYS_ST_STANDBY" \
"SYS_ST_FAILED" \
"SYS_ST_RUNATEND" \
]
sct result [lindex ${slist} ${state_code}]
%%}
code halt = {%%
set ratios [hval ${tc_root}/ratios/setpoint]
set ratios [join [split ${ratios} /] ,]
set cmd "RAMP:0,0,${ratios},0,0,0,0,0,0,0,0,2"
set rlist [hval ${tc_root}/pump/ratio_sp]
set ratio_tgt [join [split ${rlist} /] ,]
set cmd "RAMP:0,0,${ratio_tgt},0,0,0,0,0,0,0,0,2"
%%}
code flow_fetch = {%%
set data [hgetpropval ${tc_root}/dummy/status real_data]
set dlist [split ${data} ","]
set flow [lindex ${dlist} 4]
sct result [expr {0.001 * ${flow}}]
set flow_pv [lindex ${dlist} 4]
sct result [expr {0.001 * ${flow_pv}}]
set cmd "@@NOSEND@@"
%%}
code flow_write = {%%
@ -191,12 +240,12 @@ driver knauer_pump = {
%%}
code ratios_check = {%%
set ratios [split ${setpoint} /]
if { [llength ${ratios}] != 4 } {
sct geterror "${setpoint} has [llength ${ratios}] components, needs 4"
set rlist [split ${setpoint} /]
if { [llength ${rlist}] != 4 } {
sct geterror "${setpoint} has [llength ${rlist}] components, needs 4"
error [sct geterror]
}
set sum [expr [lindex ${ratios} 0] + [lindex ${ratios} 1] + [lindex ${ratios} 2] + [lindex ${ratios} 3]]
set sum [expr [lindex ${rlist} 0] + [lindex ${rlist} 1] + [lindex ${rlist} 2] + [lindex ${rlist} 3]]
if { ${sum} != 100 } {
sct geterror "sum is ${sum}, must be 100"
error [sct geterror]
@ -206,8 +255,8 @@ driver knauer_pump = {
code ratios_fetch = {%%
set data [hgetpropval ${tc_root}/dummy/status real_data]
set dlist [split ${data} ","]
set ratios "[lindex ${dlist} 5]/[lindex ${dlist} 6]/[lindex ${dlist} 7]/[lindex ${dlist} 8]"
sct result ${ratios}
set ratio_vals "[lindex ${dlist} 5]/[lindex ${dlist} 6]/[lindex ${dlist} 7]/[lindex ${dlist} 8]"
sct result ${ratio_vals}
set cmd "@@NOSEND@@"
%%}
code ratios_write = {%%
@ -228,26 +277,25 @@ driver knauer_pump = {
if { [llength ${dlist}] > 11 } {
set pump_volm [lindex ${dlist} 10]
set pump_voln [lindex ${dlist} 11]
set volume [expr {${pump_volm} + 0.000001 * ${pump_voln}}]
set pump_volume [expr {${pump_volm} + 0.000001 * ${pump_voln}}]
} else {
set volume 0.0
set pump_volume 0.0
}
sct raw_volume ${volume}
sct raw_volume ${pump_volume}
if { [hpropexists [sct] base_volume] } {
set volume [expr {${volume} - [sct base_volume]}]
set pump_volume [expr {${pump_volume} - [sct base_volume]}]
} else {
sct base_volume [sct raw_volume]
}
sct result ${volume}
sct result ${pump_volume}
set cmd "@@NOSEND@@"
%%}
code volume_write = {%%
hsetprop ${tc_root}/[sct driveable] base_volume [hgetpropval ${tc_root}/[sct driveable] raw_volume]
hset ${tc_root}/[sct driveable] 0.0
set flow [expr {int(1000.0 * [hval ${tc_root}/flow/setpoint])}]
set ratios [hval ${tc_root}/ratios/setpoint]
set ratios [join [split ${ratios} /] ,]
set cmd "RAMP:0,${flow},${ratios},0,0,0,0,0,0,0,0,3"
set flow_tgt [expr {int(1000.0 * [hval ${tc_root}/pump/flow_sp])}]
set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,]
set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,3"
sct pumping 1
%%}
@ -261,10 +309,9 @@ driver knauer_pump = {
set sp "[sct target]"
set pv "[hval ${tc_root}/[sct driveable]]"
if { (${sp} - ${pv}) <= [sct tolerance] } {
set flow 0
set ratios [hval ${tc_root}/ratios/setpoint]
set ratios [join [split ${ratios} /] ,]
set cmd "RAMP:0,${flow},${ratios},0,0,0,0,0,0,0,0,2"
set flow_tgt 0
set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,]
set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2"
set nextState noResponse
sct pumping 0
}
@ -272,10 +319,9 @@ driver knauer_pump = {
%%}
code volume_halt = {%%
set flow 0
set ratios [hval ${tc_root}/ratios/setpoint]
set ratios [join [split ${ratios} /] ,]
set cmd "RAMP:0,${flow},${ratios},0,0,0,0,0,0,0,0,2"
set flow_tgt 0
set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,]
set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2"
sct send ${cmd}
%%}