From 0606e66f9012d908bd58668ccf54b760e0c5a951 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Fri, 12 Sep 2014 13:35:20 +1000 Subject: [PATCH 01/12] Add new sics_config.ini for Taipan TODO SICS-779 Changing sample_stage to 12tmagnet_sample_insert doesn't work. --- .../tas/config/motors/motor_configuration.tcl | 113 ++--- .../instrument/tas/util/sics_config.ini | 400 ++++++++++++------ 2 files changed, 331 insertions(+), 182 deletions(-) diff --git a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl index b37eaad2..a63341d2 100644 --- a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl @@ -4,9 +4,6 @@ # FastShutter is currently set on Quokka only #::utility::mkVar FastShutter text manager FastShutter false instrument true false -# SET TO 1 TO USE THE TILT STAGE ie sample phi and chi -set use_tiltstage 0 - set animal taipan set sim_mode [SplitReply [motor_simulation]] @@ -93,6 +90,40 @@ set move_count 100 ############################ # +# CHOOSE HERE for sample stage configuration +########################################## +# Set axis_config as follows to use different axis configurations +# 0: normal stage configuration +# 1: Oxford magnet sample stick +set axis_config 0 + +if { [ info exists ::config_dict ] } { + if { [ dict exists $::config_dict sample_stage implementation ] } { + set implementation [ dict get $::config_dict sample_stage implementation ] + if {$implementation == "normal_sample_stage"} { + set axis_config 0 + } elseif {$implementation == "12tmagnet_sample_insert"} { + set axis_config 1 + } else { + set axis_config 0 + } + } +} + +switch $axis_config { + 0 { + set use_normal_config "true" + } + 1 { + set magmot "ms1" + set magmot_aq "mc2" + set magmot_axis "A" + set use_normal_config "false" + fileeval $cfPath(motors)/magnet_configuration.tcl + } +} + + # Dummy translation motor, useful for testing scans Motor dummy_motor asim [params \ @@ -138,36 +169,6 @@ dummy_s1 softupperlim 180 dummy_s1 precision 0.02 dummy_s1 home 0 -if { [ info exists ::config_dict ] && [ dict get $::config_dict s1_sample_insert enabled ] } { - set samp_stage_name "s1ss" - set tilt_motor_driver_type asim - - Motor s1 $motor_driver_type [params \ - asyncqueue mc2\ - host mc2-taipan\ - port pmc2-taipan\ - axis A\ - units degrees\ - hardlowerlim -1440\ - hardupperlim 1440\ - maxSpeed 1\ - maxAccel 1\ - maxDecel 1\ - stepsPerX [expr 67.0 * 25000 / 360]\ - absEnc 1\ - absEncHome 31275743\ - cntsPerX [expr 67.0 * 8192 / 360]] - s1 part sample - s1 long_name s1 - s1 softlowerlim -180 - s1 softupperlim 180 - s1 home 0 -} else { - set samp_stage_name "s1" - set tilt_motor_driver_type $motor_driver_type -} - -#if $use_tiltstage { # mc1: Monochromator crystal selection rotation/Tilt Motor mtilt $motor_driver_type [params \ asyncqueue mc1\ @@ -189,9 +190,7 @@ mtilt long_name mtilt mtilt softlowerlim -5 mtilt softupperlim 5 mtilt home 0 -#} -set atest mtilt # mc1: Monochromator Linear (Translate) Motor mtrans $motor_driver_type [params \ @@ -384,27 +383,29 @@ stl home 0.0 stl backlash_offset -0.2 # mc2: Sample Rotate -Motor $samp_stage_name $motor_driver_type [params \ - asyncqueue mc2\ - host mc2-taipan\ - port pmc2-taipan\ - axis E\ - units degrees\ - hardlowerlim -194\ - hardupperlim 134\ - maxSpeed 4\ - maxAccel 2\ - maxDecel 2\ - stepsPerX 12495\ - absEnc 1\ - absEncHome 10695068\ - cntsPerX 4096] -$samp_stage_name part sample -$samp_stage_name long_name $samp_stage_name -$samp_stage_name softlowerlim -170 -$samp_stage_name softupperlim 120 -$samp_stage_name home 35.997 -$samp_stage_name backlash_offset -0.2 +if {$use_normal_config == "true"} { + Motor s1 $motor_driver_type [params \ + asyncqueue mc2\ + host mc2-taipan\ + port pmc2-taipan\ + axis E\ + units degrees\ + hardlowerlim -194\ + hardupperlim 134\ + maxSpeed 4\ + maxAccel 2\ + maxDecel 2\ + stepsPerX 12495\ + absEnc 1\ + absEncHome 10695068\ + cntsPerX 4096] + s1 part sample + s1 long_name s1 + s1 softlowerlim -170 + s1 softupperlim 120 + s1 home 35.997 + s1 backlash_offset -0.2 +} # mc2: Analyser Detector Rotate -- Sample Scattering Angle # absEncHome 20728908\ at -50 diff --git a/site_ansto/instrument/tas/util/sics_config.ini b/site_ansto/instrument/tas/util/sics_config.ini index a6d20e29..2051ff37 100644 --- a/site_ansto/instrument/tas/util/sics_config.ini +++ b/site_ansto/instrument/tas/util/sics_config.ini @@ -1,156 +1,304 @@ -[12tmagnet] -desc = "12 Tesla Oxford Magnet" -driver = "12tmagnet" -enabled = False -group = environment:magnet -id = 11 -ip = 10.157.205.3 -name = magnetic -port = 55001 -type = B - [12tmagnet_setup] -cascade = 12tmagnet,s1_sample_insert,mercury_scpi +cascade = B1:12tmagnet_oxford,sample_stage:12tmagnet_sample_insert,T1:mercury_scpi_01 enabled = False -group = 0setup - -[ls336_1] -desc = "tc1: Lakeshore 336 temperature controller" -driver = "ls336" +[CF1] +cascade = T1:CF1_ls340,sample_stage:normal_sample_stage +enabled = False +[Default] +cascade = sample_stage:normal_sample_stage +enabled = True +[B1] +datype = B enabled = False -group = environment:temperature id = 1 -ip = 10.157.205.28 -name = tc1 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_12] -desc = "tc6: Lakeshore 336 temperature controller" -driver = "ls336" +implementation = none +name = magnet1 +optype = magnetic_field +[Function_Generator] +datype = V enabled = False -group = environment:temperature -id = 6 -ip = 10.157.205.31 -name = tc6 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_2] -desc = "tc2: Lakeshore 336 temperature controller" -driver = "ls336" +id = 1 +implementation = none +name = pulser +optype = function_generator +[I1] +datype = I +enabled = False +id = 1 +implementation = none +name = curr1 +optype = multimeter +[I2] +datype = I enabled = False -group = environment:temperature id = 2 -ip = 10.157.205.29 +implementation = none +name = curr2 +optype = multimeter +[T1] +datype = T +enabled = False +id = 1 +implementation = none +name = tc1 +optype = temperature +[T2] +datype = T +enabled = False +id = 2 +implementation = none name = tc2 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_4] -desc = "tc3: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[T3] +datype = T enabled = False -group = environment:temperature id = 3 -ip = 10.157.205.30 +implementation = none name = tc3 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_5] -desc = "tc4: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[T4] +datype = T enabled = False -group = environment:temperature id = 4 -ip = 137.157.201.21 +implementation = none name = tc4 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_6] -desc = "tc5: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[V1] +datype = V enabled = False -group = environment:temperature -id = 5 -ip = 137.157.201.21 -name = tc5 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T +id = 1 +implementation = none +name = volts1 +optype = multimeter +[V2] +datype = V +enabled = False +id = 2 +implementation = none +name = volts2 +optype = multimeter +[sample_stage] +enabled = Always +implementation = normal_sample_stage +name = sample_stage +optype = motion_axis +[12tmagnet_oxford] +asyncqueue = sct +desc = "12 Tesla Oxford Magnet" +driver = "oxford12tlv" +imptype = magnetic_field +interval = 5 +ip = 10.157.205.3 +port = 55001 -[ls340_1] -desc = "tc13: Lakeshore 340 temperature controller" +[12tmagnet_sample_insert] +desc = "s1 will be redefined as the magnet sample insert rotation." +imptype = motion_axis + +[CF1_ls340] +desc = "cf1: Bottom loading cryofurnace" driver = "ls340" -enabled = False -group = environment:temperature -id = 13 -ip = 137.157.203.137 -name = tc13 +imptype = temperature +ip = 10.157.205.43 port = 4001 terminator = \r\n tol1 = 1.0 tol2 = 1.0 -type = T -[ls370] -desc = "tc8: Lakeshore 370 temperature controller" -driver = "ls370" -enabled = False -group = environment:temperature -id = 8 -ip = 137.157.203.137 -name = tc8 -port = 4003 +[agilent_33220A] +asyncqueue = sct +desc = "Function Generator" +driver = agilent_33220A +imptype = function_generator +ip = 10.157.205.16 +name = pulser +port = 5025 + +[ls336_01] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.28 +port = 7777 terminator = \r\n -tol = 2.0 -type = T +tol1 = 1.0 +tol2 = 1.0 -[mercury_scpi] -desc = "tc9: Oxford Mercury temperature controller in Mercury mode" -driver = "mercury_scpi" -enabled = False -group = environment:temperature -id = 9 +[ls336_02] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.29 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_04] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.30 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_05] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 137.157.201.21 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_06] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.30 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_11] +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.27 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_12] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.31 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_01] +asyncqueue = sct +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4001 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_02] +asyncqueue = sct +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4002 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_11] +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4001 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[mercury_scpi_01] +desc = "Oxford Mercury temperature controller with three temperature loops." +driver = "mercury_base" +imptype = temperature ip = 10.157.205.5 -name = tc9 -offifon = mercury_itc500 +permlink = LT port = 7020 -terminator = \r -tol = 2.0 -type = T +terminator = \r\n +tol = 1.0 +valve_tol = 2 -[s1_sample_insert] -desc = "s1 will be defined as the sample insert rotation. Sample stage will be renamed to s1ss and sgu and sgl will be simulated" -enabled = False -group = motors +[mercury_scpi_02] +desc = "Oxford Mercury temperature controller with four temperature loops and needle valve control" +driver = "mercury_scpi" +imptype = temperature +ip = 10.157.205.47 +permlink = LT +port = 7020 +terminator = \r\n +tol = 1.0 +valve_tol = 2 -[west4100] -desc = "tc10: Blue furnace temperature controller" +[normal_sample_stage] +desc = "This is the default sample stage configuration" +imptype = motion_axis + +[protek_01] +asyncqueue = sct +desc = "Protek Multimeter" +driver = "protekmm" +imptype = multimeter +ip = 10.157.205.36 +port = 4001 + +[protek_02] +asyncqueue = sct +desc = "Protek Multimeter" +driver = "protekmm" +imptype = multimeter +ip = 10.157.205.37 +port = 4001 + +[vf1_west4100] +asyncqueue = sct +desc = "VF1 Blue furnace temperature controller" +dev_id = 1 driver = "west4100" -enabled = False -group = environment:temperature -id = 10 -ip = 10.157.205.19 -name = tc10 -type = T +imptype = temperature +ip = 10.157.205.24 +port = 502 + +[vf1_west6100] +asyncprotocol = modbus_ap +desc = "VF1 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.24 +port = 502 +timeout = 2000 + +[vf2_west4100] +asyncqueue = sct +desc = "VF2 Blue furnace temperature controller" +dev_id = 1 +driver = "west4100" +imptype = temperature +ip = 10.157.205.25 +port = 502 + +[vf2_west6100] +asyncprotocol = modbus_ap +desc = "VF2 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.25 +port = 502 +timeout = 2000 From 2852cc9d794d3a0ac0766066627c687a4ad50955 Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Tue, 16 Sep 2014 11:27:37 +1000 Subject: [PATCH 02/12] Fix IP address of Pelican HV --- site_ansto/instrument/pelican/config/hmm/sct_hv.tcl | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl b/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl index 2aa761c7..8e21185e 100644 --- a/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl +++ b/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl @@ -418,7 +418,7 @@ publish set_data_record user MakeAsyncProtocol std -MakeAsyncQueue hvport std 10.157.205.10 4001 +MakeAsyncQueue hvport std 137.157.202.215 55011 # Main process call to create the driver ::scobj::hv::mkHV { name "hv" @@ -427,9 +427,3 @@ MakeAsyncQueue hvport std 10.157.205.10 4001 tuning 1 interval 5 } - - - - - - From 12d4e7dce5dba57bbc2d133445a525c82ff76fa5 Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Thu, 18 Sep 2014 17:07:00 +1000 Subject: [PATCH 03/12] First pass driver for the Knauer BlueShadow Pump 40P --- .../config/environment/knauer_pump.sct | 286 ++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 site_ansto/instrument/config/environment/knauer_pump.sct diff --git a/site_ansto/instrument/config/environment/knauer_pump.sct b/site_ansto/instrument/config/environment/knauer_pump.sct new file mode 100644 index 00000000..e2288c48 --- /dev/null +++ b/site_ansto/instrument/config/environment/knauer_pump.sct @@ -0,0 +1,286 @@ +# +# Template driver for the Knauer BlueShadow Pump 40P +# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent +# +driver knauer_pump = { + debug_threshold = 0; + vendor = knauer; device = pump40p; protocol = knauer_ap; + class = environment; + simulation_group = environment_simulation +# + group dummy = { + type = text; readable = 1; data = false; control = false; nxsave = false; + var status = { read_command = 'STATUS?'; read_function = read_status; } + var glp = { read_command = 'GLP?'; read_function = read_glp; } + } + + group volume = { + type = float; + property 'units' = 'mL'; + var sensor = { + readable = 1; + read_command = ' '; + fetch_function = volume_fetch; + #checkrange_function = volume_reject; + } + var setpoint = { + writeable = 1; + write_command = ' '; + write_function = volume_write; + driveable = volume/sensor; + checkstatus_function = volume_checkstatus; + halt_function = volume_halt; + lowerlimit = 0; upperlimit = 100; tolerance = 0.01; + readable = 1; + read_command = ' '; + fetch_function = volume_checkpumping; + } + } + group ratios = { + type = text; + property 'units' = 'percent'; + var sensor = { + readable = 1; read_command = ' '; fetch_function = ratios_fetch; + } + var setpoint = { + writeable = 1; write_command = ' '; write_function = ratios_write; checkrange_function = ratios_check; + } + } + group flow = { + type = float; + property 'units' = 'mL/min'; + var sensor = { + readable = 1; read_command = ' '; fetch_function = flow_fetch; + } + var setpoint = { + writeable = 1; write_command = ' '; write_function = flow_write; + lowerlimit = 0; upperlimit = 10; + } + } + + group stuff = { + readable = 60; + type = text; + var an_out = { read_command = 'AN_OUT?'; } + var boardinfo = { read_command = 'BOARDINFO?'; } + var config = { read_command = 'CONFIG?'; } + var cprofinfo = { read_command = 'CPROFINFO?'; } + var dout = { read_command = 'DOUT?'; } + var error = { read_command = 'ERROR?'; } + var errors = { read_command = 'ERRORS?'; } + var flushpmp = { read_command = 'FLUSHPMP?'; } + var head = { read_command = 'HEAD?'; } + var head_par = { read_command = 'HEAD_PAR?'; } + var identify = { read_command = 'IDENTIFY?'; } + var lpg = { read_command = 'LPG?'; } + var oem = { read_command = 'OEM?'; } + var opt = { read_command = 'OPT?'; } + var plim = { read_command = 'PLIM?'; } + var pressure = { read_command = 'PRESSURE?'; } + var prfastacq = { read_command = 'PRFASTACQ?'; } + var purge = { read_command = 'PURGE?'; } + var remote = { read_command = 'REMOTE?'; } + var rfid = { read_command = 'RFID?'; } + var service = { read_command = 'SERVICE?'; } + var sysinfo = { read_command = 'SYSINFO?'; } + var 'units' = { read_command = 'UNITS?'; } + var valves = { read_command = 'VALVES?'; } + } + group prog = { + readable = 30; + type = text; + var line_01 = { read_command = "TT_GET:1,1"; } + var line_02 = { read_command = "TT_GET:1,2"; } + var line_03 = { read_command = "TT_GET:1,3"; } + var line_04 = { read_command = "TT_GET:1,4"; } + var line_05 = { read_command = "TT_GET:1,5"; } + } + group glp = { + type = text; + readable = 1; + fetch_function = fetch_from_glp; + var board_time = { read_command = '0'; } + var motor_time = { read_command = '1'; } + var head_count = { read_command = '3'; } + var head_time = { read_command = '4'; } + var head_volm = { read_command = '5'; } + var head_voln = { read_command = '6'; } + var head_pwrhi = { read_command = '7'; } + var head_pwrlo = { read_command = '8'; } + var pump_revs = { read_command = '9'; } + var pump_volm = { read_command = '10'; } + var pump_voln = { read_command = '11'; } + var pump_pwrhi = { read_command = '12'; } + var pump_pwrlo = { read_command = '13'; } + } + group status = { + type = text; + readable = 1; + fetch_function = fetch_from_status; + var state = { read_command = '1'; } + var cur_error = { read_command = '2'; } + var cur_run_time = { read_command = '3'; } + var flow_rate = { read_command = '4'; } + var lpg_0 = { read_command = '5'; } + var lpg_1 = { read_command = '6'; } + var lpg_2 = { read_command = '7'; } + var lpg_3 = { read_command = '8'; } + var evt_0 = { read_command = '9'; } + var evt_1 = { read_command = '10'; } + var evt_2 = { read_command = '11'; } + var evt_3 = { read_command = '12'; } + var evt_4 = { read_command = '13'; } + var evt_5 = { read_command = '14'; } + var evt_6 = { read_command = '15'; } + var evt_7 = { read_command = '16'; } + var cur_pres = { read_command = '17'; } + var start_in = { read_command = '18'; } + var error_in = { read_command = '19'; } + } + + code fetch_from_glp = {%% + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + %%} + + code fetch_from_status = {%% + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + %%} + + code read_glp = {%% + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" + %%} + code read_status = {%% + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" + %%} + + 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" + %%} + + 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 cmd "@@NOSEND@@" + %%} + code flow_write = {%% + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + %%} + + code ratios_check = {%% + set ratios [split ${setpoint} /] + if { [llength ${ratios}] != 4 } { + sct geterror "${setpoint} has [llength ${ratios}] components, needs 4" + error [sct geterror] + } + set sum [expr [lindex ${ratios} 0] + [lindex ${ratios} 1] + [lindex ${ratios} 2] + [lindex ${ratios} 3]] + if { ${sum} != 100 } { + sct geterror "sum is ${sum}, must be 100" + error [sct geterror] + } + %%} + + 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 cmd "@@NOSEND@@" + %%} + code ratios_write = {%% + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + %%} + + code volume_fetch = {%% + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + 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}}] + } else { + set volume 0.0 + } + sct raw_volume ${volume} + if { [hpropexists [sct] base_volume] } { + set volume [expr {${volume} - [sct base_volume]}] + } else { + sct base_volume [sct raw_volume] + } + sct result ${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" + sct pumping 1 + %%} + + code volume_checkpumping = {%% + set cmd "@@NOSEND@@" + set nextState idle + if { [hpropexists [sct] pumping] && [sct pumping] } { + if { [hpropexists [sct] driving] && [sct driving] } { + volume_checkstatus "${tc_root}" + } + 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 nextState noResponse + sct pumping 0 + } + } + %%} + + 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" + sct send ${cmd} + %%} + + code volume_reject = {%% + sct geterror "cannot use hset on [sct]" + error "[sct geterror]" + %%} +} From 1a15aa5de67c652af5dc3829b9394c743111071a Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Thu, 18 Sep 2014 17:07:30 +1000 Subject: [PATCH 04/12] Generated Knauer driver --- .../config/environment/sct_knauer_pump.tcl | 1820 +++++++++++++++++ 1 file changed, 1820 insertions(+) create mode 100644 site_ansto/instrument/config/environment/sct_knauer_pump.tcl diff --git a/site_ansto/instrument/config/environment/sct_knauer_pump.tcl b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl new file mode 100644 index 00000000..dda04d9f --- /dev/null +++ b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl @@ -0,0 +1,1820 @@ +# Generated driver for knauer_pump +# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent +# + +namespace eval ::scobj::knauer_pump { + set debug_threshold 0 +} + +proc ::scobj::knauer_pump::debug_log {tc_root debug_level debug_string} { + set catch_status [ catch { + set debug_threshold [hgetpropval ${tc_root} debug_threshold] + if {${debug_level} >= ${debug_threshold}} { + set fd [open "../log/knauer_pump_[basename ${tc_root}].log" "a"] + set line "[clock format [clock seconds] -format "%T"] ${debug_string}" + puts ${fd} "${line}" + close ${fd} + } + } catch_message ] +} + +proc ::scobj::knauer_pump::sics_log {debug_level debug_string} { + set catch_status [ catch { + set debug_threshold ${::scobj::knauer_pump::debug_threshold} + if {${debug_level} >= ${debug_threshold}} { + sicslog "::scobj::knauer_pump::${debug_string}" + } + } catch_message ] +} + +# checklimits function for driveable interface +proc ::scobj::knauer_pump::checklimits {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checklimits tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checklimits hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + sct driving 0 + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# check function for hset change +proc ::scobj::knauer_pump::checkrange {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checkrange tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checkrange hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::fetch_from_glp {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "fetch_from_glp tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# fetch_from_glp hook code starts + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" +# fetch_from_glp hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "fetch_from_glp sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::fetch_from_status {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "fetch_from_status tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# fetch_from_status hook code starts + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" +# fetch_from_status hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "fetch_from_status sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::flow_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "flow_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# flow_fetch hook code starts + 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 cmd "@@NOSEND@@" +# flow_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "flow_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::flow_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "flow_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# flow_write hook code starts + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } +# flow_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "flow_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::getValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "getValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# getValue hook code goes here + debug_log ${tc_root} 1 "getValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to check the write parameter on a device +proc ::scobj::knauer_pump::noResponse {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "noResponse tc_root=${tc_root} sct=[sct] resp=[sct result]" +# noResponse hook code goes here + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# check function for hset change +proc ::scobj::knauer_pump::ratios_check {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_check tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# ratios_check hook code starts + set ratios [split ${setpoint} /] + if { [llength ${ratios}] != 4 } { + sct geterror "${setpoint} has [llength ${ratios}] components, needs 4" + error [sct geterror] + } + set sum [expr [lindex ${ratios} 0] + [lindex ${ratios} 1] + [lindex ${ratios} 2] + [lindex ${ratios} 3]] + if { ${sum} != 100 } { + sct geterror "sum is ${sum}, must be 100" + error [sct geterror] + } +# ratios_check hook code ends + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::ratios_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# ratios_fetch hook code starts + 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 cmd "@@NOSEND@@" +# ratios_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "ratios_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::ratios_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# ratios_write hook code starts + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } +# ratios_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "ratios_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::rdValue {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "rdValue tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# rdValue hook code goes here + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::read_glp {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "read_glp tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# read_glp hook code starts + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" +# read_glp hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::read_status {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "read_status tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# read_status hook code starts + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" +# read_status hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::setValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "setValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# setValue hook code goes here + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "setValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::volume_checkpumping {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_checkpumping tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# volume_checkpumping hook code starts + set cmd "@@NOSEND@@" + set nextState idle + if { [hpropexists [sct] pumping] && [sct pumping] } { + if { [hpropexists [sct] driving] && [sct driving] } { + volume_checkstatus "${tc_root}" + } + 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 nextState noResponse + sct pumping 0 + } + } +# volume_checkpumping hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "volume_checkpumping sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# checkstatus function for driveable interface +proc ::scobj::knauer_pump::volume_checkstatus {tc_root} { + set catch_status [ catch { +# volume_checkstatus hook code goes here + if {[sct driving]} { + set sp "[sct target]" + set pv "[hval ${tc_root}/[sct driveable]]" + if { abs(${pv} - ${sp}) <= [sct tolerance] } { + if { [hpropexists [sct] settle_time] } { + if { [hpropexists [sct] settle_time_start] } { + if { [sct utime] - [sct settle_time_start] >= [sct settle_time]} { + sct driving 0 + return "idle" + } + return "busy" + } else { + sct utime settle_time_start + return "busy" + } + } + sct driving 0 + return "idle" + } + if { [hpropexists [sct] settle_time_start] } { + hdelprop [sct] settle_time_start + } + return "busy" + } else { + return "idle" + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::volume_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# volume_fetch hook code starts + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + 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}}] + } else { + set volume 0.0 + } + sct raw_volume ${volume} + if { [hpropexists [sct] base_volume] } { + set volume [expr {${volume} - [sct base_volume]}] + } else { + sct base_volume [sct raw_volume] + } + sct result ${volume} + set cmd "@@NOSEND@@" +# volume_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "volume_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# halt function for driveable interface +proc ::scobj::knauer_pump::volume_halt {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_halt tc_root=${tc_root} sct=[sct] driving=[sct driving]" + ### TODO hset [sct] [hval [sct]] +# volume_halt hook code starts + 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" + sct send ${cmd} +# volume_halt hook code ends + sct driving 0 + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::volume_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# volume_write hook code starts + 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" + sct pumping 1 +# volume_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "volume_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } { + ::scobj::knauer_pump::sics_log 9 "::scobj::knauer_pump::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + set ns "[namespace current]" + set catch_status [ catch { + + MakeSICSObj ${name} SCT_OBJECT + + sicslist setatt ${name} klass ${device_class} + sicslist setatt ${name} long_name ${name} + + set scobj_hpath /sics/${name} + + hfactory ${scobj_hpath}/dummy plain spy none + hsetprop ${scobj_hpath}/dummy data "false" + hsetprop ${scobj_hpath}/dummy klass "@none" + hsetprop ${scobj_hpath}/dummy type "part" + + hfactory ${scobj_hpath}/dummy/glp plain user text + hsetprop ${scobj_hpath}/dummy/glp read ${ns}::getValue ${scobj_hpath} read_glp {GLP?} + hsetprop ${scobj_hpath}/dummy/glp read_glp ${ns}::read_glp ${scobj_hpath} + hsetprop ${scobj_hpath}/dummy/glp control false + hsetprop ${scobj_hpath}/dummy/glp data false + hsetprop ${scobj_hpath}/dummy/glp mutable true + hsetprop ${scobj_hpath}/dummy/glp nxsave false + hsetprop ${scobj_hpath}/dummy/glp oldval UNKNOWN + hsetprop ${scobj_hpath}/dummy/glp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/dummy/glp type "part" + hsetprop ${scobj_hpath}/dummy/glp nxalias "${name}_dummy_glp" + + hfactory ${scobj_hpath}/dummy/status plain user text + hsetprop ${scobj_hpath}/dummy/status read ${ns}::getValue ${scobj_hpath} read_status {STATUS?} + hsetprop ${scobj_hpath}/dummy/status read_status ${ns}::read_status ${scobj_hpath} + hsetprop ${scobj_hpath}/dummy/status control false + hsetprop ${scobj_hpath}/dummy/status data false + hsetprop ${scobj_hpath}/dummy/status mutable true + hsetprop ${scobj_hpath}/dummy/status nxsave false + hsetprop ${scobj_hpath}/dummy/status oldval UNKNOWN + hsetprop ${scobj_hpath}/dummy/status sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/dummy/status type "part" + hsetprop ${scobj_hpath}/dummy/status nxalias "${name}_dummy_status" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/dummy/glp 1 + ${sct_controller} poll ${scobj_hpath}/dummy/status 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/flow plain spy none + hsetprop ${scobj_hpath}/flow data "true" + hsetprop ${scobj_hpath}/flow klass "@none" + hsetprop ${scobj_hpath}/flow type "part" + + hfactory ${scobj_hpath}/flow/sensor plain user float + hsetprop ${scobj_hpath}/flow/sensor read ${ns}::flow_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/flow/sensor rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/flow/sensor control true + hsetprop ${scobj_hpath}/flow/sensor data true + hsetprop ${scobj_hpath}/flow/sensor mutable true + hsetprop ${scobj_hpath}/flow/sensor nxsave true + hsetprop ${scobj_hpath}/flow/sensor oldval 0.0 + hsetprop ${scobj_hpath}/flow/sensor klass "parameter" + hsetprop ${scobj_hpath}/flow/sensor sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/flow/sensor type "part" + hsetprop ${scobj_hpath}/flow/sensor units "mL/min" + hsetprop ${scobj_hpath}/flow/sensor nxalias "${name}_flow_sensor" + + hfactory ${scobj_hpath}/flow/setpoint plain user float + hsetprop ${scobj_hpath}/flow/setpoint write ${ns}::flow_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/flow/setpoint noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/flow/setpoint check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/flow/setpoint control true + hsetprop ${scobj_hpath}/flow/setpoint data true + hsetprop ${scobj_hpath}/flow/setpoint mutable true + hsetprop ${scobj_hpath}/flow/setpoint nxsave true + hsetprop ${scobj_hpath}/flow/setpoint lowerlimit 0 + hsetprop ${scobj_hpath}/flow/setpoint upperlimit 10 + hsetprop ${scobj_hpath}/flow/setpoint oldval 0.0 + hsetprop ${scobj_hpath}/flow/setpoint klass "parameter" + hsetprop ${scobj_hpath}/flow/setpoint sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/flow/setpoint type "part" + hsetprop ${scobj_hpath}/flow/setpoint units "mL/min" + hsetprop ${scobj_hpath}/flow/setpoint nxalias "${name}_flow_setpoint" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/flow/sensor 1 + ${sct_controller} write ${scobj_hpath}/flow/setpoint + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/glp plain spy none + hsetprop ${scobj_hpath}/glp data "true" + hsetprop ${scobj_hpath}/glp klass "@none" + hsetprop ${scobj_hpath}/glp type "part" + + hfactory ${scobj_hpath}/glp/board_time plain user text + hsetprop ${scobj_hpath}/glp/board_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {0} + hsetprop ${scobj_hpath}/glp/board_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/board_time control true + hsetprop ${scobj_hpath}/glp/board_time data true + hsetprop ${scobj_hpath}/glp/board_time mutable true + hsetprop ${scobj_hpath}/glp/board_time nxsave true + hsetprop ${scobj_hpath}/glp/board_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/board_time klass "parameter" + hsetprop ${scobj_hpath}/glp/board_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/board_time type "part" + hsetprop ${scobj_hpath}/glp/board_time nxalias "${name}_glp_board_time" + + hfactory ${scobj_hpath}/glp/head_count plain user text + hsetprop ${scobj_hpath}/glp/head_count read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {3} + hsetprop ${scobj_hpath}/glp/head_count rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_count control true + hsetprop ${scobj_hpath}/glp/head_count data true + hsetprop ${scobj_hpath}/glp/head_count mutable true + hsetprop ${scobj_hpath}/glp/head_count nxsave true + hsetprop ${scobj_hpath}/glp/head_count oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_count klass "parameter" + hsetprop ${scobj_hpath}/glp/head_count sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_count type "part" + hsetprop ${scobj_hpath}/glp/head_count nxalias "${name}_glp_head_count" + + hfactory ${scobj_hpath}/glp/head_pwrhi plain user text + hsetprop ${scobj_hpath}/glp/head_pwrhi read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {7} + hsetprop ${scobj_hpath}/glp/head_pwrhi rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_pwrhi control true + hsetprop ${scobj_hpath}/glp/head_pwrhi data true + hsetprop ${scobj_hpath}/glp/head_pwrhi mutable true + hsetprop ${scobj_hpath}/glp/head_pwrhi nxsave true + hsetprop ${scobj_hpath}/glp/head_pwrhi oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_pwrhi klass "parameter" + hsetprop ${scobj_hpath}/glp/head_pwrhi sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_pwrhi type "part" + hsetprop ${scobj_hpath}/glp/head_pwrhi nxalias "${name}_glp_head_pwrhi" + + hfactory ${scobj_hpath}/glp/head_pwrlo plain user text + hsetprop ${scobj_hpath}/glp/head_pwrlo read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {8} + hsetprop ${scobj_hpath}/glp/head_pwrlo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_pwrlo control true + hsetprop ${scobj_hpath}/glp/head_pwrlo data true + hsetprop ${scobj_hpath}/glp/head_pwrlo mutable true + hsetprop ${scobj_hpath}/glp/head_pwrlo nxsave true + hsetprop ${scobj_hpath}/glp/head_pwrlo oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_pwrlo klass "parameter" + hsetprop ${scobj_hpath}/glp/head_pwrlo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_pwrlo type "part" + hsetprop ${scobj_hpath}/glp/head_pwrlo nxalias "${name}_glp_head_pwrlo" + + hfactory ${scobj_hpath}/glp/head_time plain user text + hsetprop ${scobj_hpath}/glp/head_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {4} + hsetprop ${scobj_hpath}/glp/head_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_time control true + hsetprop ${scobj_hpath}/glp/head_time data true + hsetprop ${scobj_hpath}/glp/head_time mutable true + hsetprop ${scobj_hpath}/glp/head_time nxsave true + hsetprop ${scobj_hpath}/glp/head_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_time klass "parameter" + hsetprop ${scobj_hpath}/glp/head_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_time type "part" + hsetprop ${scobj_hpath}/glp/head_time nxalias "${name}_glp_head_time" + + hfactory ${scobj_hpath}/glp/head_volm plain user text + hsetprop ${scobj_hpath}/glp/head_volm read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {5} + hsetprop ${scobj_hpath}/glp/head_volm rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_volm control true + hsetprop ${scobj_hpath}/glp/head_volm data true + hsetprop ${scobj_hpath}/glp/head_volm mutable true + hsetprop ${scobj_hpath}/glp/head_volm nxsave true + hsetprop ${scobj_hpath}/glp/head_volm oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_volm klass "parameter" + hsetprop ${scobj_hpath}/glp/head_volm sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_volm type "part" + hsetprop ${scobj_hpath}/glp/head_volm nxalias "${name}_glp_head_volm" + + hfactory ${scobj_hpath}/glp/head_voln plain user text + hsetprop ${scobj_hpath}/glp/head_voln read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {6} + hsetprop ${scobj_hpath}/glp/head_voln rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_voln control true + hsetprop ${scobj_hpath}/glp/head_voln data true + hsetprop ${scobj_hpath}/glp/head_voln mutable true + hsetprop ${scobj_hpath}/glp/head_voln nxsave true + hsetprop ${scobj_hpath}/glp/head_voln oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_voln klass "parameter" + hsetprop ${scobj_hpath}/glp/head_voln sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_voln type "part" + hsetprop ${scobj_hpath}/glp/head_voln nxalias "${name}_glp_head_voln" + + hfactory ${scobj_hpath}/glp/motor_time plain user text + hsetprop ${scobj_hpath}/glp/motor_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {1} + hsetprop ${scobj_hpath}/glp/motor_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/motor_time control true + hsetprop ${scobj_hpath}/glp/motor_time data true + hsetprop ${scobj_hpath}/glp/motor_time mutable true + hsetprop ${scobj_hpath}/glp/motor_time nxsave true + hsetprop ${scobj_hpath}/glp/motor_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/motor_time klass "parameter" + hsetprop ${scobj_hpath}/glp/motor_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/motor_time type "part" + hsetprop ${scobj_hpath}/glp/motor_time nxalias "${name}_glp_motor_time" + + hfactory ${scobj_hpath}/glp/pump_pwrhi plain user text + hsetprop ${scobj_hpath}/glp/pump_pwrhi read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {12} + hsetprop ${scobj_hpath}/glp/pump_pwrhi rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_pwrhi control true + hsetprop ${scobj_hpath}/glp/pump_pwrhi data true + hsetprop ${scobj_hpath}/glp/pump_pwrhi mutable true + hsetprop ${scobj_hpath}/glp/pump_pwrhi nxsave true + hsetprop ${scobj_hpath}/glp/pump_pwrhi oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_pwrhi klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_pwrhi sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_pwrhi type "part" + hsetprop ${scobj_hpath}/glp/pump_pwrhi nxalias "${name}_glp_pump_pwrhi" + + hfactory ${scobj_hpath}/glp/pump_pwrlo plain user text + hsetprop ${scobj_hpath}/glp/pump_pwrlo read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {13} + hsetprop ${scobj_hpath}/glp/pump_pwrlo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_pwrlo control true + hsetprop ${scobj_hpath}/glp/pump_pwrlo data true + hsetprop ${scobj_hpath}/glp/pump_pwrlo mutable true + hsetprop ${scobj_hpath}/glp/pump_pwrlo nxsave true + hsetprop ${scobj_hpath}/glp/pump_pwrlo oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_pwrlo klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_pwrlo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_pwrlo type "part" + hsetprop ${scobj_hpath}/glp/pump_pwrlo nxalias "${name}_glp_pump_pwrlo" + + hfactory ${scobj_hpath}/glp/pump_revs plain user text + hsetprop ${scobj_hpath}/glp/pump_revs read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {9} + hsetprop ${scobj_hpath}/glp/pump_revs rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_revs control true + hsetprop ${scobj_hpath}/glp/pump_revs data true + hsetprop ${scobj_hpath}/glp/pump_revs mutable true + hsetprop ${scobj_hpath}/glp/pump_revs nxsave true + hsetprop ${scobj_hpath}/glp/pump_revs oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_revs klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_revs sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_revs type "part" + hsetprop ${scobj_hpath}/glp/pump_revs nxalias "${name}_glp_pump_revs" + + hfactory ${scobj_hpath}/glp/pump_volm plain user text + hsetprop ${scobj_hpath}/glp/pump_volm read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {10} + hsetprop ${scobj_hpath}/glp/pump_volm rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_volm control true + hsetprop ${scobj_hpath}/glp/pump_volm data true + hsetprop ${scobj_hpath}/glp/pump_volm mutable true + hsetprop ${scobj_hpath}/glp/pump_volm nxsave true + hsetprop ${scobj_hpath}/glp/pump_volm oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_volm klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_volm sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_volm type "part" + hsetprop ${scobj_hpath}/glp/pump_volm nxalias "${name}_glp_pump_volm" + + hfactory ${scobj_hpath}/glp/pump_voln plain user text + hsetprop ${scobj_hpath}/glp/pump_voln read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {11} + hsetprop ${scobj_hpath}/glp/pump_voln rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_voln control true + hsetprop ${scobj_hpath}/glp/pump_voln data true + hsetprop ${scobj_hpath}/glp/pump_voln mutable true + hsetprop ${scobj_hpath}/glp/pump_voln nxsave true + hsetprop ${scobj_hpath}/glp/pump_voln oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_voln klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_voln sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_voln type "part" + hsetprop ${scobj_hpath}/glp/pump_voln nxalias "${name}_glp_pump_voln" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/glp/board_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_count 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_pwrhi 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_pwrlo 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_volm 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_voln 1 + ${sct_controller} poll ${scobj_hpath}/glp/motor_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_pwrhi 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_pwrlo 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_revs 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_volm 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_voln 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/prog plain spy none + hsetprop ${scobj_hpath}/prog data "true" + hsetprop ${scobj_hpath}/prog klass "@none" + hsetprop ${scobj_hpath}/prog type "part" + + hfactory ${scobj_hpath}/prog/line_01 plain user text + hsetprop ${scobj_hpath}/prog/line_01 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,1} + hsetprop ${scobj_hpath}/prog/line_01 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_01 control true + hsetprop ${scobj_hpath}/prog/line_01 data true + hsetprop ${scobj_hpath}/prog/line_01 mutable true + hsetprop ${scobj_hpath}/prog/line_01 nxsave true + hsetprop ${scobj_hpath}/prog/line_01 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_01 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_01 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_01 type "part" + hsetprop ${scobj_hpath}/prog/line_01 nxalias "${name}_prog_line_01" + + hfactory ${scobj_hpath}/prog/line_02 plain user text + hsetprop ${scobj_hpath}/prog/line_02 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,2} + hsetprop ${scobj_hpath}/prog/line_02 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_02 control true + hsetprop ${scobj_hpath}/prog/line_02 data true + hsetprop ${scobj_hpath}/prog/line_02 mutable true + hsetprop ${scobj_hpath}/prog/line_02 nxsave true + hsetprop ${scobj_hpath}/prog/line_02 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_02 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_02 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_02 type "part" + hsetprop ${scobj_hpath}/prog/line_02 nxalias "${name}_prog_line_02" + + hfactory ${scobj_hpath}/prog/line_03 plain user text + hsetprop ${scobj_hpath}/prog/line_03 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,3} + hsetprop ${scobj_hpath}/prog/line_03 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_03 control true + hsetprop ${scobj_hpath}/prog/line_03 data true + hsetprop ${scobj_hpath}/prog/line_03 mutable true + hsetprop ${scobj_hpath}/prog/line_03 nxsave true + hsetprop ${scobj_hpath}/prog/line_03 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_03 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_03 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_03 type "part" + hsetprop ${scobj_hpath}/prog/line_03 nxalias "${name}_prog_line_03" + + hfactory ${scobj_hpath}/prog/line_04 plain user text + hsetprop ${scobj_hpath}/prog/line_04 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,4} + hsetprop ${scobj_hpath}/prog/line_04 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_04 control true + hsetprop ${scobj_hpath}/prog/line_04 data true + hsetprop ${scobj_hpath}/prog/line_04 mutable true + hsetprop ${scobj_hpath}/prog/line_04 nxsave true + hsetprop ${scobj_hpath}/prog/line_04 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_04 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_04 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_04 type "part" + hsetprop ${scobj_hpath}/prog/line_04 nxalias "${name}_prog_line_04" + + hfactory ${scobj_hpath}/prog/line_05 plain user text + hsetprop ${scobj_hpath}/prog/line_05 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,5} + hsetprop ${scobj_hpath}/prog/line_05 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_05 control true + hsetprop ${scobj_hpath}/prog/line_05 data true + hsetprop ${scobj_hpath}/prog/line_05 mutable true + hsetprop ${scobj_hpath}/prog/line_05 nxsave true + hsetprop ${scobj_hpath}/prog/line_05 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_05 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_05 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_05 type "part" + hsetprop ${scobj_hpath}/prog/line_05 nxalias "${name}_prog_line_05" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/prog/line_01 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_02 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_03 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_04 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_05 30 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/ratios plain spy none + hsetprop ${scobj_hpath}/ratios data "true" + hsetprop ${scobj_hpath}/ratios klass "@none" + hsetprop ${scobj_hpath}/ratios type "part" + + hfactory ${scobj_hpath}/ratios/sensor plain user text + hsetprop ${scobj_hpath}/ratios/sensor read ${ns}::ratios_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/ratios/sensor rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/ratios/sensor control true + hsetprop ${scobj_hpath}/ratios/sensor data true + hsetprop ${scobj_hpath}/ratios/sensor mutable true + hsetprop ${scobj_hpath}/ratios/sensor nxsave true + hsetprop ${scobj_hpath}/ratios/sensor oldval UNKNOWN + hsetprop ${scobj_hpath}/ratios/sensor klass "parameter" + hsetprop ${scobj_hpath}/ratios/sensor sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/ratios/sensor type "part" + hsetprop ${scobj_hpath}/ratios/sensor units "percent" + hsetprop ${scobj_hpath}/ratios/sensor nxalias "${name}_ratios_sensor" + + hfactory ${scobj_hpath}/ratios/setpoint plain user text + hsetprop ${scobj_hpath}/ratios/setpoint write ${ns}::ratios_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/ratios/setpoint noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/ratios/setpoint check ${ns}::ratios_check ${scobj_hpath} + hsetprop ${scobj_hpath}/ratios/setpoint control true + hsetprop ${scobj_hpath}/ratios/setpoint data true + hsetprop ${scobj_hpath}/ratios/setpoint mutable true + hsetprop ${scobj_hpath}/ratios/setpoint nxsave true + hsetprop ${scobj_hpath}/ratios/setpoint oldval UNKNOWN + hsetprop ${scobj_hpath}/ratios/setpoint klass "parameter" + hsetprop ${scobj_hpath}/ratios/setpoint sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/ratios/setpoint type "part" + hsetprop ${scobj_hpath}/ratios/setpoint units "percent" + hsetprop ${scobj_hpath}/ratios/setpoint nxalias "${name}_ratios_setpoint" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/ratios/sensor 1 + ${sct_controller} write ${scobj_hpath}/ratios/setpoint + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/status plain spy none + hsetprop ${scobj_hpath}/status data "true" + hsetprop ${scobj_hpath}/status klass "@none" + hsetprop ${scobj_hpath}/status type "part" + + hfactory ${scobj_hpath}/status/cur_error plain user text + hsetprop ${scobj_hpath}/status/cur_error read ${ns}::fetch_from_status ${scobj_hpath} rdValue {2} + hsetprop ${scobj_hpath}/status/cur_error rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_error control true + hsetprop ${scobj_hpath}/status/cur_error data true + hsetprop ${scobj_hpath}/status/cur_error mutable true + hsetprop ${scobj_hpath}/status/cur_error nxsave true + hsetprop ${scobj_hpath}/status/cur_error oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_error klass "parameter" + hsetprop ${scobj_hpath}/status/cur_error sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_error type "part" + hsetprop ${scobj_hpath}/status/cur_error nxalias "${name}_status_cur_error" + + hfactory ${scobj_hpath}/status/cur_pres plain user text + hsetprop ${scobj_hpath}/status/cur_pres read ${ns}::fetch_from_status ${scobj_hpath} rdValue {17} + hsetprop ${scobj_hpath}/status/cur_pres rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_pres control true + hsetprop ${scobj_hpath}/status/cur_pres data true + hsetprop ${scobj_hpath}/status/cur_pres mutable true + hsetprop ${scobj_hpath}/status/cur_pres nxsave true + hsetprop ${scobj_hpath}/status/cur_pres oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_pres klass "parameter" + hsetprop ${scobj_hpath}/status/cur_pres sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_pres type "part" + hsetprop ${scobj_hpath}/status/cur_pres nxalias "${name}_status_cur_pres" + + hfactory ${scobj_hpath}/status/cur_run_time plain user text + hsetprop ${scobj_hpath}/status/cur_run_time read ${ns}::fetch_from_status ${scobj_hpath} rdValue {3} + hsetprop ${scobj_hpath}/status/cur_run_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_run_time control true + hsetprop ${scobj_hpath}/status/cur_run_time data true + hsetprop ${scobj_hpath}/status/cur_run_time mutable true + hsetprop ${scobj_hpath}/status/cur_run_time nxsave true + hsetprop ${scobj_hpath}/status/cur_run_time oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_run_time klass "parameter" + hsetprop ${scobj_hpath}/status/cur_run_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_run_time type "part" + hsetprop ${scobj_hpath}/status/cur_run_time nxalias "${name}_status_cur_run_time" + + hfactory ${scobj_hpath}/status/error_in plain user text + hsetprop ${scobj_hpath}/status/error_in read ${ns}::fetch_from_status ${scobj_hpath} rdValue {19} + hsetprop ${scobj_hpath}/status/error_in rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/error_in control true + hsetprop ${scobj_hpath}/status/error_in data true + hsetprop ${scobj_hpath}/status/error_in mutable true + hsetprop ${scobj_hpath}/status/error_in nxsave true + hsetprop ${scobj_hpath}/status/error_in oldval UNKNOWN + hsetprop ${scobj_hpath}/status/error_in klass "parameter" + hsetprop ${scobj_hpath}/status/error_in sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/error_in type "part" + hsetprop ${scobj_hpath}/status/error_in nxalias "${name}_status_error_in" + + hfactory ${scobj_hpath}/status/evt_0 plain user text + hsetprop ${scobj_hpath}/status/evt_0 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {9} + hsetprop ${scobj_hpath}/status/evt_0 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_0 control true + hsetprop ${scobj_hpath}/status/evt_0 data true + hsetprop ${scobj_hpath}/status/evt_0 mutable true + hsetprop ${scobj_hpath}/status/evt_0 nxsave true + hsetprop ${scobj_hpath}/status/evt_0 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_0 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_0 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_0 type "part" + hsetprop ${scobj_hpath}/status/evt_0 nxalias "${name}_status_evt_0" + + hfactory ${scobj_hpath}/status/evt_1 plain user text + hsetprop ${scobj_hpath}/status/evt_1 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {10} + hsetprop ${scobj_hpath}/status/evt_1 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_1 control true + hsetprop ${scobj_hpath}/status/evt_1 data true + hsetprop ${scobj_hpath}/status/evt_1 mutable true + hsetprop ${scobj_hpath}/status/evt_1 nxsave true + hsetprop ${scobj_hpath}/status/evt_1 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_1 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_1 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_1 type "part" + hsetprop ${scobj_hpath}/status/evt_1 nxalias "${name}_status_evt_1" + + hfactory ${scobj_hpath}/status/evt_2 plain user text + hsetprop ${scobj_hpath}/status/evt_2 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {11} + hsetprop ${scobj_hpath}/status/evt_2 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_2 control true + hsetprop ${scobj_hpath}/status/evt_2 data true + hsetprop ${scobj_hpath}/status/evt_2 mutable true + hsetprop ${scobj_hpath}/status/evt_2 nxsave true + hsetprop ${scobj_hpath}/status/evt_2 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_2 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_2 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_2 type "part" + hsetprop ${scobj_hpath}/status/evt_2 nxalias "${name}_status_evt_2" + + hfactory ${scobj_hpath}/status/evt_3 plain user text + hsetprop ${scobj_hpath}/status/evt_3 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {12} + hsetprop ${scobj_hpath}/status/evt_3 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_3 control true + hsetprop ${scobj_hpath}/status/evt_3 data true + hsetprop ${scobj_hpath}/status/evt_3 mutable true + hsetprop ${scobj_hpath}/status/evt_3 nxsave true + hsetprop ${scobj_hpath}/status/evt_3 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_3 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_3 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_3 type "part" + hsetprop ${scobj_hpath}/status/evt_3 nxalias "${name}_status_evt_3" + + hfactory ${scobj_hpath}/status/evt_4 plain user text + hsetprop ${scobj_hpath}/status/evt_4 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {13} + hsetprop ${scobj_hpath}/status/evt_4 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_4 control true + hsetprop ${scobj_hpath}/status/evt_4 data true + hsetprop ${scobj_hpath}/status/evt_4 mutable true + hsetprop ${scobj_hpath}/status/evt_4 nxsave true + hsetprop ${scobj_hpath}/status/evt_4 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_4 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_4 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_4 type "part" + hsetprop ${scobj_hpath}/status/evt_4 nxalias "${name}_status_evt_4" + + hfactory ${scobj_hpath}/status/evt_5 plain user text + hsetprop ${scobj_hpath}/status/evt_5 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {14} + hsetprop ${scobj_hpath}/status/evt_5 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_5 control true + hsetprop ${scobj_hpath}/status/evt_5 data true + hsetprop ${scobj_hpath}/status/evt_5 mutable true + hsetprop ${scobj_hpath}/status/evt_5 nxsave true + hsetprop ${scobj_hpath}/status/evt_5 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_5 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_5 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_5 type "part" + hsetprop ${scobj_hpath}/status/evt_5 nxalias "${name}_status_evt_5" + + hfactory ${scobj_hpath}/status/evt_6 plain user text + hsetprop ${scobj_hpath}/status/evt_6 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {15} + hsetprop ${scobj_hpath}/status/evt_6 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_6 control true + hsetprop ${scobj_hpath}/status/evt_6 data true + hsetprop ${scobj_hpath}/status/evt_6 mutable true + hsetprop ${scobj_hpath}/status/evt_6 nxsave true + hsetprop ${scobj_hpath}/status/evt_6 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_6 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_6 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_6 type "part" + hsetprop ${scobj_hpath}/status/evt_6 nxalias "${name}_status_evt_6" + + hfactory ${scobj_hpath}/status/evt_7 plain user text + hsetprop ${scobj_hpath}/status/evt_7 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {16} + hsetprop ${scobj_hpath}/status/evt_7 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_7 control true + hsetprop ${scobj_hpath}/status/evt_7 data true + hsetprop ${scobj_hpath}/status/evt_7 mutable true + hsetprop ${scobj_hpath}/status/evt_7 nxsave true + hsetprop ${scobj_hpath}/status/evt_7 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_7 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_7 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_7 type "part" + hsetprop ${scobj_hpath}/status/evt_7 nxalias "${name}_status_evt_7" + + hfactory ${scobj_hpath}/status/flow_rate plain user text + hsetprop ${scobj_hpath}/status/flow_rate read ${ns}::fetch_from_status ${scobj_hpath} rdValue {4} + hsetprop ${scobj_hpath}/status/flow_rate rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/flow_rate control true + hsetprop ${scobj_hpath}/status/flow_rate data true + hsetprop ${scobj_hpath}/status/flow_rate mutable true + hsetprop ${scobj_hpath}/status/flow_rate nxsave true + hsetprop ${scobj_hpath}/status/flow_rate oldval UNKNOWN + hsetprop ${scobj_hpath}/status/flow_rate klass "parameter" + hsetprop ${scobj_hpath}/status/flow_rate sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/flow_rate type "part" + hsetprop ${scobj_hpath}/status/flow_rate nxalias "${name}_status_flow_rate" + + hfactory ${scobj_hpath}/status/lpg_0 plain user text + hsetprop ${scobj_hpath}/status/lpg_0 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {5} + hsetprop ${scobj_hpath}/status/lpg_0 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_0 control true + hsetprop ${scobj_hpath}/status/lpg_0 data true + hsetprop ${scobj_hpath}/status/lpg_0 mutable true + hsetprop ${scobj_hpath}/status/lpg_0 nxsave true + hsetprop ${scobj_hpath}/status/lpg_0 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_0 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_0 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_0 type "part" + hsetprop ${scobj_hpath}/status/lpg_0 nxalias "${name}_status_lpg_0" + + hfactory ${scobj_hpath}/status/lpg_1 plain user text + hsetprop ${scobj_hpath}/status/lpg_1 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {6} + hsetprop ${scobj_hpath}/status/lpg_1 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_1 control true + hsetprop ${scobj_hpath}/status/lpg_1 data true + hsetprop ${scobj_hpath}/status/lpg_1 mutable true + hsetprop ${scobj_hpath}/status/lpg_1 nxsave true + hsetprop ${scobj_hpath}/status/lpg_1 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_1 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_1 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_1 type "part" + hsetprop ${scobj_hpath}/status/lpg_1 nxalias "${name}_status_lpg_1" + + hfactory ${scobj_hpath}/status/lpg_2 plain user text + hsetprop ${scobj_hpath}/status/lpg_2 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {7} + hsetprop ${scobj_hpath}/status/lpg_2 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_2 control true + hsetprop ${scobj_hpath}/status/lpg_2 data true + hsetprop ${scobj_hpath}/status/lpg_2 mutable true + hsetprop ${scobj_hpath}/status/lpg_2 nxsave true + hsetprop ${scobj_hpath}/status/lpg_2 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_2 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_2 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_2 type "part" + hsetprop ${scobj_hpath}/status/lpg_2 nxalias "${name}_status_lpg_2" + + hfactory ${scobj_hpath}/status/lpg_3 plain user text + hsetprop ${scobj_hpath}/status/lpg_3 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {8} + hsetprop ${scobj_hpath}/status/lpg_3 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_3 control true + hsetprop ${scobj_hpath}/status/lpg_3 data true + hsetprop ${scobj_hpath}/status/lpg_3 mutable true + hsetprop ${scobj_hpath}/status/lpg_3 nxsave true + hsetprop ${scobj_hpath}/status/lpg_3 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_3 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_3 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_3 type "part" + hsetprop ${scobj_hpath}/status/lpg_3 nxalias "${name}_status_lpg_3" + + hfactory ${scobj_hpath}/status/start_in plain user text + hsetprop ${scobj_hpath}/status/start_in read ${ns}::fetch_from_status ${scobj_hpath} rdValue {18} + hsetprop ${scobj_hpath}/status/start_in rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/start_in control true + hsetprop ${scobj_hpath}/status/start_in data true + hsetprop ${scobj_hpath}/status/start_in mutable true + hsetprop ${scobj_hpath}/status/start_in nxsave true + hsetprop ${scobj_hpath}/status/start_in oldval UNKNOWN + hsetprop ${scobj_hpath}/status/start_in klass "parameter" + hsetprop ${scobj_hpath}/status/start_in sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/start_in type "part" + hsetprop ${scobj_hpath}/status/start_in nxalias "${name}_status_start_in" + + hfactory ${scobj_hpath}/status/state plain user text + hsetprop ${scobj_hpath}/status/state read ${ns}::fetch_from_status ${scobj_hpath} rdValue {1} + hsetprop ${scobj_hpath}/status/state rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/state control true + hsetprop ${scobj_hpath}/status/state data true + hsetprop ${scobj_hpath}/status/state mutable true + hsetprop ${scobj_hpath}/status/state nxsave true + hsetprop ${scobj_hpath}/status/state oldval UNKNOWN + hsetprop ${scobj_hpath}/status/state klass "parameter" + hsetprop ${scobj_hpath}/status/state sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/state type "part" + hsetprop ${scobj_hpath}/status/state nxalias "${name}_status_state" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/status/cur_error 1 + ${sct_controller} poll ${scobj_hpath}/status/cur_pres 1 + ${sct_controller} poll ${scobj_hpath}/status/cur_run_time 1 + ${sct_controller} poll ${scobj_hpath}/status/error_in 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_0 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_1 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_2 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_3 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_4 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_5 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_6 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_7 1 + ${sct_controller} poll ${scobj_hpath}/status/flow_rate 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_0 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_1 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_2 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_3 1 + ${sct_controller} poll ${scobj_hpath}/status/start_in 1 + ${sct_controller} poll ${scobj_hpath}/status/state 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/stuff plain spy none + hsetprop ${scobj_hpath}/stuff data "true" + hsetprop ${scobj_hpath}/stuff klass "@none" + hsetprop ${scobj_hpath}/stuff type "part" + + hfactory ${scobj_hpath}/stuff/an_out plain user text + hsetprop ${scobj_hpath}/stuff/an_out read ${ns}::getValue ${scobj_hpath} rdValue {AN_OUT?} + hsetprop ${scobj_hpath}/stuff/an_out rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/an_out control true + hsetprop ${scobj_hpath}/stuff/an_out data true + hsetprop ${scobj_hpath}/stuff/an_out mutable true + hsetprop ${scobj_hpath}/stuff/an_out nxsave true + hsetprop ${scobj_hpath}/stuff/an_out oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/an_out klass "parameter" + hsetprop ${scobj_hpath}/stuff/an_out sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/an_out type "part" + hsetprop ${scobj_hpath}/stuff/an_out nxalias "${name}_stuff_an_out" + + hfactory ${scobj_hpath}/stuff/boardinfo plain user text + hsetprop ${scobj_hpath}/stuff/boardinfo read ${ns}::getValue ${scobj_hpath} rdValue {BOARDINFO?} + hsetprop ${scobj_hpath}/stuff/boardinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/boardinfo control true + hsetprop ${scobj_hpath}/stuff/boardinfo data true + hsetprop ${scobj_hpath}/stuff/boardinfo mutable true + hsetprop ${scobj_hpath}/stuff/boardinfo nxsave true + hsetprop ${scobj_hpath}/stuff/boardinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/boardinfo klass "parameter" + hsetprop ${scobj_hpath}/stuff/boardinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/boardinfo type "part" + hsetprop ${scobj_hpath}/stuff/boardinfo nxalias "${name}_stuff_boardinfo" + + hfactory ${scobj_hpath}/stuff/config plain user text + hsetprop ${scobj_hpath}/stuff/config read ${ns}::getValue ${scobj_hpath} rdValue {CONFIG?} + hsetprop ${scobj_hpath}/stuff/config rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/config control true + hsetprop ${scobj_hpath}/stuff/config data true + hsetprop ${scobj_hpath}/stuff/config mutable true + hsetprop ${scobj_hpath}/stuff/config nxsave true + hsetprop ${scobj_hpath}/stuff/config oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/config klass "parameter" + hsetprop ${scobj_hpath}/stuff/config sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/config type "part" + hsetprop ${scobj_hpath}/stuff/config nxalias "${name}_stuff_config" + + hfactory ${scobj_hpath}/stuff/cprofinfo plain user text + hsetprop ${scobj_hpath}/stuff/cprofinfo read ${ns}::getValue ${scobj_hpath} rdValue {CPROFINFO?} + hsetprop ${scobj_hpath}/stuff/cprofinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/cprofinfo control true + hsetprop ${scobj_hpath}/stuff/cprofinfo data true + hsetprop ${scobj_hpath}/stuff/cprofinfo mutable true + hsetprop ${scobj_hpath}/stuff/cprofinfo nxsave true + hsetprop ${scobj_hpath}/stuff/cprofinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/cprofinfo klass "parameter" + hsetprop ${scobj_hpath}/stuff/cprofinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/cprofinfo type "part" + hsetprop ${scobj_hpath}/stuff/cprofinfo nxalias "${name}_stuff_cprofinfo" + + hfactory ${scobj_hpath}/stuff/dout plain user text + hsetprop ${scobj_hpath}/stuff/dout read ${ns}::getValue ${scobj_hpath} rdValue {DOUT?} + hsetprop ${scobj_hpath}/stuff/dout rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/dout control true + hsetprop ${scobj_hpath}/stuff/dout data true + hsetprop ${scobj_hpath}/stuff/dout mutable true + hsetprop ${scobj_hpath}/stuff/dout nxsave true + hsetprop ${scobj_hpath}/stuff/dout oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/dout klass "parameter" + hsetprop ${scobj_hpath}/stuff/dout sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/dout type "part" + hsetprop ${scobj_hpath}/stuff/dout nxalias "${name}_stuff_dout" + + hfactory ${scobj_hpath}/stuff/error plain user text + hsetprop ${scobj_hpath}/stuff/error read ${ns}::getValue ${scobj_hpath} rdValue {ERROR?} + hsetprop ${scobj_hpath}/stuff/error rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/error control true + hsetprop ${scobj_hpath}/stuff/error data true + hsetprop ${scobj_hpath}/stuff/error mutable true + hsetprop ${scobj_hpath}/stuff/error nxsave true + hsetprop ${scobj_hpath}/stuff/error oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/error klass "parameter" + hsetprop ${scobj_hpath}/stuff/error sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/error type "part" + hsetprop ${scobj_hpath}/stuff/error nxalias "${name}_stuff_error" + + hfactory ${scobj_hpath}/stuff/errors plain user text + hsetprop ${scobj_hpath}/stuff/errors read ${ns}::getValue ${scobj_hpath} rdValue {ERRORS?} + hsetprop ${scobj_hpath}/stuff/errors rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/errors control true + hsetprop ${scobj_hpath}/stuff/errors data true + hsetprop ${scobj_hpath}/stuff/errors mutable true + hsetprop ${scobj_hpath}/stuff/errors nxsave true + hsetprop ${scobj_hpath}/stuff/errors oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/errors klass "parameter" + hsetprop ${scobj_hpath}/stuff/errors sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/errors type "part" + hsetprop ${scobj_hpath}/stuff/errors nxalias "${name}_stuff_errors" + + hfactory ${scobj_hpath}/stuff/flushpmp plain user text + hsetprop ${scobj_hpath}/stuff/flushpmp read ${ns}::getValue ${scobj_hpath} rdValue {FLUSHPMP?} + hsetprop ${scobj_hpath}/stuff/flushpmp rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/flushpmp control true + hsetprop ${scobj_hpath}/stuff/flushpmp data true + hsetprop ${scobj_hpath}/stuff/flushpmp mutable true + hsetprop ${scobj_hpath}/stuff/flushpmp nxsave true + hsetprop ${scobj_hpath}/stuff/flushpmp oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/flushpmp klass "parameter" + hsetprop ${scobj_hpath}/stuff/flushpmp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/flushpmp type "part" + hsetprop ${scobj_hpath}/stuff/flushpmp nxalias "${name}_stuff_flushpmp" + + hfactory ${scobj_hpath}/stuff/head plain user text + hsetprop ${scobj_hpath}/stuff/head read ${ns}::getValue ${scobj_hpath} rdValue {HEAD?} + hsetprop ${scobj_hpath}/stuff/head rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/head control true + hsetprop ${scobj_hpath}/stuff/head data true + hsetprop ${scobj_hpath}/stuff/head mutable true + hsetprop ${scobj_hpath}/stuff/head nxsave true + hsetprop ${scobj_hpath}/stuff/head oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/head klass "parameter" + hsetprop ${scobj_hpath}/stuff/head sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/head type "part" + hsetprop ${scobj_hpath}/stuff/head nxalias "${name}_stuff_head" + + hfactory ${scobj_hpath}/stuff/head_par plain user text + hsetprop ${scobj_hpath}/stuff/head_par read ${ns}::getValue ${scobj_hpath} rdValue {HEAD_PAR?} + hsetprop ${scobj_hpath}/stuff/head_par rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/head_par control true + hsetprop ${scobj_hpath}/stuff/head_par data true + hsetprop ${scobj_hpath}/stuff/head_par mutable true + hsetprop ${scobj_hpath}/stuff/head_par nxsave true + hsetprop ${scobj_hpath}/stuff/head_par oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/head_par klass "parameter" + hsetprop ${scobj_hpath}/stuff/head_par sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/head_par type "part" + hsetprop ${scobj_hpath}/stuff/head_par nxalias "${name}_stuff_head_par" + + hfactory ${scobj_hpath}/stuff/identify plain user text + hsetprop ${scobj_hpath}/stuff/identify read ${ns}::getValue ${scobj_hpath} rdValue {IDENTIFY?} + hsetprop ${scobj_hpath}/stuff/identify rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/identify control true + hsetprop ${scobj_hpath}/stuff/identify data true + hsetprop ${scobj_hpath}/stuff/identify mutable true + hsetprop ${scobj_hpath}/stuff/identify nxsave true + hsetprop ${scobj_hpath}/stuff/identify oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/identify klass "parameter" + hsetprop ${scobj_hpath}/stuff/identify sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/identify type "part" + hsetprop ${scobj_hpath}/stuff/identify nxalias "${name}_stuff_identify" + + hfactory ${scobj_hpath}/stuff/lpg plain user text + hsetprop ${scobj_hpath}/stuff/lpg read ${ns}::getValue ${scobj_hpath} rdValue {LPG?} + hsetprop ${scobj_hpath}/stuff/lpg rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/lpg control true + hsetprop ${scobj_hpath}/stuff/lpg data true + hsetprop ${scobj_hpath}/stuff/lpg mutable true + hsetprop ${scobj_hpath}/stuff/lpg nxsave true + hsetprop ${scobj_hpath}/stuff/lpg oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/lpg klass "parameter" + hsetprop ${scobj_hpath}/stuff/lpg sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/lpg type "part" + hsetprop ${scobj_hpath}/stuff/lpg nxalias "${name}_stuff_lpg" + + hfactory ${scobj_hpath}/stuff/oem plain user text + hsetprop ${scobj_hpath}/stuff/oem read ${ns}::getValue ${scobj_hpath} rdValue {OEM?} + hsetprop ${scobj_hpath}/stuff/oem rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/oem control true + hsetprop ${scobj_hpath}/stuff/oem data true + hsetprop ${scobj_hpath}/stuff/oem mutable true + hsetprop ${scobj_hpath}/stuff/oem nxsave true + hsetprop ${scobj_hpath}/stuff/oem oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/oem klass "parameter" + hsetprop ${scobj_hpath}/stuff/oem sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/oem type "part" + hsetprop ${scobj_hpath}/stuff/oem nxalias "${name}_stuff_oem" + + hfactory ${scobj_hpath}/stuff/opt plain user text + hsetprop ${scobj_hpath}/stuff/opt read ${ns}::getValue ${scobj_hpath} rdValue {OPT?} + hsetprop ${scobj_hpath}/stuff/opt rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/opt control true + hsetprop ${scobj_hpath}/stuff/opt data true + hsetprop ${scobj_hpath}/stuff/opt mutable true + hsetprop ${scobj_hpath}/stuff/opt nxsave true + hsetprop ${scobj_hpath}/stuff/opt oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/opt klass "parameter" + hsetprop ${scobj_hpath}/stuff/opt sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/opt type "part" + hsetprop ${scobj_hpath}/stuff/opt nxalias "${name}_stuff_opt" + + hfactory ${scobj_hpath}/stuff/plim plain user text + hsetprop ${scobj_hpath}/stuff/plim read ${ns}::getValue ${scobj_hpath} rdValue {PLIM?} + hsetprop ${scobj_hpath}/stuff/plim rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/plim control true + hsetprop ${scobj_hpath}/stuff/plim data true + hsetprop ${scobj_hpath}/stuff/plim mutable true + hsetprop ${scobj_hpath}/stuff/plim nxsave true + hsetprop ${scobj_hpath}/stuff/plim oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/plim klass "parameter" + hsetprop ${scobj_hpath}/stuff/plim sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/plim type "part" + hsetprop ${scobj_hpath}/stuff/plim nxalias "${name}_stuff_plim" + + hfactory ${scobj_hpath}/stuff/pressure plain user text + hsetprop ${scobj_hpath}/stuff/pressure read ${ns}::getValue ${scobj_hpath} rdValue {PRESSURE?} + hsetprop ${scobj_hpath}/stuff/pressure rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/pressure control true + hsetprop ${scobj_hpath}/stuff/pressure data true + hsetprop ${scobj_hpath}/stuff/pressure mutable true + hsetprop ${scobj_hpath}/stuff/pressure nxsave true + hsetprop ${scobj_hpath}/stuff/pressure oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/pressure klass "parameter" + hsetprop ${scobj_hpath}/stuff/pressure sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/pressure type "part" + hsetprop ${scobj_hpath}/stuff/pressure nxalias "${name}_stuff_pressure" + + hfactory ${scobj_hpath}/stuff/prfastacq plain user text + hsetprop ${scobj_hpath}/stuff/prfastacq read ${ns}::getValue ${scobj_hpath} rdValue {PRFASTACQ?} + hsetprop ${scobj_hpath}/stuff/prfastacq rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/prfastacq control true + hsetprop ${scobj_hpath}/stuff/prfastacq data true + hsetprop ${scobj_hpath}/stuff/prfastacq mutable true + hsetprop ${scobj_hpath}/stuff/prfastacq nxsave true + hsetprop ${scobj_hpath}/stuff/prfastacq oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/prfastacq klass "parameter" + hsetprop ${scobj_hpath}/stuff/prfastacq sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/prfastacq type "part" + hsetprop ${scobj_hpath}/stuff/prfastacq nxalias "${name}_stuff_prfastacq" + + hfactory ${scobj_hpath}/stuff/purge plain user text + hsetprop ${scobj_hpath}/stuff/purge read ${ns}::getValue ${scobj_hpath} rdValue {PURGE?} + hsetprop ${scobj_hpath}/stuff/purge rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/purge control true + hsetprop ${scobj_hpath}/stuff/purge data true + hsetprop ${scobj_hpath}/stuff/purge mutable true + hsetprop ${scobj_hpath}/stuff/purge nxsave true + hsetprop ${scobj_hpath}/stuff/purge oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/purge klass "parameter" + hsetprop ${scobj_hpath}/stuff/purge sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/purge type "part" + hsetprop ${scobj_hpath}/stuff/purge nxalias "${name}_stuff_purge" + + hfactory ${scobj_hpath}/stuff/remote plain user text + hsetprop ${scobj_hpath}/stuff/remote read ${ns}::getValue ${scobj_hpath} rdValue {REMOTE?} + hsetprop ${scobj_hpath}/stuff/remote rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/remote control true + hsetprop ${scobj_hpath}/stuff/remote data true + hsetprop ${scobj_hpath}/stuff/remote mutable true + hsetprop ${scobj_hpath}/stuff/remote nxsave true + hsetprop ${scobj_hpath}/stuff/remote oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/remote klass "parameter" + hsetprop ${scobj_hpath}/stuff/remote sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/remote type "part" + hsetprop ${scobj_hpath}/stuff/remote nxalias "${name}_stuff_remote" + + hfactory ${scobj_hpath}/stuff/rfid plain user text + hsetprop ${scobj_hpath}/stuff/rfid read ${ns}::getValue ${scobj_hpath} rdValue {RFID?} + hsetprop ${scobj_hpath}/stuff/rfid rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/rfid control true + hsetprop ${scobj_hpath}/stuff/rfid data true + hsetprop ${scobj_hpath}/stuff/rfid mutable true + hsetprop ${scobj_hpath}/stuff/rfid nxsave true + hsetprop ${scobj_hpath}/stuff/rfid oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/rfid klass "parameter" + hsetprop ${scobj_hpath}/stuff/rfid sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/rfid type "part" + hsetprop ${scobj_hpath}/stuff/rfid nxalias "${name}_stuff_rfid" + + hfactory ${scobj_hpath}/stuff/service plain user text + hsetprop ${scobj_hpath}/stuff/service read ${ns}::getValue ${scobj_hpath} rdValue {SERVICE?} + hsetprop ${scobj_hpath}/stuff/service rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/service control true + hsetprop ${scobj_hpath}/stuff/service data true + hsetprop ${scobj_hpath}/stuff/service mutable true + hsetprop ${scobj_hpath}/stuff/service nxsave true + hsetprop ${scobj_hpath}/stuff/service oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/service klass "parameter" + hsetprop ${scobj_hpath}/stuff/service sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/service type "part" + hsetprop ${scobj_hpath}/stuff/service nxalias "${name}_stuff_service" + + hfactory ${scobj_hpath}/stuff/sysinfo plain user text + hsetprop ${scobj_hpath}/stuff/sysinfo read ${ns}::getValue ${scobj_hpath} rdValue {SYSINFO?} + hsetprop ${scobj_hpath}/stuff/sysinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/sysinfo control true + hsetprop ${scobj_hpath}/stuff/sysinfo data true + hsetprop ${scobj_hpath}/stuff/sysinfo mutable true + hsetprop ${scobj_hpath}/stuff/sysinfo nxsave true + hsetprop ${scobj_hpath}/stuff/sysinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/sysinfo klass "parameter" + hsetprop ${scobj_hpath}/stuff/sysinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/sysinfo type "part" + hsetprop ${scobj_hpath}/stuff/sysinfo nxalias "${name}_stuff_sysinfo" + + hfactory ${scobj_hpath}/stuff/units plain user text + hsetprop ${scobj_hpath}/stuff/units read ${ns}::getValue ${scobj_hpath} rdValue {UNITS?} + hsetprop ${scobj_hpath}/stuff/units rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/units control true + hsetprop ${scobj_hpath}/stuff/units data true + hsetprop ${scobj_hpath}/stuff/units mutable true + hsetprop ${scobj_hpath}/stuff/units nxsave true + hsetprop ${scobj_hpath}/stuff/units oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/units klass "parameter" + hsetprop ${scobj_hpath}/stuff/units sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/units type "part" + hsetprop ${scobj_hpath}/stuff/units nxalias "${name}_stuff_units" + + hfactory ${scobj_hpath}/stuff/valves plain user text + hsetprop ${scobj_hpath}/stuff/valves read ${ns}::getValue ${scobj_hpath} rdValue {VALVES?} + hsetprop ${scobj_hpath}/stuff/valves rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/valves control true + hsetprop ${scobj_hpath}/stuff/valves data true + hsetprop ${scobj_hpath}/stuff/valves mutable true + hsetprop ${scobj_hpath}/stuff/valves nxsave true + hsetprop ${scobj_hpath}/stuff/valves oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/valves klass "parameter" + hsetprop ${scobj_hpath}/stuff/valves sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/valves type "part" + hsetprop ${scobj_hpath}/stuff/valves nxalias "${name}_stuff_valves" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/stuff/an_out 60 + ${sct_controller} poll ${scobj_hpath}/stuff/boardinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/config 60 + ${sct_controller} poll ${scobj_hpath}/stuff/cprofinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/dout 60 + ${sct_controller} poll ${scobj_hpath}/stuff/error 60 + ${sct_controller} poll ${scobj_hpath}/stuff/errors 60 + ${sct_controller} poll ${scobj_hpath}/stuff/flushpmp 60 + ${sct_controller} poll ${scobj_hpath}/stuff/head 60 + ${sct_controller} poll ${scobj_hpath}/stuff/head_par 60 + ${sct_controller} poll ${scobj_hpath}/stuff/identify 60 + ${sct_controller} poll ${scobj_hpath}/stuff/lpg 60 + ${sct_controller} poll ${scobj_hpath}/stuff/oem 60 + ${sct_controller} poll ${scobj_hpath}/stuff/opt 60 + ${sct_controller} poll ${scobj_hpath}/stuff/plim 60 + ${sct_controller} poll ${scobj_hpath}/stuff/pressure 60 + ${sct_controller} poll ${scobj_hpath}/stuff/prfastacq 60 + ${sct_controller} poll ${scobj_hpath}/stuff/purge 60 + ${sct_controller} poll ${scobj_hpath}/stuff/remote 60 + ${sct_controller} poll ${scobj_hpath}/stuff/rfid 60 + ${sct_controller} poll ${scobj_hpath}/stuff/service 60 + ${sct_controller} poll ${scobj_hpath}/stuff/sysinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/units 60 + ${sct_controller} poll ${scobj_hpath}/stuff/valves 60 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/volume plain spy none + hsetprop ${scobj_hpath}/volume data "true" + hsetprop ${scobj_hpath}/volume klass "@none" + hsetprop ${scobj_hpath}/volume type "part" + + hfactory ${scobj_hpath}/volume/sensor plain user float + hsetprop ${scobj_hpath}/volume/sensor read ${ns}::volume_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/volume/sensor rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/sensor control true + hsetprop ${scobj_hpath}/volume/sensor data true + hsetprop ${scobj_hpath}/volume/sensor mutable true + hsetprop ${scobj_hpath}/volume/sensor nxsave true + hsetprop ${scobj_hpath}/volume/sensor oldval 0.0 + hsetprop ${scobj_hpath}/volume/sensor klass "parameter" + hsetprop ${scobj_hpath}/volume/sensor sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/volume/sensor type "part" + hsetprop ${scobj_hpath}/volume/sensor units "mL" + hsetprop ${scobj_hpath}/volume/sensor nxalias "${name}_volume_sensor" + + hfactory ${scobj_hpath}/volume/setpoint plain user float + hsetprop ${scobj_hpath}/volume/setpoint read ${ns}::volume_checkpumping ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/volume/setpoint rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint write ${ns}::volume_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/volume/setpoint noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint driving 0 + hsetprop ${scobj_hpath}/volume/setpoint checklimits ${ns}::checklimits ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint checkstatus ${ns}::volume_checkstatus ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint halt ${ns}::volume_halt ${scobj_hpath} + hsetprop ${scobj_hpath}/volume/setpoint driveable volume/sensor + hsetprop ${scobj_hpath}/volume/setpoint control true + hsetprop ${scobj_hpath}/volume/setpoint data true + hsetprop ${scobj_hpath}/volume/setpoint mutable true + hsetprop ${scobj_hpath}/volume/setpoint nxsave true + hsetprop ${scobj_hpath}/volume/setpoint lowerlimit 0 + hsetprop ${scobj_hpath}/volume/setpoint upperlimit 100 + hsetprop ${scobj_hpath}/volume/setpoint tolerance 0.01 + hsetprop ${scobj_hpath}/volume/setpoint oldval 0.0 + hsetprop ${scobj_hpath}/volume/setpoint klass "parameter" + hsetprop ${scobj_hpath}/volume/setpoint sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/volume/setpoint type "drivable" + hsetprop ${scobj_hpath}/volume/setpoint units "mL" + hsetprop ${scobj_hpath}/volume/setpoint nxalias "${name}_volume_setpoint" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/volume/sensor 1 + ${sct_controller} poll ${scobj_hpath}/volume/setpoint 1 + ${sct_controller} write ${scobj_hpath}/volume/setpoint + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + hsetprop ${scobj_hpath} klass ${device_class} + hsetprop ${scobj_hpath} data true + hsetprop ${scobj_hpath} debug_threshold 0 + if {[string equal -nocase "${simulation_flag}" "false"]} { + ansto_makesctdrive ${name}_volume_setpoint ${scobj_hpath}/volume/setpoint ${scobj_hpath}/volume/sensor ${sct_controller} + } +# mkDriver hook code goes here + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::knauer_pump::add_driver {name device_class simulation_flag ip_address tcp_port} { + set catch_status [ catch { + ::scobj::knauer_pump::sics_log 9 "::scobj::knauer_pump::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + if {[string equal -nocase "${simulation_flag}" "false"]} { + if {[string equal -nocase "aqadapter" "${ip_address}"]} { + ::scobj::knauer_pump::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" + makesctcontroller sct_${name} aqadapter ${tcp_port} + } else { + ::scobj::knauer_pump::sics_log 9 "makesctcontroller sct_${name} knauer_ap ${ip_address}:${tcp_port}" + makesctcontroller sct_${name} knauer_ap ${ip_address}:${tcp_port} + } + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag={simulation_flag} => No sctcontroller for knauer_pump" + } + ::scobj::knauer_pump::sics_log 1 "::scobj::knauer_pump::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::knauer_pump::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +namespace eval ::scobj::knauer_pump { + namespace export debug_threshold + namespace export debug_log + namespace export sics_log + namespace export mkDriver + namespace export add_driver +} + +proc add_knauer_pump {name ip_address tcp_port} { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::knauer_pump::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} +} + +clientput "file evaluation of sct_knauer_pump.tcl" +::scobj::knauer_pump::sics_log 9 "file evaluation of sct_knauer_pump.tcl" + +proc ::scobj::knauer_pump::read_config {} { + set catch_status [ catch { + set ns "::scobj::knauer_pump" + dict for {k u} $::config_dict { + if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" + if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + continue + } + set enabled [string tolower [dict get $u "enabled"]] + if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { + continue + } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } + set name [dict get $u name] + set implementation [dict get $u "implementation"] + if { !([dict exists $::config_dict $implementation]) } { + continue + } + set v [dict get $::config_dict $implementation] + if { !([dict exists $v "driver"]) } { + continue + } + if { [string equal -nocase [dict get $v "driver"] "knauer_pump"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { + set asyncqueue "null" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + } elseif { [dict exists $v "asyncqueue"] } { + set asyncqueue [dict get $v "asyncqueue"] + if { [string equal -nocase ${asyncqueue} "sct"] } { + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + } + } else { + if { [dict exists $v "asyncprotocol"] } { + set asyncprotocol [dict get $v "asyncprotocol"] + } else { + set asyncprotocol ${name}_protocol + MakeAsyncProtocol ${asyncprotocol} + if { [dict exists $v "terminator"] } { + ${asyncprotocol} sendterminator "[dict get $v "terminator"]" + ${asyncprotocol} replyterminator "[dict get $v "terminator"]" + } + } + set asyncqueue ${name}_queue + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + if { [dict exists $v "timeout"] } { + ${asyncqueue} timeout "[dict get $v "timeout"]" + } + } + if { [string equal -nocase ${asyncqueue} "sct"] } { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } else { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} + } + } + } + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +if { [info exists ::config_dict] } { + ::scobj::knauer_pump::read_config +} else { + ::scobj::knauer_pump::sics_log 5 "No config dict" +} From 522865f264a46d9655aef42e72e51a7e412393b2 Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Fri, 19 Sep 2014 12:07:51 +1000 Subject: [PATCH 05/12] Restructure knauer_pump.sct --- .../config/environment/knauer_pump.sct | 144 ++++++++++++------ 1 file changed, 95 insertions(+), 49 deletions(-) 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} %%} From b3d8f1bdae55c448c712cc6de307649561f52175 Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Fri, 19 Sep 2014 12:08:13 +1000 Subject: [PATCH 06/12] Regenerate knauer_pump.sct --- .../config/environment/sct_knauer_pump.tcl | 559 ++++++++++-------- 1 file changed, 308 insertions(+), 251 deletions(-) diff --git a/site_ansto/instrument/config/environment/sct_knauer_pump.tcl b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl index dda04d9f..d58d4bf4 100644 --- a/site_ansto/instrument/config/environment/sct_knauer_pump.tcl +++ b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl @@ -147,8 +147,8 @@ proc ::scobj::knauer_pump::flow_fetch {tc_root nextState cmd_str} { # flow_fetch hook code starts 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@@" # flow_fetch hook code ends if { [hpropexists [sct] geterror] } { @@ -248,12 +248,12 @@ proc ::scobj::knauer_pump::ratios_check {tc_root} { set hilimit [sct target] } # ratios_check hook code starts - 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] @@ -278,8 +278,8 @@ proc ::scobj::knauer_pump::ratios_fetch {tc_root nextState cmd_str} { # ratios_fetch hook code starts 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@@" # ratios_fetch hook code ends if { [hpropexists [sct] geterror] } { @@ -451,6 +451,82 @@ proc ::scobj::knauer_pump::setValue {tc_root nextState cmd_str} { handle_exception ${catch_status} ${catch_message} } +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::state_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "state_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# state_fetch hook code starts + 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}] +# state_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "state_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::status_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "status_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# status_fetch hook code starts + 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" + } +# status_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "status_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + # function to request the read of a parameter on a device proc ::scobj::knauer_pump::volume_checkpumping {tc_root nextState cmd_str} { set catch_status [ catch { @@ -469,10 +545,9 @@ proc ::scobj::knauer_pump::volume_checkpumping {tc_root nextState cmd_str} { 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 } @@ -539,17 +614,17 @@ proc ::scobj::knauer_pump::volume_fetch {tc_root nextState cmd_str} { 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@@" # volume_fetch hook code ends if { [hpropexists [sct] geterror] } { @@ -571,10 +646,9 @@ proc ::scobj::knauer_pump::volume_halt {tc_root} { debug_log ${tc_root} 1 "volume_halt tc_root=${tc_root} sct=[sct] driving=[sct driving]" ### TODO hset [sct] [hval [sct]] # volume_halt hook code starts - 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} # volume_halt hook code ends sct driving 0 @@ -595,10 +669,9 @@ proc ::scobj::knauer_pump::volume_write {tc_root nextState cmd_str} { # volume_write hook code starts 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 # volume_write hook code ends if { [hpropexists [sct] geterror] } { @@ -667,49 +740,6 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" } - hfactory ${scobj_hpath}/flow plain spy none - hsetprop ${scobj_hpath}/flow data "true" - hsetprop ${scobj_hpath}/flow klass "@none" - hsetprop ${scobj_hpath}/flow type "part" - - hfactory ${scobj_hpath}/flow/sensor plain user float - hsetprop ${scobj_hpath}/flow/sensor read ${ns}::flow_fetch ${scobj_hpath} rdValue { } - hsetprop ${scobj_hpath}/flow/sensor rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/flow/sensor control true - hsetprop ${scobj_hpath}/flow/sensor data true - hsetprop ${scobj_hpath}/flow/sensor mutable true - hsetprop ${scobj_hpath}/flow/sensor nxsave true - hsetprop ${scobj_hpath}/flow/sensor oldval 0.0 - hsetprop ${scobj_hpath}/flow/sensor klass "parameter" - hsetprop ${scobj_hpath}/flow/sensor sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/flow/sensor type "part" - hsetprop ${scobj_hpath}/flow/sensor units "mL/min" - hsetprop ${scobj_hpath}/flow/sensor nxalias "${name}_flow_sensor" - - hfactory ${scobj_hpath}/flow/setpoint plain user float - hsetprop ${scobj_hpath}/flow/setpoint write ${ns}::flow_write ${scobj_hpath} noResponse { } - hsetprop ${scobj_hpath}/flow/setpoint noResponse ${ns}::noResponse ${scobj_hpath} - hsetprop ${scobj_hpath}/flow/setpoint check ${ns}::checkrange ${scobj_hpath} - hsetprop ${scobj_hpath}/flow/setpoint control true - hsetprop ${scobj_hpath}/flow/setpoint data true - hsetprop ${scobj_hpath}/flow/setpoint mutable true - hsetprop ${scobj_hpath}/flow/setpoint nxsave true - hsetprop ${scobj_hpath}/flow/setpoint lowerlimit 0 - hsetprop ${scobj_hpath}/flow/setpoint upperlimit 10 - hsetprop ${scobj_hpath}/flow/setpoint oldval 0.0 - hsetprop ${scobj_hpath}/flow/setpoint klass "parameter" - hsetprop ${scobj_hpath}/flow/setpoint sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/flow/setpoint type "part" - hsetprop ${scobj_hpath}/flow/setpoint units "mL/min" - hsetprop ${scobj_hpath}/flow/setpoint nxalias "${name}_flow_setpoint" - - if {[string equal -nocase "${simulation_flag}" "false"]} { - ${sct_controller} poll ${scobj_hpath}/flow/sensor 1 - ${sct_controller} write ${scobj_hpath}/flow/setpoint - } else { - ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" - } - hfactory ${scobj_hpath}/glp plain spy none hsetprop ${scobj_hpath}/glp data "true" hsetprop ${scobj_hpath}/glp klass "@none" @@ -982,43 +1012,146 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" } - hfactory ${scobj_hpath}/ratios plain spy none - hsetprop ${scobj_hpath}/ratios data "true" - hsetprop ${scobj_hpath}/ratios klass "@none" - hsetprop ${scobj_hpath}/ratios type "part" + hfactory ${scobj_hpath}/pump plain spy none + hsetprop ${scobj_hpath}/pump data "true" + hsetprop ${scobj_hpath}/pump klass "@none" + hsetprop ${scobj_hpath}/pump type "part" - hfactory ${scobj_hpath}/ratios/sensor plain user text - hsetprop ${scobj_hpath}/ratios/sensor read ${ns}::ratios_fetch ${scobj_hpath} rdValue { } - hsetprop ${scobj_hpath}/ratios/sensor rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/ratios/sensor control true - hsetprop ${scobj_hpath}/ratios/sensor data true - hsetprop ${scobj_hpath}/ratios/sensor mutable true - hsetprop ${scobj_hpath}/ratios/sensor nxsave true - hsetprop ${scobj_hpath}/ratios/sensor oldval UNKNOWN - hsetprop ${scobj_hpath}/ratios/sensor klass "parameter" - hsetprop ${scobj_hpath}/ratios/sensor sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/ratios/sensor type "part" - hsetprop ${scobj_hpath}/ratios/sensor units "percent" - hsetprop ${scobj_hpath}/ratios/sensor nxalias "${name}_ratios_sensor" + hfactory ${scobj_hpath}/pump/flow_pv plain user float + hsetprop ${scobj_hpath}/pump/flow_pv read ${ns}::flow_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/flow_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_pv control true + hsetprop ${scobj_hpath}/pump/flow_pv data true + hsetprop ${scobj_hpath}/pump/flow_pv mutable true + hsetprop ${scobj_hpath}/pump/flow_pv nxsave true + hsetprop ${scobj_hpath}/pump/flow_pv oldval 0.0 + hsetprop ${scobj_hpath}/pump/flow_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/flow_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/flow_pv type "part" + hsetprop ${scobj_hpath}/pump/flow_pv units "mL/min" + hsetprop ${scobj_hpath}/pump/flow_pv nxalias "${name}_pump_flow_pv" - hfactory ${scobj_hpath}/ratios/setpoint plain user text - hsetprop ${scobj_hpath}/ratios/setpoint write ${ns}::ratios_write ${scobj_hpath} noResponse { } - hsetprop ${scobj_hpath}/ratios/setpoint noResponse ${ns}::noResponse ${scobj_hpath} - hsetprop ${scobj_hpath}/ratios/setpoint check ${ns}::ratios_check ${scobj_hpath} - hsetprop ${scobj_hpath}/ratios/setpoint control true - hsetprop ${scobj_hpath}/ratios/setpoint data true - hsetprop ${scobj_hpath}/ratios/setpoint mutable true - hsetprop ${scobj_hpath}/ratios/setpoint nxsave true - hsetprop ${scobj_hpath}/ratios/setpoint oldval UNKNOWN - hsetprop ${scobj_hpath}/ratios/setpoint klass "parameter" - hsetprop ${scobj_hpath}/ratios/setpoint sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/ratios/setpoint type "part" - hsetprop ${scobj_hpath}/ratios/setpoint units "percent" - hsetprop ${scobj_hpath}/ratios/setpoint nxalias "${name}_ratios_setpoint" + hfactory ${scobj_hpath}/pump/flow_sp plain user float + hsetprop ${scobj_hpath}/pump/flow_sp write ${ns}::flow_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/flow_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_sp check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_sp control true + hsetprop ${scobj_hpath}/pump/flow_sp data true + hsetprop ${scobj_hpath}/pump/flow_sp mutable true + hsetprop ${scobj_hpath}/pump/flow_sp nxsave true + hsetprop ${scobj_hpath}/pump/flow_sp lowerlimit 0 + hsetprop ${scobj_hpath}/pump/flow_sp upperlimit 10 + hsetprop ${scobj_hpath}/pump/flow_sp oldval 0.0 + hsetprop ${scobj_hpath}/pump/flow_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/flow_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/flow_sp type "part" + hsetprop ${scobj_hpath}/pump/flow_sp units "mL/min" + hsetprop ${scobj_hpath}/pump/flow_sp nxalias "${name}_pump_flow_sp" + + hfactory ${scobj_hpath}/pump/ratio_pv plain user text + hsetprop ${scobj_hpath}/pump/ratio_pv read ${ns}::ratios_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/ratio_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_pv control true + hsetprop ${scobj_hpath}/pump/ratio_pv data true + hsetprop ${scobj_hpath}/pump/ratio_pv mutable true + hsetprop ${scobj_hpath}/pump/ratio_pv nxsave true + hsetprop ${scobj_hpath}/pump/ratio_pv oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/ratio_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/ratio_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/ratio_pv type "part" + hsetprop ${scobj_hpath}/pump/ratio_pv units "percent" + hsetprop ${scobj_hpath}/pump/ratio_pv nxalias "${name}_pump_ratio_pv" + + hfactory ${scobj_hpath}/pump/ratio_sp plain user text + hsetprop ${scobj_hpath}/pump/ratio_sp write ${ns}::ratios_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/ratio_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_sp check ${ns}::ratios_check ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_sp control true + hsetprop ${scobj_hpath}/pump/ratio_sp data true + hsetprop ${scobj_hpath}/pump/ratio_sp mutable true + hsetprop ${scobj_hpath}/pump/ratio_sp nxsave true + hsetprop ${scobj_hpath}/pump/ratio_sp oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/ratio_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/ratio_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/ratio_sp type "part" + hsetprop ${scobj_hpath}/pump/ratio_sp units "percent" + hsetprop ${scobj_hpath}/pump/ratio_sp nxalias "${name}_pump_ratio_sp" + + hfactory ${scobj_hpath}/pump/state plain user text + hsetprop ${scobj_hpath}/pump/state read ${ns}::state_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/state rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/state control true + hsetprop ${scobj_hpath}/pump/state data true + hsetprop ${scobj_hpath}/pump/state mutable true + hsetprop ${scobj_hpath}/pump/state nxsave true + hsetprop ${scobj_hpath}/pump/state oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/state klass "parameter" + hsetprop ${scobj_hpath}/pump/state sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/state type "part" + hsetprop ${scobj_hpath}/pump/state nxalias "${name}_pump_state" + + hfactory ${scobj_hpath}/pump/status plain user text + hsetprop ${scobj_hpath}/pump/status read ${ns}::status_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/status rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/status control true + hsetprop ${scobj_hpath}/pump/status data true + hsetprop ${scobj_hpath}/pump/status mutable true + hsetprop ${scobj_hpath}/pump/status nxsave true + hsetprop ${scobj_hpath}/pump/status oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/status klass "parameter" + hsetprop ${scobj_hpath}/pump/status sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/status type "part" + hsetprop ${scobj_hpath}/pump/status nxalias "${name}_pump_status" + + hfactory ${scobj_hpath}/pump/volume_pv plain user float + hsetprop ${scobj_hpath}/pump/volume_pv read ${ns}::volume_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/volume_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_pv control true + hsetprop ${scobj_hpath}/pump/volume_pv data true + hsetprop ${scobj_hpath}/pump/volume_pv mutable true + hsetprop ${scobj_hpath}/pump/volume_pv nxsave true + hsetprop ${scobj_hpath}/pump/volume_pv oldval 0.0 + hsetprop ${scobj_hpath}/pump/volume_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/volume_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/volume_pv type "part" + hsetprop ${scobj_hpath}/pump/volume_pv units "mL" + hsetprop ${scobj_hpath}/pump/volume_pv nxalias "${name}_pump_volume_pv" + + hfactory ${scobj_hpath}/pump/volume_sp plain user float + hsetprop ${scobj_hpath}/pump/volume_sp read ${ns}::volume_checkpumping ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/volume_sp rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp write ${ns}::volume_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/volume_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp driving 0 + hsetprop ${scobj_hpath}/pump/volume_sp checklimits ${ns}::checklimits ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp checkstatus ${ns}::volume_checkstatus ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp halt ${ns}::volume_halt ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp driveable pump/volume_pv + hsetprop ${scobj_hpath}/pump/volume_sp control true + hsetprop ${scobj_hpath}/pump/volume_sp data true + hsetprop ${scobj_hpath}/pump/volume_sp mutable true + hsetprop ${scobj_hpath}/pump/volume_sp nxsave true + hsetprop ${scobj_hpath}/pump/volume_sp lowerlimit 0 + hsetprop ${scobj_hpath}/pump/volume_sp upperlimit 100 + hsetprop ${scobj_hpath}/pump/volume_sp tolerance 0.01 + hsetprop ${scobj_hpath}/pump/volume_sp oldval 0.0 + hsetprop ${scobj_hpath}/pump/volume_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/volume_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/volume_sp type "drivable" + hsetprop ${scobj_hpath}/pump/volume_sp units "mL" + hsetprop ${scobj_hpath}/pump/volume_sp nxalias "${name}_pump_volume_sp" if {[string equal -nocase "${simulation_flag}" "false"]} { - ${sct_controller} poll ${scobj_hpath}/ratios/sensor 1 - ${sct_controller} write ${scobj_hpath}/ratios/setpoint + ${sct_controller} poll ${scobj_hpath}/pump/flow_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/ratio_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/state 1 + ${sct_controller} poll ${scobj_hpath}/pump/status 1 + ${sct_controller} poll ${scobj_hpath}/pump/volume_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/volume_sp 1 + ${sct_controller} write ${scobj_hpath}/pump/flow_sp + ${sct_controller} write ${scobj_hpath}/pump/ratio_sp + ${sct_controller} write ${scobj_hpath}/pump/volume_sp } else { ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" } @@ -1300,19 +1433,18 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio } hfactory ${scobj_hpath}/stuff plain spy none - hsetprop ${scobj_hpath}/stuff data "true" + hsetprop ${scobj_hpath}/stuff data "false" hsetprop ${scobj_hpath}/stuff klass "@none" hsetprop ${scobj_hpath}/stuff type "part" hfactory ${scobj_hpath}/stuff/an_out plain user text hsetprop ${scobj_hpath}/stuff/an_out read ${ns}::getValue ${scobj_hpath} rdValue {AN_OUT?} hsetprop ${scobj_hpath}/stuff/an_out rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/an_out control true - hsetprop ${scobj_hpath}/stuff/an_out data true + hsetprop ${scobj_hpath}/stuff/an_out control false + hsetprop ${scobj_hpath}/stuff/an_out data false hsetprop ${scobj_hpath}/stuff/an_out mutable true - hsetprop ${scobj_hpath}/stuff/an_out nxsave true + hsetprop ${scobj_hpath}/stuff/an_out nxsave false hsetprop ${scobj_hpath}/stuff/an_out oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/an_out klass "parameter" hsetprop ${scobj_hpath}/stuff/an_out sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/an_out type "part" hsetprop ${scobj_hpath}/stuff/an_out nxalias "${name}_stuff_an_out" @@ -1320,12 +1452,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/boardinfo plain user text hsetprop ${scobj_hpath}/stuff/boardinfo read ${ns}::getValue ${scobj_hpath} rdValue {BOARDINFO?} hsetprop ${scobj_hpath}/stuff/boardinfo rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/boardinfo control true - hsetprop ${scobj_hpath}/stuff/boardinfo data true + hsetprop ${scobj_hpath}/stuff/boardinfo control false + hsetprop ${scobj_hpath}/stuff/boardinfo data false hsetprop ${scobj_hpath}/stuff/boardinfo mutable true - hsetprop ${scobj_hpath}/stuff/boardinfo nxsave true + hsetprop ${scobj_hpath}/stuff/boardinfo nxsave false hsetprop ${scobj_hpath}/stuff/boardinfo oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/boardinfo klass "parameter" hsetprop ${scobj_hpath}/stuff/boardinfo sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/boardinfo type "part" hsetprop ${scobj_hpath}/stuff/boardinfo nxalias "${name}_stuff_boardinfo" @@ -1333,12 +1464,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/config plain user text hsetprop ${scobj_hpath}/stuff/config read ${ns}::getValue ${scobj_hpath} rdValue {CONFIG?} hsetprop ${scobj_hpath}/stuff/config rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/config control true - hsetprop ${scobj_hpath}/stuff/config data true + hsetprop ${scobj_hpath}/stuff/config control false + hsetprop ${scobj_hpath}/stuff/config data false hsetprop ${scobj_hpath}/stuff/config mutable true - hsetprop ${scobj_hpath}/stuff/config nxsave true + hsetprop ${scobj_hpath}/stuff/config nxsave false hsetprop ${scobj_hpath}/stuff/config oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/config klass "parameter" hsetprop ${scobj_hpath}/stuff/config sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/config type "part" hsetprop ${scobj_hpath}/stuff/config nxalias "${name}_stuff_config" @@ -1346,12 +1476,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/cprofinfo plain user text hsetprop ${scobj_hpath}/stuff/cprofinfo read ${ns}::getValue ${scobj_hpath} rdValue {CPROFINFO?} hsetprop ${scobj_hpath}/stuff/cprofinfo rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/cprofinfo control true - hsetprop ${scobj_hpath}/stuff/cprofinfo data true + hsetprop ${scobj_hpath}/stuff/cprofinfo control false + hsetprop ${scobj_hpath}/stuff/cprofinfo data false hsetprop ${scobj_hpath}/stuff/cprofinfo mutable true - hsetprop ${scobj_hpath}/stuff/cprofinfo nxsave true + hsetprop ${scobj_hpath}/stuff/cprofinfo nxsave false hsetprop ${scobj_hpath}/stuff/cprofinfo oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/cprofinfo klass "parameter" hsetprop ${scobj_hpath}/stuff/cprofinfo sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/cprofinfo type "part" hsetprop ${scobj_hpath}/stuff/cprofinfo nxalias "${name}_stuff_cprofinfo" @@ -1359,12 +1488,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/dout plain user text hsetprop ${scobj_hpath}/stuff/dout read ${ns}::getValue ${scobj_hpath} rdValue {DOUT?} hsetprop ${scobj_hpath}/stuff/dout rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/dout control true - hsetprop ${scobj_hpath}/stuff/dout data true + hsetprop ${scobj_hpath}/stuff/dout control false + hsetprop ${scobj_hpath}/stuff/dout data false hsetprop ${scobj_hpath}/stuff/dout mutable true - hsetprop ${scobj_hpath}/stuff/dout nxsave true + hsetprop ${scobj_hpath}/stuff/dout nxsave false hsetprop ${scobj_hpath}/stuff/dout oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/dout klass "parameter" hsetprop ${scobj_hpath}/stuff/dout sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/dout type "part" hsetprop ${scobj_hpath}/stuff/dout nxalias "${name}_stuff_dout" @@ -1372,12 +1500,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/error plain user text hsetprop ${scobj_hpath}/stuff/error read ${ns}::getValue ${scobj_hpath} rdValue {ERROR?} hsetprop ${scobj_hpath}/stuff/error rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/error control true - hsetprop ${scobj_hpath}/stuff/error data true + hsetprop ${scobj_hpath}/stuff/error control false + hsetprop ${scobj_hpath}/stuff/error data false hsetprop ${scobj_hpath}/stuff/error mutable true - hsetprop ${scobj_hpath}/stuff/error nxsave true + hsetprop ${scobj_hpath}/stuff/error nxsave false hsetprop ${scobj_hpath}/stuff/error oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/error klass "parameter" hsetprop ${scobj_hpath}/stuff/error sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/error type "part" hsetprop ${scobj_hpath}/stuff/error nxalias "${name}_stuff_error" @@ -1385,12 +1512,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/errors plain user text hsetprop ${scobj_hpath}/stuff/errors read ${ns}::getValue ${scobj_hpath} rdValue {ERRORS?} hsetprop ${scobj_hpath}/stuff/errors rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/errors control true - hsetprop ${scobj_hpath}/stuff/errors data true + hsetprop ${scobj_hpath}/stuff/errors control false + hsetprop ${scobj_hpath}/stuff/errors data false hsetprop ${scobj_hpath}/stuff/errors mutable true - hsetprop ${scobj_hpath}/stuff/errors nxsave true + hsetprop ${scobj_hpath}/stuff/errors nxsave false hsetprop ${scobj_hpath}/stuff/errors oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/errors klass "parameter" hsetprop ${scobj_hpath}/stuff/errors sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/errors type "part" hsetprop ${scobj_hpath}/stuff/errors nxalias "${name}_stuff_errors" @@ -1398,12 +1524,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/flushpmp plain user text hsetprop ${scobj_hpath}/stuff/flushpmp read ${ns}::getValue ${scobj_hpath} rdValue {FLUSHPMP?} hsetprop ${scobj_hpath}/stuff/flushpmp rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/flushpmp control true - hsetprop ${scobj_hpath}/stuff/flushpmp data true + hsetprop ${scobj_hpath}/stuff/flushpmp control false + hsetprop ${scobj_hpath}/stuff/flushpmp data false hsetprop ${scobj_hpath}/stuff/flushpmp mutable true - hsetprop ${scobj_hpath}/stuff/flushpmp nxsave true + hsetprop ${scobj_hpath}/stuff/flushpmp nxsave false hsetprop ${scobj_hpath}/stuff/flushpmp oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/flushpmp klass "parameter" hsetprop ${scobj_hpath}/stuff/flushpmp sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/flushpmp type "part" hsetprop ${scobj_hpath}/stuff/flushpmp nxalias "${name}_stuff_flushpmp" @@ -1411,12 +1536,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/head plain user text hsetprop ${scobj_hpath}/stuff/head read ${ns}::getValue ${scobj_hpath} rdValue {HEAD?} hsetprop ${scobj_hpath}/stuff/head rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/head control true - hsetprop ${scobj_hpath}/stuff/head data true + hsetprop ${scobj_hpath}/stuff/head control false + hsetprop ${scobj_hpath}/stuff/head data false hsetprop ${scobj_hpath}/stuff/head mutable true - hsetprop ${scobj_hpath}/stuff/head nxsave true + hsetprop ${scobj_hpath}/stuff/head nxsave false hsetprop ${scobj_hpath}/stuff/head oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/head klass "parameter" hsetprop ${scobj_hpath}/stuff/head sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/head type "part" hsetprop ${scobj_hpath}/stuff/head nxalias "${name}_stuff_head" @@ -1424,12 +1548,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/head_par plain user text hsetprop ${scobj_hpath}/stuff/head_par read ${ns}::getValue ${scobj_hpath} rdValue {HEAD_PAR?} hsetprop ${scobj_hpath}/stuff/head_par rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/head_par control true - hsetprop ${scobj_hpath}/stuff/head_par data true + hsetprop ${scobj_hpath}/stuff/head_par control false + hsetprop ${scobj_hpath}/stuff/head_par data false hsetprop ${scobj_hpath}/stuff/head_par mutable true - hsetprop ${scobj_hpath}/stuff/head_par nxsave true + hsetprop ${scobj_hpath}/stuff/head_par nxsave false hsetprop ${scobj_hpath}/stuff/head_par oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/head_par klass "parameter" hsetprop ${scobj_hpath}/stuff/head_par sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/head_par type "part" hsetprop ${scobj_hpath}/stuff/head_par nxalias "${name}_stuff_head_par" @@ -1437,12 +1560,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/identify plain user text hsetprop ${scobj_hpath}/stuff/identify read ${ns}::getValue ${scobj_hpath} rdValue {IDENTIFY?} hsetprop ${scobj_hpath}/stuff/identify rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/identify control true - hsetprop ${scobj_hpath}/stuff/identify data true + hsetprop ${scobj_hpath}/stuff/identify control false + hsetprop ${scobj_hpath}/stuff/identify data false hsetprop ${scobj_hpath}/stuff/identify mutable true - hsetprop ${scobj_hpath}/stuff/identify nxsave true + hsetprop ${scobj_hpath}/stuff/identify nxsave false hsetprop ${scobj_hpath}/stuff/identify oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/identify klass "parameter" hsetprop ${scobj_hpath}/stuff/identify sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/identify type "part" hsetprop ${scobj_hpath}/stuff/identify nxalias "${name}_stuff_identify" @@ -1450,12 +1572,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/lpg plain user text hsetprop ${scobj_hpath}/stuff/lpg read ${ns}::getValue ${scobj_hpath} rdValue {LPG?} hsetprop ${scobj_hpath}/stuff/lpg rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/lpg control true - hsetprop ${scobj_hpath}/stuff/lpg data true + hsetprop ${scobj_hpath}/stuff/lpg control false + hsetprop ${scobj_hpath}/stuff/lpg data false hsetprop ${scobj_hpath}/stuff/lpg mutable true - hsetprop ${scobj_hpath}/stuff/lpg nxsave true + hsetprop ${scobj_hpath}/stuff/lpg nxsave false hsetprop ${scobj_hpath}/stuff/lpg oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/lpg klass "parameter" hsetprop ${scobj_hpath}/stuff/lpg sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/lpg type "part" hsetprop ${scobj_hpath}/stuff/lpg nxalias "${name}_stuff_lpg" @@ -1463,12 +1584,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/oem plain user text hsetprop ${scobj_hpath}/stuff/oem read ${ns}::getValue ${scobj_hpath} rdValue {OEM?} hsetprop ${scobj_hpath}/stuff/oem rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/oem control true - hsetprop ${scobj_hpath}/stuff/oem data true + hsetprop ${scobj_hpath}/stuff/oem control false + hsetprop ${scobj_hpath}/stuff/oem data false hsetprop ${scobj_hpath}/stuff/oem mutable true - hsetprop ${scobj_hpath}/stuff/oem nxsave true + hsetprop ${scobj_hpath}/stuff/oem nxsave false hsetprop ${scobj_hpath}/stuff/oem oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/oem klass "parameter" hsetprop ${scobj_hpath}/stuff/oem sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/oem type "part" hsetprop ${scobj_hpath}/stuff/oem nxalias "${name}_stuff_oem" @@ -1476,12 +1596,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/opt plain user text hsetprop ${scobj_hpath}/stuff/opt read ${ns}::getValue ${scobj_hpath} rdValue {OPT?} hsetprop ${scobj_hpath}/stuff/opt rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/opt control true - hsetprop ${scobj_hpath}/stuff/opt data true + hsetprop ${scobj_hpath}/stuff/opt control false + hsetprop ${scobj_hpath}/stuff/opt data false hsetprop ${scobj_hpath}/stuff/opt mutable true - hsetprop ${scobj_hpath}/stuff/opt nxsave true + hsetprop ${scobj_hpath}/stuff/opt nxsave false hsetprop ${scobj_hpath}/stuff/opt oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/opt klass "parameter" hsetprop ${scobj_hpath}/stuff/opt sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/opt type "part" hsetprop ${scobj_hpath}/stuff/opt nxalias "${name}_stuff_opt" @@ -1489,12 +1608,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/plim plain user text hsetprop ${scobj_hpath}/stuff/plim read ${ns}::getValue ${scobj_hpath} rdValue {PLIM?} hsetprop ${scobj_hpath}/stuff/plim rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/plim control true - hsetprop ${scobj_hpath}/stuff/plim data true + hsetprop ${scobj_hpath}/stuff/plim control false + hsetprop ${scobj_hpath}/stuff/plim data false hsetprop ${scobj_hpath}/stuff/plim mutable true - hsetprop ${scobj_hpath}/stuff/plim nxsave true + hsetprop ${scobj_hpath}/stuff/plim nxsave false hsetprop ${scobj_hpath}/stuff/plim oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/plim klass "parameter" hsetprop ${scobj_hpath}/stuff/plim sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/plim type "part" hsetprop ${scobj_hpath}/stuff/plim nxalias "${name}_stuff_plim" @@ -1502,12 +1620,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/pressure plain user text hsetprop ${scobj_hpath}/stuff/pressure read ${ns}::getValue ${scobj_hpath} rdValue {PRESSURE?} hsetprop ${scobj_hpath}/stuff/pressure rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/pressure control true - hsetprop ${scobj_hpath}/stuff/pressure data true + hsetprop ${scobj_hpath}/stuff/pressure control false + hsetprop ${scobj_hpath}/stuff/pressure data false hsetprop ${scobj_hpath}/stuff/pressure mutable true - hsetprop ${scobj_hpath}/stuff/pressure nxsave true + hsetprop ${scobj_hpath}/stuff/pressure nxsave false hsetprop ${scobj_hpath}/stuff/pressure oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/pressure klass "parameter" hsetprop ${scobj_hpath}/stuff/pressure sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/pressure type "part" hsetprop ${scobj_hpath}/stuff/pressure nxalias "${name}_stuff_pressure" @@ -1515,12 +1632,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/prfastacq plain user text hsetprop ${scobj_hpath}/stuff/prfastacq read ${ns}::getValue ${scobj_hpath} rdValue {PRFASTACQ?} hsetprop ${scobj_hpath}/stuff/prfastacq rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/prfastacq control true - hsetprop ${scobj_hpath}/stuff/prfastacq data true + hsetprop ${scobj_hpath}/stuff/prfastacq control false + hsetprop ${scobj_hpath}/stuff/prfastacq data false hsetprop ${scobj_hpath}/stuff/prfastacq mutable true - hsetprop ${scobj_hpath}/stuff/prfastacq nxsave true + hsetprop ${scobj_hpath}/stuff/prfastacq nxsave false hsetprop ${scobj_hpath}/stuff/prfastacq oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/prfastacq klass "parameter" hsetprop ${scobj_hpath}/stuff/prfastacq sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/prfastacq type "part" hsetprop ${scobj_hpath}/stuff/prfastacq nxalias "${name}_stuff_prfastacq" @@ -1528,12 +1644,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/purge plain user text hsetprop ${scobj_hpath}/stuff/purge read ${ns}::getValue ${scobj_hpath} rdValue {PURGE?} hsetprop ${scobj_hpath}/stuff/purge rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/purge control true - hsetprop ${scobj_hpath}/stuff/purge data true + hsetprop ${scobj_hpath}/stuff/purge control false + hsetprop ${scobj_hpath}/stuff/purge data false hsetprop ${scobj_hpath}/stuff/purge mutable true - hsetprop ${scobj_hpath}/stuff/purge nxsave true + hsetprop ${scobj_hpath}/stuff/purge nxsave false hsetprop ${scobj_hpath}/stuff/purge oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/purge klass "parameter" hsetprop ${scobj_hpath}/stuff/purge sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/purge type "part" hsetprop ${scobj_hpath}/stuff/purge nxalias "${name}_stuff_purge" @@ -1541,12 +1656,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/remote plain user text hsetprop ${scobj_hpath}/stuff/remote read ${ns}::getValue ${scobj_hpath} rdValue {REMOTE?} hsetprop ${scobj_hpath}/stuff/remote rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/remote control true - hsetprop ${scobj_hpath}/stuff/remote data true + hsetprop ${scobj_hpath}/stuff/remote control false + hsetprop ${scobj_hpath}/stuff/remote data false hsetprop ${scobj_hpath}/stuff/remote mutable true - hsetprop ${scobj_hpath}/stuff/remote nxsave true + hsetprop ${scobj_hpath}/stuff/remote nxsave false hsetprop ${scobj_hpath}/stuff/remote oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/remote klass "parameter" hsetprop ${scobj_hpath}/stuff/remote sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/remote type "part" hsetprop ${scobj_hpath}/stuff/remote nxalias "${name}_stuff_remote" @@ -1554,12 +1668,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/rfid plain user text hsetprop ${scobj_hpath}/stuff/rfid read ${ns}::getValue ${scobj_hpath} rdValue {RFID?} hsetprop ${scobj_hpath}/stuff/rfid rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/rfid control true - hsetprop ${scobj_hpath}/stuff/rfid data true + hsetprop ${scobj_hpath}/stuff/rfid control false + hsetprop ${scobj_hpath}/stuff/rfid data false hsetprop ${scobj_hpath}/stuff/rfid mutable true - hsetprop ${scobj_hpath}/stuff/rfid nxsave true + hsetprop ${scobj_hpath}/stuff/rfid nxsave false hsetprop ${scobj_hpath}/stuff/rfid oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/rfid klass "parameter" hsetprop ${scobj_hpath}/stuff/rfid sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/rfid type "part" hsetprop ${scobj_hpath}/stuff/rfid nxalias "${name}_stuff_rfid" @@ -1567,12 +1680,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/service plain user text hsetprop ${scobj_hpath}/stuff/service read ${ns}::getValue ${scobj_hpath} rdValue {SERVICE?} hsetprop ${scobj_hpath}/stuff/service rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/service control true - hsetprop ${scobj_hpath}/stuff/service data true + hsetprop ${scobj_hpath}/stuff/service control false + hsetprop ${scobj_hpath}/stuff/service data false hsetprop ${scobj_hpath}/stuff/service mutable true - hsetprop ${scobj_hpath}/stuff/service nxsave true + hsetprop ${scobj_hpath}/stuff/service nxsave false hsetprop ${scobj_hpath}/stuff/service oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/service klass "parameter" hsetprop ${scobj_hpath}/stuff/service sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/service type "part" hsetprop ${scobj_hpath}/stuff/service nxalias "${name}_stuff_service" @@ -1580,12 +1692,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/sysinfo plain user text hsetprop ${scobj_hpath}/stuff/sysinfo read ${ns}::getValue ${scobj_hpath} rdValue {SYSINFO?} hsetprop ${scobj_hpath}/stuff/sysinfo rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/sysinfo control true - hsetprop ${scobj_hpath}/stuff/sysinfo data true + hsetprop ${scobj_hpath}/stuff/sysinfo control false + hsetprop ${scobj_hpath}/stuff/sysinfo data false hsetprop ${scobj_hpath}/stuff/sysinfo mutable true - hsetprop ${scobj_hpath}/stuff/sysinfo nxsave true + hsetprop ${scobj_hpath}/stuff/sysinfo nxsave false hsetprop ${scobj_hpath}/stuff/sysinfo oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/sysinfo klass "parameter" hsetprop ${scobj_hpath}/stuff/sysinfo sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/sysinfo type "part" hsetprop ${scobj_hpath}/stuff/sysinfo nxalias "${name}_stuff_sysinfo" @@ -1593,12 +1704,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/units plain user text hsetprop ${scobj_hpath}/stuff/units read ${ns}::getValue ${scobj_hpath} rdValue {UNITS?} hsetprop ${scobj_hpath}/stuff/units rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/units control true - hsetprop ${scobj_hpath}/stuff/units data true + hsetprop ${scobj_hpath}/stuff/units control false + hsetprop ${scobj_hpath}/stuff/units data false hsetprop ${scobj_hpath}/stuff/units mutable true - hsetprop ${scobj_hpath}/stuff/units nxsave true + hsetprop ${scobj_hpath}/stuff/units nxsave false hsetprop ${scobj_hpath}/stuff/units oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/units klass "parameter" hsetprop ${scobj_hpath}/stuff/units sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/units type "part" hsetprop ${scobj_hpath}/stuff/units nxalias "${name}_stuff_units" @@ -1606,12 +1716,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio hfactory ${scobj_hpath}/stuff/valves plain user text hsetprop ${scobj_hpath}/stuff/valves read ${ns}::getValue ${scobj_hpath} rdValue {VALVES?} hsetprop ${scobj_hpath}/stuff/valves rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/stuff/valves control true - hsetprop ${scobj_hpath}/stuff/valves data true + hsetprop ${scobj_hpath}/stuff/valves control false + hsetprop ${scobj_hpath}/stuff/valves data false hsetprop ${scobj_hpath}/stuff/valves mutable true - hsetprop ${scobj_hpath}/stuff/valves nxsave true + hsetprop ${scobj_hpath}/stuff/valves nxsave false hsetprop ${scobj_hpath}/stuff/valves oldval UNKNOWN - hsetprop ${scobj_hpath}/stuff/valves klass "parameter" hsetprop ${scobj_hpath}/stuff/valves sdsinfo "::nexus::scobj::sdsinfo" hsetprop ${scobj_hpath}/stuff/valves type "part" hsetprop ${scobj_hpath}/stuff/valves nxalias "${name}_stuff_valves" @@ -1644,63 +1753,11 @@ proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulatio } else { ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" } - - hfactory ${scobj_hpath}/volume plain spy none - hsetprop ${scobj_hpath}/volume data "true" - hsetprop ${scobj_hpath}/volume klass "@none" - hsetprop ${scobj_hpath}/volume type "part" - - hfactory ${scobj_hpath}/volume/sensor plain user float - hsetprop ${scobj_hpath}/volume/sensor read ${ns}::volume_fetch ${scobj_hpath} rdValue { } - hsetprop ${scobj_hpath}/volume/sensor rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/sensor control true - hsetprop ${scobj_hpath}/volume/sensor data true - hsetprop ${scobj_hpath}/volume/sensor mutable true - hsetprop ${scobj_hpath}/volume/sensor nxsave true - hsetprop ${scobj_hpath}/volume/sensor oldval 0.0 - hsetprop ${scobj_hpath}/volume/sensor klass "parameter" - hsetprop ${scobj_hpath}/volume/sensor sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/volume/sensor type "part" - hsetprop ${scobj_hpath}/volume/sensor units "mL" - hsetprop ${scobj_hpath}/volume/sensor nxalias "${name}_volume_sensor" - - hfactory ${scobj_hpath}/volume/setpoint plain user float - hsetprop ${scobj_hpath}/volume/setpoint read ${ns}::volume_checkpumping ${scobj_hpath} rdValue { } - hsetprop ${scobj_hpath}/volume/setpoint rdValue ${ns}::rdValue ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint write ${ns}::volume_write ${scobj_hpath} noResponse { } - hsetprop ${scobj_hpath}/volume/setpoint noResponse ${ns}::noResponse ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint check ${ns}::checkrange ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint driving 0 - hsetprop ${scobj_hpath}/volume/setpoint checklimits ${ns}::checklimits ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint checkstatus ${ns}::volume_checkstatus ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint halt ${ns}::volume_halt ${scobj_hpath} - hsetprop ${scobj_hpath}/volume/setpoint driveable volume/sensor - hsetprop ${scobj_hpath}/volume/setpoint control true - hsetprop ${scobj_hpath}/volume/setpoint data true - hsetprop ${scobj_hpath}/volume/setpoint mutable true - hsetprop ${scobj_hpath}/volume/setpoint nxsave true - hsetprop ${scobj_hpath}/volume/setpoint lowerlimit 0 - hsetprop ${scobj_hpath}/volume/setpoint upperlimit 100 - hsetprop ${scobj_hpath}/volume/setpoint tolerance 0.01 - hsetprop ${scobj_hpath}/volume/setpoint oldval 0.0 - hsetprop ${scobj_hpath}/volume/setpoint klass "parameter" - hsetprop ${scobj_hpath}/volume/setpoint sdsinfo "::nexus::scobj::sdsinfo" - hsetprop ${scobj_hpath}/volume/setpoint type "drivable" - hsetprop ${scobj_hpath}/volume/setpoint units "mL" - hsetprop ${scobj_hpath}/volume/setpoint nxalias "${name}_volume_setpoint" - - if {[string equal -nocase "${simulation_flag}" "false"]} { - ${sct_controller} poll ${scobj_hpath}/volume/sensor 1 - ${sct_controller} poll ${scobj_hpath}/volume/setpoint 1 - ${sct_controller} write ${scobj_hpath}/volume/setpoint - } else { - ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" - } hsetprop ${scobj_hpath} klass ${device_class} hsetprop ${scobj_hpath} data true hsetprop ${scobj_hpath} debug_threshold 0 if {[string equal -nocase "${simulation_flag}" "false"]} { - ansto_makesctdrive ${name}_volume_setpoint ${scobj_hpath}/volume/setpoint ${scobj_hpath}/volume/sensor ${sct_controller} + ansto_makesctdrive ${name}_pump_volume_sp ${scobj_hpath}/pump/volume_sp ${scobj_hpath}/pump/volume_pv ${sct_controller} } # mkDriver hook code goes here } catch_message ] From 85cbe1eb389bc1ba125ff2765f3e475e8f808edc Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Wed, 17 Sep 2014 07:37:26 +1000 Subject: [PATCH 07/12] Use actual motor names when reporting a tasub setup error. --- tasub.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tasub.c b/tasub.c index 45992104..0d476173 100644 --- a/tasub.c +++ b/tasub.c @@ -370,14 +370,14 @@ int TasUBFactory(SConnection * pCon, SicsInterp * pSics, void *pData, /* curvature motors may be missing, anything else is a serious problem */ - status += testMotor(pNew, pCon, "a1", A1); - status += testMotor(pNew, pCon, "a2", A2); - status += testMotor(pNew, pCon, "a3", A3); - status += testMotor(pNew, pCon, "a4", A4); - status += testMotor(pNew, pCon, "sgu", SGU); - status += testMotor(pNew, pCon, "sgl", SGL); - status += testMotor(pNew, pCon, "a5", A5); - status += testMotor(pNew, pCon, "a6", A6); + status += testMotor(pNew, pCon, pNew->motname[A1], A1); + status += testMotor(pNew, pCon, pNew->motname[A2], A2); + status += testMotor(pNew, pCon, pNew->motname[A3], A3); + status += testMotor(pNew, pCon, pNew->motname[A4], A4); + status += testMotor(pNew, pCon, pNew->motname[SGU], SGU); + status += testMotor(pNew, pCon, pNew->motname[SGL], SGL); + status += testMotor(pNew, pCon, pNew->motname[A5], A5); + status += testMotor(pNew, pCon, pNew->motname[A6], A6); if (status != 8) { SCWrite(pCon, "ERROR: a required motor is missing, tasub NOT installed", eError); From 0ba5045fd9a787856170ac9288f28e4338559b3e Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Wed, 17 Sep 2014 07:47:17 +1000 Subject: [PATCH 08/12] Update motor configuration from ics1-taipan. Also put off renaming s1 to ms1 for magnet config. We need to make sure that there is a sample/s1 link to sample/ms1 and use ms1 in tasub. --- .../tas/config/motors/motor_configuration.tcl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl index a63341d2..6e89389b 100644 --- a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl @@ -113,12 +113,14 @@ if { [ info exists ::config_dict ] } { switch $axis_config { 0 { set use_normal_config "true" + set tilt_motor_driver_type $motor_driver_type } 1 { - set magmot "ms1" + set magmot s1 set magmot_aq "mc2" set magmot_axis "A" set use_normal_config "false" + set tilt_motor_driver_type asim fileeval $cfPath(motors)/magnet_configuration.tcl } } @@ -183,7 +185,7 @@ Motor mtilt $motor_driver_type [params \ maxDecel 1\ stepsPerX 25000\ absEnc 1\ - absEncHome 79650\ + absEncHome 27115\ cntsPerX 4096] mtilt part crystal mtilt long_name mtilt @@ -206,7 +208,7 @@ Motor mtrans $motor_driver_type [params \ maxDecel 1\ stepsPerX 25000\ absEnc 1\ - absEncHome 469388\ + absEncHome 859242\ cntsPerX 4096] mtrans part crystal mtrans long_name mtrans @@ -534,7 +536,7 @@ Motor mhfocus $motor_driver_type [params \ maxSpeed 3.6\ maxAccel 1.728\ maxDecel 1.728\ - stepsPerX [expr 25000.0 * 50.0 / 360.0]\ + stepsPerX [expr -25000.0 * 50.0 / 360.0]\ absEnc 1\ bias_bits 12\ bias_bias 1540\ @@ -564,13 +566,13 @@ Motor m1 $motor_driver_type [params \ maxDecel 0.25\ stepsPerX 100000\ absEnc 1\ - absEncHome 16323070\ + absEncHome 16189898\ cntsPerX -2048] m1 part crystal m1 long_name m1 m1 softlowerlim 5 m1 softupperlim 40 -m1 home 20.45933 +m1 home 0 m1 backlash_offset -1.0 # mc4: Analyzer Tilt 1 -- Two-theta Angle From e31737379c42a6bd2292b872534b197b8e6da37f Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Thu, 18 Sep 2014 17:01:30 +1000 Subject: [PATCH 09/12] SICS-780 Set attributes on environment control objects even if there are errors setting up other objects. --- site_ansto/instrument/server_config.tcl | 33 +++++++++++-------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/site_ansto/instrument/server_config.tcl b/site_ansto/instrument/server_config.tcl index 64e1ece4..d4a3230d 100644 --- a/site_ansto/instrument/server_config.tcl +++ b/site_ansto/instrument/server_config.tcl @@ -254,25 +254,20 @@ proc waitaction {obj action args} { publish waitaction user proc server_set_sobj_attributes {} { - if [ catch { - motor_set_sobj_attributes - ::utility::set_motor_attributes -#XXX::utility::set_histomem_attributes - ::utility::set_sobj_attributes - ::utility::set_envcontrol_attributes - ::plc::set_sobj_attributes - ::counter::set_sobj_attributes - ::nexus::set_sobj_attributes - ::histogram_memory::set_sobj_attributes - ::utility::set_chopper_attributes - ::utility::set_sct_object_attributes -## TODO move the following to the new ansto gumxml.tcl - sicslist setatt getgumtreexml privilege internal - clientput "serverport $::serverport" - } message ] { - if {$::errorCode=="NONE"} {return $message} - return -code error $message - } + if [ catch { motor_set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_motor_attributes } msg ] { puts $msg } + #XXX::utility::set_histomem_attributes + if [ catch { ::utility::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_envcontrol_attributes } msg ] { puts $msg } + if [ catch { ::plc::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::counter::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::nexus::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::histogram_memory::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_chopper_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_sct_object_attributes } msg ] { puts $msg } + ## TODO move the following to the new ansto gumxml.tcl + if [ catch { sicslist setatt getgumtreexml privilege internal } msg ] { puts $msg } + clientput "serverport $::serverport" } proc server_init {} { From cf386ec3efe922d57a251425e47a3bae67cfb394 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Thu, 18 Sep 2014 17:02:56 +1000 Subject: [PATCH 10/12] SICS-781 lakeshore 370 driver does not save data. --- .../temperature/lakeshore_m370.sct | 9 +- .../temperature/sct_lakeshore_m370.tcl | 117 ++++++++---------- 2 files changed, 57 insertions(+), 69 deletions(-) diff --git a/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct b/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct index 9db80f11..cbd2f769 100644 --- a/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct +++ b/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct @@ -1,15 +1,16 @@ # vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent driver lakeshore_m370 = { protocol = std - sobj_priv_type = 'user float' + sobj_priv_type = 'user none' class = environment simulation_group = environment_simulation add_args = 'id tol' - make_args = 'id tol' + make_args = 'tol' + mkdriver_args = 'id' code mkDriver = {%% ::scobj::lakeshore_370::mk_sct_driver $sct_controller environment $name $tol - hsetprop ${scobj_hpath}/setpoint permlink data_set T[format "%02d" ${id}]SP01 - hsetprop ${scobj_hpath}/setpoint @description T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint permlink data_set T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint @description T[format "%02d" ${id}]SP01 hsetprop ${scobj_hpath}/Sensor/value permlink data_set T[format "%02d" ${id}]S01 hsetprop ${scobj_hpath}/Sensor/value @description T[format "%02d" ${id}]S01 %%} diff --git a/site_ansto/instrument/config/environment/temperature/sct_lakeshore_m370.tcl b/site_ansto/instrument/config/environment/temperature/sct_lakeshore_m370.tcl index 401527b9..c959e923 100644 --- a/site_ansto/instrument/config/environment/temperature/sct_lakeshore_m370.tcl +++ b/site_ansto/instrument/config/environment/temperature/sct_lakeshore_m370.tcl @@ -27,24 +27,23 @@ proc ::scobj::lakeshore_m370::sics_log {debug_level debug_string} { } catch_message ] } -proc ::scobj::lakeshore_m370::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port id tol } { - ::scobj::lakeshore_m370::sics_log 9 "::scobj::lakeshore_m370::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${tol}" +proc ::scobj::lakeshore_m370::mkDriver { sct_controller name id tol} { + ::scobj::lakeshore_m370::sics_log 9 "::scobj::lakeshore_m370::mkDriver ${sct_controller} ${name} ${id} ${tol}" set ns "[namespace current]" set catch_status [ catch { - MakeSICSObj ${name} SCT_OBJECT user float + MakeSICSObj ${name} SCT_OBJECT user none - sicslist setatt ${name} klass ${device_class} + sicslist setatt ${name} klass environment sicslist setatt ${name} long_name ${name} set scobj_hpath /sics/${name} - hsetprop ${scobj_hpath} klass ${device_class} - hsetprop ${scobj_hpath} data true + hsetprop ${scobj_hpath} klass environment hsetprop ${scobj_hpath} debug_threshold 5 # mkDriver hook code starts ::scobj::lakeshore_370::mk_sct_driver $sct_controller environment $name $tol - hsetprop ${scobj_hpath}/setpoint permlink data_set T[format "%02d" ${id}]SP01 - hsetprop ${scobj_hpath}/setpoint @description T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint permlink data_set T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint @description T[format "%02d" ${id}]SP01 hsetprop ${scobj_hpath}/Sensor/value permlink data_set T[format "%02d" ${id}]S01 hsetprop ${scobj_hpath}/Sensor/value @description T[format "%02d" ${id}]S01 # mkDriver hook code ends @@ -52,37 +51,31 @@ proc ::scobj::lakeshore_m370::mkDriver { sct_controller name device_class simula handle_exception ${catch_status} ${catch_message} } -proc ::scobj::lakeshore_m370::add_driver {name device_class simulation_flag ip_address tcp_port id tol} { - set catch_status [ catch { - ::scobj::lakeshore_m370::sics_log 9 "::scobj::lakeshore_m370::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${tol}" - if {[string equal -nocase "${simulation_flag}" "false"]} { - if {[string equal -nocase "aqadapter" "${ip_address}"]} { - ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" - makesctcontroller sct_${name} aqadapter ${tcp_port} - } else { - ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} std ${ip_address}:${tcp_port}" - makesctcontroller sct_${name} std ${ip_address}:${tcp_port} - } - } else { - ::scobj::lakeshore_m370::sics_log 9 "simulation_flag={simulation_flag} => No sctcontroller for lakeshore_m370" - } - ::scobj::lakeshore_m370::sics_log 1 "::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${tol}" - ::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${tol} - } catch_message ] - handle_exception ${catch_status} ${catch_message} -} - namespace eval ::scobj::lakeshore_m370 { namespace export debug_threshold namespace export debug_log namespace export sics_log namespace export mkDriver - namespace export add_driver } -proc add_lakeshore_m370 {name ip_address tcp_port id tol} { - set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" - ::scobj::lakeshore_m370::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} "${id}" "${tol}" +proc add_lakeshore_m370 {name IP port id tol} { + set catch_status [ catch { + ::scobj::lakeshore_m370::sics_log 9 "add_lakeshore_m370 ${name} ${IP} ${port} ${tol}" + if {[string equal -nocase [SplitReply [environment_simulation]] "false"]} { + if {[string equal -nocase "aqadapter" "${IP}"]} { + ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} aqadapter ${port}" + makesctcontroller sct_${name} aqadapter ${port} + } else { + ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} std ${IP}:${port}" + makesctcontroller sct_${name} std ${IP}:${port} + } + } else { + ::scobj::lakeshore_m370::sics_log 9 "[environment_simulation] => No sctcontroller for lakeshore_m370" + } + ::scobj::lakeshore_m370::sics_log 1 "::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${id} ${tol}" + ::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${id} ${tol} + } catch_message ] + handle_exception ${catch_status} ${catch_message} } clientput "file evaluation of sct_lakeshore_m370.tcl" @@ -91,41 +84,42 @@ clientput "file evaluation of sct_lakeshore_m370.tcl" proc ::scobj::lakeshore_m370::read_config {} { set catch_status [ catch { set ns "::scobj::lakeshore_m370" - dict for {k u} $::config_dict { - if { [dict exists $u "implementation"] } { - set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" - set device_class "environment" - if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + dict for {k v} $::config_dict { + if { [dict exists $v "implementation"] } { + if { !([dict exists $v "name"] && [dict exists $v "enabled"]) } { continue } - set enabled [string tolower [dict get $u "enabled"]] + set enabled [string tolower [dict get $v "enabled"]] if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { continue } - if { [dict exists $u "simulation_group"] } { - set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] - } - if { [dict exists $u "device_class"] } { - set device_class "[dict get $u "device_class"]" - } - set name [dict get $u name] - set implementation [dict get $u "implementation"] + set name [dict get $v name] + set implementation [dict get $v "implementation"] if { !([dict exists $::config_dict $implementation]) } { continue } + set arg_list [list] + foreach arg {id} { + if {[dict exists $v $arg]} { + lappend arg_list "[dict get $v $arg]" + } else { + ${ns}::sics_log 9 "Missing configuration value $arg" + error "Missing configuration value $arg" + } + } set v [dict get $::config_dict $implementation] if { !([dict exists $v "driver"]) } { continue } if { [string equal -nocase [dict get $v "driver"] "lakeshore_m370"] } { - if { ![string equal -nocase "${simulation_flag}" "false"] } { + if { ![string equal -nocase [SplitReply [environment_simulation]] "false"] } { set asyncqueue "null" - ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + ${ns}::sics_log 9 "[environment_simulation] => using null asyncqueue" } elseif { [dict exists $v "asyncqueue"] } { set asyncqueue [dict get $v "asyncqueue"] if { [string equal -nocase ${asyncqueue} "sct"] } { - set ip_address [dict get $v ip] - set tcp_port [dict get $v port] + set IP [dict get $v ip] + set PORT [dict get $v port] } } else { if { [dict exists $v "asyncprotocol"] } { @@ -139,32 +133,25 @@ proc ::scobj::lakeshore_m370::read_config {} { } } set asyncqueue ${name}_queue - set ip_address [dict get $v ip] - set tcp_port [dict get $v port] - MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + set IP [dict get $v ip] + set PORT [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${IP} ${PORT} if { [dict exists $v "timeout"] } { ${asyncqueue} timeout "[dict get $v "timeout"]" } } - set arg_list [list] - set missing_list [list] - foreach arg {id tol} { - if {[dict exists $u $arg]} { - lappend arg_list "[dict get $u $arg]" - } elseif {[dict exists $v $arg]} { + foreach arg {tol} { + if {[dict exists $v $arg]} { lappend arg_list "[dict get $v $arg]" } else { ${ns}::sics_log 9 "Missing configuration value $arg" - lappend missing_list $arg + error "Missing configuration value $arg" } } - if { [llength $missing_list] > 0 } { - error "$name is missing configuration values $missing_list" - } if { [string equal -nocase ${asyncqueue} "sct"] } { - ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list + add_lakeshore_m370 ${name} ${IP} ${PORT} {*}$arg_list } else { - ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} {*}$arg_list + add_lakeshore_m370 ${name} "aqadapter" ${asyncqueue} {*}$arg_list } } } From 018ba901897eb1321f933c5dedff686f5aa46657 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Thu, 18 Sep 2014 17:05:01 +1000 Subject: [PATCH 11/12] SICS-783 Load extra environment driver configurations for Echidna. --- .../instrument/hrpd/echidna_configuration.tcl | 36 ++++++++++++++----- .../instrument/hrpd/util/sics_config.ini | 8 +++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/site_ansto/instrument/hrpd/echidna_configuration.tcl b/site_ansto/instrument/hrpd/echidna_configuration.tcl index d8b7e518..975afd82 100644 --- a/site_ansto/instrument/hrpd/echidna_configuration.tcl +++ b/site_ansto/instrument/hrpd/echidna_configuration.tcl @@ -25,19 +25,37 @@ source $cfPath(hipadaba)/hipadaba_configuration.tcl fileeval $cfPath(motors)/positmotor_configuration.tcl fileeval $cfPath(plc)/plc.tcl fileeval $cfPath(counter)/counter.tcl -#TODO Provide method for choosing environment controller +fileeval $cfPath(environment)/sct_agilent_33220A.tcl +fileeval $cfPath(environment)/sct_hiden_xcs.tcl +fileeval $cfPath(environment)/sct_huber_pilot.tcl +fileeval $cfPath(environment)/sct_isotech_ps.tcl fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl +fileeval $cfPath(environment)/temperature/sct_eurotherm_m2000.tcl fileeval $cfPath(environment)/sct_keithley_2700.tcl -fileeval $cfPath(environment)/magneticField/sct_green_magnet.tcl +fileeval $cfPath(environment)/sct_keithley_m2700.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_218.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl +fileeval $cfPath(environment)/temperature/sct_ls336.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_340.tcl +fileeval $cfPath(environment)/temperature/sct_ls340.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_370.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_m370.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_base.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_level.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_pres.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_scpi.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_temp.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_valve.tcl +fileeval $cfPath(environment)/sct_protek_common.tcl +fileeval $cfPath(environment)/sct_protekmm.tcl +fileeval $cfPath(environment)/temperature/west400.tcl +fileeval $cfPath(environment)/temperature/sct_west4100.tcl +fileeval $cfPath(environment)/temperature/sct_watlow_pm.tcl fileeval $cfPath(environment)/magneticField/sct_oxford_labview.tcl fileeval $cfPath(environment)/magneticField/sct_oxford12tlv.tcl -fileeval $cfPath(environment)/sct_keithley_2700.tcl -fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl -fileeval $cfPath(environment)/temperature/sct_lakeshore_340.tcl -fileeval $cfPath(environment)/temperature/sct_oxford_mercury.tcl -fileeval $cfPath(environment)/temperature/sct_mercury_scpi.tcl -fileeval $cfPath(environment)/temperature/west400.tcl -fileeval $cfPath(environment)/temperature/sct_watlow_pm.tcl +fileeval $cfPath(environment)/he3/sct_he3.tcl +fileeval $cfPath(environment)/magneticField/sct_green_magnet.tcl +fileeval $cfPath(environment)/magneticField/sct_green_magnet_labview.tcl fileeval $cfPath(hmm)/hmm_configuration.tcl fileeval $cfPath(nexus)/nxscripts.tcl fileeval $cfPath(scan)/scan.tcl diff --git a/site_ansto/instrument/hrpd/util/sics_config.ini b/site_ansto/instrument/hrpd/util/sics_config.ini index b8011634..41b97e48 100644 --- a/site_ansto/instrument/hrpd/util/sics_config.ini +++ b/site_ansto/instrument/hrpd/util/sics_config.ini @@ -246,6 +246,14 @@ terminator = \r\n tol1 = 1.0 tol2 = 1.0 +[ls370_1] +desc = "Lakeshore 370 Resistance Bridge" +driver = "lakeshore_m370" +imptype = temperature +ip = 10.157.205.42 +port = 4001 +tol = 1.0 + [mercury_scpi_01] desc = "Oxford Mercury temperature controller in Mercury mode" driver = "mercury_scpi" From 84cc1d5b4ce8f1ac470b9fd431366ebbc6174c79 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Thu, 18 Sep 2014 17:20:53 +1000 Subject: [PATCH 12/12] SICS-782 Configure autofocussing on Taipan. --- site_ansto/instrument/tas/taipan_configuration.tcl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/site_ansto/instrument/tas/taipan_configuration.tcl b/site_ansto/instrument/tas/taipan_configuration.tcl index 2e910fc4..189815c0 100644 --- a/site_ansto/instrument/tas/taipan_configuration.tcl +++ b/site_ansto/instrument/tas/taipan_configuration.tcl @@ -61,9 +61,21 @@ source gumxml.tcl # init for the tasUB #make mcv mch acv ach into mvfocus mhfocus avfocus ahfocus when it works puts "doing tasub" -MakeTasUB tasub m1 m2 mcv mch s1 s2 sgu sgl a1 a2 acv ach +MakeTasUB tasub m1 m2 mvfocus mhfocus s1 s2 sgu sgl a1 a2 avfocus ahfocus tasub mono dd 3.35416 tasub ana dd 3.35416 +tasub mono vb1 102.2 +tasub mono vb2 1.78 +tasub mono hb1 184.42 +tasub mono hb2 -60.1 +tasub mono hb3 0.951 +tasub ana vb1 115 +tasub ana vb2 2.13 +tasub ana hb1 45.68 +tasub ana hb2 105.7 +tasub ana hb3 0.945 +tasub focusfn energy +tasub autofocus 0 tasub updatetargets puts "done tasub"