diff --git a/site_ansto/instrument/config/environment/hiden_xcs.sct b/site_ansto/instrument/config/environment/hiden_xcs.sct index 86f6bdeb..86bbab8d 100644 --- a/site_ansto/instrument/config/environment/hiden_xcs.sct +++ b/site_ansto/instrument/config/environment/hiden_xcs.sct @@ -7,9 +7,8 @@ driver hiden_xcs = { vendor = hiden; device = xcs; protocol = std; class = environment simulation_group = environment_simulation - add_args = 'terminator {tol 0.5}'; - make_args = 'tol'; - protocol_args = '${terminator}'; + add_args = 'id' + make_args = 'id' # # Unnamed group has variables at device level # @@ -22,6 +21,7 @@ driver hiden_xcs = { property 'klass' = 'environment' property 'sdsinfo' = '::nexus::scobj::sdsinfo' var enabled = { + permlink = 'G.X02' type = int; priv = user; readable = 10; @@ -34,48 +34,6 @@ driver hiden_xcs = { readable = 10; # property junk = junk; } - var flow = { - driveable = flow - mutable = true - readable = 1 - read_command = 'None' - fetch_function = fetch_flow - read_function = read_flow - write_function = write_flow - 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.2 - property pid_ivalue = 0.1 - property pid_dvalue = 0.0 - property pid_imax = 30 - } - var humidity = { - driveable = humidity - mutable = true - readable = 1 - read_command = '?ALL DATA' - read_function = read_all_data - write_function = write_humidity - checkrange_function = chkrange_function - value = 50 - lowerlimit = 10 - upperlimit = 90 - tolerance = 1 - pid_function = pid_humidity - property pid_error = 0 - property pid_deriv = 0 - property pid_integ = 0 - property pid_pvalue = 0.2 - property pid_ivalue = 0.1 - property pid_dvalue = 0.0 - property pid_imax = 30 - property settle_time = 5.250 - } var gas_factor = { value = 1.0; } control = false data = false @@ -88,6 +46,72 @@ driver hiden_xcs = { # # The named group is at the device level, variables below that # + group flow = { + type = float + mutable = true + priv = user + group_property 'data' = 'true' + group_property 'nxsave' = 'true' + property 'klass' = 'environment' + property 'sdsinfo' = '::nexus::scobj::sdsinfo' + var sensor = { + permlink = 'G.S01' + readable = 1 + read_command = 'None' + fetch_function = fetch_flow + read_function = read_flow + pid_function = pid_flow + property pid_error = 0 + property pid_deriv = 0 + property pid_integ = 0 + property pid_pvalue = 0.2 + property pid_ivalue = 0.1 + property pid_dvalue = 0.0 + property pid_imax = 30 + } + var setpoint = { + permlink = 'G.SP01' + driveable = flow/sensor + write_function = write_flow + value = 100 + lowerlimit = 0 + upperlimit = 500 + tolerance = 1 + } + } + group humidity = { + type = float + mutable = true + priv = user + group_property 'data' = 'true' + group_property 'nxsave' = 'true' + property 'klass' = 'environment' + property 'sdsinfo' = '::nexus::scobj::sdsinfo' + var sensor = { + permlink = 'G.S02' + readable = 1 + read_command = '?ALL DATA' + read_function = read_all_data + pid_function = pid_humidity + property pid_error = 0 + property pid_deriv = 0 + property pid_integ = 0 + property pid_pvalue = 0.2 + property pid_ivalue = 0.1 + property pid_dvalue = 0.0 + property pid_imax = 30 + } + var setpoint = { + permlink = 'G.SP02' + driveable = humidity/sensor + write_function = write_humidity + checkrange_function = chkrange_function + value = 50 + lowerlimit = 10 + upperlimit = 90 + tolerance = 1 + } + } group analog = { # group_property 'data' = true type = float; @@ -127,8 +151,8 @@ driver hiden_xcs = { @ } else { @ sct geterror "Syntax error in: '${data}'" @ } - } + code read_function read_twelve = { @ if { [string equal -nocase -length 5 "${data}" "AOUT ="] } { @ set result [scan "${data}" "AOUT = %d OK" val] @@ -176,58 +200,64 @@ driver hiden_xcs = { } code read_function read_all_data = { -@ if { [string equal -nocase -length 2 "${data}" "A "] } { -@ set data_list [split [string range "${data}" 2 end-3] ','] -@ if { [llength ${data_list}] == 8 } { -@ set data [expr [lindex ${data_list} 0]] -@ hupdate ${tc_root}/temperature [expr [lindex ${data_list} 1]] -@ hupdate ${tc_root}/flow1 [expr [lindex ${data_list} 3] / [hval ${tc_root}/gas_factor]] -@ hupdate ${tc_root}/flow2 [expr [lindex ${data_list} 4] / [hval ${tc_root}/gas_factor]] -@ hupdate ${tc_root}/flow3 [expr [lindex ${data_list} 5] / [hval ${tc_root}/gas_factor]] +@ if { [string equal -nocase -length 2 "${data}" "A "] } { +@ set data_list [split [string range "${data}" 2 end-3] ','] +@ if { [llength ${data_list}] == 8 } { +@ set data [expr [lindex ${data_list} 0]] +@ hupdate ${tc_root}/temperature [expr [lindex ${data_list} 1]] +@ hupdate ${tc_root}/flow1 [expr [lindex ${data_list} 3] / [hval ${tc_root}/gas_factor]] +@ hupdate ${tc_root}/flow2 [expr [lindex ${data_list} 4] / [hval ${tc_root}/gas_factor]] +@ hupdate ${tc_root}/flow3 [expr [lindex ${data_list} 5] / [hval ${tc_root}/gas_factor]] +@ } else { +@ sct geterror "Syntax error (not 8) for read_all_data in: '${data}'" +@ } @ } else { -@ sct geterror "Syntax error (not 8) for read_all_data in: '${data}'" +@ sct geterror "Syntax error (not A) for read_all_data in: '${data}'" +@ } +@ set sp [pathname [sct]]/setpoint +@ if { [hpropexists ${sp} target] } { +@ set sp [hgetpropval ${sp} target] +@ pid_humidity ${tc_root} ${sp} ${data} @ } -@ } else { -@ sct geterror "Syntax error (not A) for read_all_data in: '${data}'" -@ } -@ if { [hpropexists [sct] target] } { -@ set pid [pid_humidity ${tc_root} [sct target] ${data}] -@ } } code pid_function pid_humidity = { -@ set path [pathname [sct]] @ set sign 1 @ foreach node [list analog/sp1 analog/sp2] { @ set sign [expr -${sign}] @ set signed_pid [expr ${sign} * ${pid}] -@ hsetprop ${path}/${node} bias_humidity ${signed_pid} -@ if { [hpropexists ${path}/${node} target] } { -@ hset ${path}/${node} [hgetpropval ${path}/${node} target] +@ hsetprop ${tc_root}/${node} bias_humidity ${signed_pid} +@ if { [hpropexists ${tc_root}/${node} target] } { +@ hset ${tc_root}/${node} [hgetpropval ${tc_root}/${node} target] @ } else { -@ hset ${path}/${node} [hval ${path}/${node}] +@ hset ${tc_root}/${node} [hval ${tc_root}/${node}] @ } @ } -@ } } code fetch_function fetch_flow = { -@ if { [hpropexists [sct] target] } { -@ set pid [pid_flow ${tc_root} [sct target] ${data}] +@ set data 0.0 +@ foreach node [list flow1 flow2] { +@ set data [expr ${data} + [hval ${tc_root}/${node}]] @ } -@ set cmd "@@NOSEND@@" -} +@ sct result ${data} +@ set sp [pathname [sct]]/setpoint +@ if { [hpropexists ${sp} target] } { +@ set sp [hgetpropval ${sp} target] +@ pid_flow ${tc_root} ${sp} ${data} +@ } +@ set cmd "@@NOSEND@@" + } + code pid_function pid_flow = { -@ set path [pathname [sct]] @ foreach node [list analog/sp1 analog/sp2] { -@ hsetprop ${path}/${node} bias_flow ${pid} -@ if { [hpropexists ${path}/${node} target] } { -@ hset ${path}/${node} [hgetpropval ${path}/${node} target] +@ hsetprop ${tc_root}/${node} bias_flow ${pid} +@ if { [hpropexists ${tc_root}/${node} target] } { +@ hset ${tc_root}/${node} [hgetpropval ${tc_root}/${node} target] @ } else { -@ hset ${path}/${node} [hval ${path}/${node}] +@ hset ${tc_root}/${node} [hval ${tc_root}/${node}] @ } @ } -@ } } code write_function write_digital = { @@ -260,28 +290,30 @@ driver hiden_xcs = { } code write_function write_flow = { -@ if { [hpropexists ${tc_root}/humidity target] } { -@ set humidity_target [hgetpropval ${tc_root}/humidity target] +@ if { [hpropexists ${tc_root}/humidity/setpoint target] } { +@ set humidity_target [hgetpropval ${tc_root}/humidity/setpoint target] @ } else { -@ set humidity_target [hval ${tc_root}/humidity] +@ set humidity_target [hval ${tc_root}/humidity/setpoint] @ } @ set flow1_target [expr (0.01 * (100.0 - ${humidity_target})) * [sct target]] @ set flow2_target [expr (0.01 * ( ${humidity_target})) * [sct target]] @ hset ${tc_root}/analog/sp1 ${flow1_target} @ hset ${tc_root}/analog/sp2 ${flow2_target} +@ set nextState "idle" @ set cmd "@@NOSEND@@" } code write_function write_humidity = { -@ if { [hpropexists ${tc_root}/flow target] } { -@ set flow_target [hgetpropval ${tc_root}/flow target] +@ if { [hpropexists ${tc_root}/flow/setpoint target] } { +@ set flow_target [hgetpropval ${tc_root}/flow/setpoint target] @ } else { -@ set flow_target [hval ${tc_root}/flow] +@ set flow_target [hval ${tc_root}/flow/setpoint] @ } @ set flow1_target [expr (0.01 * (100.0 - [sct target])) * ${flow_target}] @ set flow2_target [expr (0.01 * ( [sct target])) * ${flow_target}] @ hset ${tc_root}/analog/sp1 ${flow1_target} @ hset ${tc_root}/analog/sp2 ${flow2_target} +@ set nextState "idle" @ set cmd "@@NOSEND@@" }