diff --git a/site_ansto/instrument/config/environment/knauer_pump.sct b/site_ansto/instrument/config/environment/knauer_pump.sct index e2288c48..a8c3bd43 100644 --- a/site_ansto/instrument/config/environment/knauer_pump.sct +++ b/site_ansto/instrument/config/environment/knauer_pump.sct @@ -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} %%}