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