diff --git a/site_ansto/instrument/config/environment/hiden_xcs.sct b/site_ansto/instrument/config/environment/hiden_xcs.sct index 88574944..4ed65085 100644 --- a/site_ansto/instrument/config/environment/hiden_xcs.sct +++ b/site_ansto/instrument/config/environment/hiden_xcs.sct @@ -2,7 +2,7 @@ # Simple driver generator for the Hiden Isochema XCS vapour delivery system # vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent # -driver hiden_xcs_gen = { +driver hiden_xcs = { # driver_property douglas = clowes usecreatenode = false vendor = hiden; device = xcs; protocol = std; @@ -19,6 +19,25 @@ driver hiden_xcs_gen = { type = float priv = user var temperature + var flow = { + driveable = flow + readable = 1 + fetch_function = fetch_flow + read_function = read_flow + read_command = 'flow1 flow2' + write_function = no_op + lowerlimit = 0 + upperlimit = 500 + tolerance = 1 + pid_function = pid_flow + property pid_error = 0 + property pid_deriv = 0 + property pid_integ = 0 + property pid_pvalue = 0.05 + property pid_ivalue = 0.01 + property pid_dvalue = 0.0 + property pid_imax = 1 + } var flow1 var flow2 var flow3 @@ -28,11 +47,20 @@ driver hiden_xcs_gen = { readable = 1 read_command = '?ALL DATA' read_function = read_all_data + write_function = no_op checkrange_function = chkrange_function value = 50 lowerlimit = 10 upperlimit = 90 - tolerance = 5 + tolerance = 1 + pid_function = pid_humidity + property pid_error = 0 + property pid_deriv = 0 + property pid_integ = 0 + property pid_pvalue = 0.05 + property pid_ivalue = 0.005 + property pid_dvalue = 0.0 + property pid_imax = 1 } } # @@ -65,7 +93,7 @@ driver hiden_xcs_gen = { writeable = 1; read_function = read_digital; write_Function = write_digital; - var dout2 = { + var enabled = { read_command = '?DOUT,2'; write_command = '!DOUT,2,'; allowed = '0,1'; @@ -149,6 +177,70 @@ driver hiden_xcs_gen = { @ } else { @ sct geterror "Syntax error for read_all_data in: '${data}'" @ } +@ if { [hpropexists [sct] target] } { +#@ sct pid_error [expr [sct target] - ${data}] +#@ set p_value [expr [sct pid_pvalue] * [sct pid_error]] +#@ set d_value [expr [sct pid_dvalue] * (${data} - [sct oldval])] +#@ sct pid_deriv [sct pid_error] +#@ sct pid_integ [expr [sct pid_integ] + [sct pid_error]] +#@ if { [sct pid_integ] > [sct pid_imax] } { +#@ sct pid_integ [sct pid_imax] +#@ } +#@ if { [sct pid_integ] < -[sct pid_imax] } { +#@ sct pid_integ -[sct pid_imax] +#@ } +#@ set i_value [expr [sct pid_ivalue] * [sct pid_integ]] +#@ set pid [expr ${p_value} + ${i_value} + ${d_value}] +#@ sct pid_output ${pid} +@ set pid [pid_humidity ${tc_root} [sct target] ${data}] +@ set path [pathname [sct]] +@ foreach node [list analog/sp1 analog/sp2] { +@ set pid [expr -${pid}] +@ if { [hpropexists ${path}/${node} target] } { +@ hset ${path}/${node} [expr [hgetpropval ${path}/${node} target] + ${pid}] +@ } else { +@ hset ${path}/${node} [expr [hval ${path}/${node}] + ${pid}] +@ } +@ } +@ } + } + code fetch_function fetch_flow = { +@ set data 0.0 +@ set targets 0.0 +@ set path [pathname [sct]] +@ foreach node [list flow1 flow2] { +@ set data [expr ${data} + [hval ${path}/${node}]] +@ } +@ sct result ${data} +@ foreach node [list analog/sp1 analog/sp2] { +@ set targets [expr ${targets} + [hval ${path}/${node}]] +@ } +@ sct targets ${targets} +@ if { [hpropexists [sct] target] } { +#@ sct pid_error [expr [sct target] - [sct result]] +#@ set p_value [expr [sct pid_pvalue] * [sct pid_error]] +#@ set d_value [expr [sct pid_dvalue] * ([sct result] - [sct oldval])] +#@ sct pid_deriv [sct pid_error] +#@ sct pid_integ [expr [sct pid_integ] + [sct pid_error]] +#@ if { [sct pid_integ] > [sct pid_imax] } { +#@ sct pid_integ [sct pid_imax] +#@ } +#@ if { [sct pid_integ] < -[sct pid_imax] } { +#@ sct pid_integ -[sct pid_imax] +#@ } +#@ set i_value [expr [sct pid_ivalue] * [sct pid_integ]] +#@ set pid [expr ${p_value} + ${i_value} + ${d_value}] +#@ sct pid_output ${pid} +@ set pid [pid_flow ${tc_root} [sct target] ${data}] +@ foreach node [list analog/sp1 analog/sp2] { +@ if { [hpropexists ${path}/${node} target] } { +@ hset ${path}/${node} [expr [hgetpropval ${path}/${node} target] + ${pid}] +@ } else { +@ hset ${path}/${node} [expr [hval ${path}/${node}] + ${pid}] +@ } +@ } +@ } +@ return ${nextState} } code write_function write_digital = { } @@ -163,9 +255,17 @@ driver hiden_xcs_gen = { @ } else { @ set span 500.0 @ } -@ set par [expr int(${base} + (4095.0 * ${par} / ${SPAN}))] +@ set par [expr int(${base} + (4095.0 * ${par} / ${span}))] @ set cmd "${cmd_str}${par}" } + code write_function no_op = { +@ if { [hpropexists [sct] driving] } { +@ if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { +@ sct driving 1 +@ } +@ } +@ return ${nextState} + } # # This code is after database creation #