Split out the flow/humidity sensor/setpoint as four separate nodes

This commit is contained in:
Douglas Clowes
2014-04-16 10:08:08 +10:00
parent 6f0e0b80f8
commit 43035bfb37

View File

@ -7,9 +7,8 @@ driver hiden_xcs = {
vendor = hiden; device = xcs; protocol = std; vendor = hiden; device = xcs; protocol = std;
class = environment class = environment
simulation_group = environment_simulation simulation_group = environment_simulation
add_args = 'terminator {tol 0.5}'; add_args = 'id'
make_args = 'tol'; make_args = 'id'
protocol_args = '${terminator}';
# #
# Unnamed group has variables at device level # Unnamed group has variables at device level
# #
@ -22,6 +21,7 @@ driver hiden_xcs = {
property 'klass' = 'environment' property 'klass' = 'environment'
property 'sdsinfo' = '::nexus::scobj::sdsinfo' property 'sdsinfo' = '::nexus::scobj::sdsinfo'
var enabled = { var enabled = {
permlink = 'G.X02'
type = int; type = int;
priv = user; priv = user;
readable = 10; readable = 10;
@ -34,48 +34,6 @@ driver hiden_xcs = {
readable = 10; readable = 10;
# property junk = junk; # 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; } var gas_factor = { value = 1.0; }
control = false control = false
data = false data = false
@ -88,6 +46,72 @@ driver hiden_xcs = {
# #
# The named group is at the device level, variables below that # 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 analog = {
# group_property 'data' = true # group_property 'data' = true
type = float; type = float;
@ -127,8 +151,8 @@ driver hiden_xcs = {
@ } else { @ } else {
@ sct geterror "Syntax error in: '${data}'" @ sct geterror "Syntax error in: '${data}'"
@ } @ }
} }
code read_function read_twelve = { code read_function read_twelve = {
@ if { [string equal -nocase -length 5 "${data}" "AOUT ="] } { @ if { [string equal -nocase -length 5 "${data}" "AOUT ="] } {
@ set result [scan "${data}" "AOUT = %d OK" val] @ set result [scan "${data}" "AOUT = %d OK" val]
@ -190,42 +214,48 @@ driver hiden_xcs = {
@ } else { @ } else {
@ sct geterror "Syntax error (not A) for read_all_data in: '${data}'" @ sct geterror "Syntax error (not A) for read_all_data in: '${data}'"
@ } @ }
@ if { [hpropexists [sct] target] } { @ set sp [pathname [sct]]/setpoint
@ set pid [pid_humidity ${tc_root} [sct target] ${data}] @ if { [hpropexists ${sp} target] } {
@ set sp [hgetpropval ${sp} target]
@ pid_humidity ${tc_root} ${sp} ${data}
@ } @ }
} }
code pid_function pid_humidity = { code pid_function pid_humidity = {
@ set path [pathname [sct]]
@ set sign 1 @ set sign 1
@ foreach node [list analog/sp1 analog/sp2] { @ foreach node [list analog/sp1 analog/sp2] {
@ set sign [expr -${sign}] @ set sign [expr -${sign}]
@ set signed_pid [expr ${sign} * ${pid}] @ set signed_pid [expr ${sign} * ${pid}]
@ hsetprop ${path}/${node} bias_humidity ${signed_pid} @ hsetprop ${tc_root}/${node} bias_humidity ${signed_pid}
@ if { [hpropexists ${path}/${node} target] } { @ if { [hpropexists ${tc_root}/${node} target] } {
@ hset ${path}/${node} [hgetpropval ${path}/${node} target] @ hset ${tc_root}/${node} [hgetpropval ${tc_root}/${node} target]
@ } else { @ } else {
@ hset ${path}/${node} [hval ${path}/${node}] @ hset ${tc_root}/${node} [hval ${tc_root}/${node}]
@ }
@ } @ }
@ } @ }
} }
code fetch_function fetch_flow = { code fetch_function fetch_flow = {
@ if { [hpropexists [sct] target] } { @ set data 0.0
@ set pid [pid_flow ${tc_root} [sct target] ${data}] @ foreach node [list flow1 flow2] {
@ set data [expr ${data} + [hval ${tc_root}/${node}]]
@ }
@ 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@@" @ set cmd "@@NOSEND@@"
} }
code pid_function pid_flow = { code pid_function pid_flow = {
@ set path [pathname [sct]]
@ foreach node [list analog/sp1 analog/sp2] { @ foreach node [list analog/sp1 analog/sp2] {
@ hsetprop ${path}/${node} bias_flow ${pid} @ hsetprop ${tc_root}/${node} bias_flow ${pid}
@ if { [hpropexists ${path}/${node} target] } { @ if { [hpropexists ${tc_root}/${node} target] } {
@ hset ${path}/${node} [hgetpropval ${path}/${node} target] @ hset ${tc_root}/${node} [hgetpropval ${tc_root}/${node} target]
@ } else { @ } else {
@ hset ${path}/${node} [hval ${path}/${node}] @ hset ${tc_root}/${node} [hval ${tc_root}/${node}]
@ }
@ } @ }
@ } @ }
} }
@ -260,28 +290,30 @@ driver hiden_xcs = {
} }
code write_function write_flow = { code write_function write_flow = {
@ if { [hpropexists ${tc_root}/humidity target] } { @ if { [hpropexists ${tc_root}/humidity/setpoint target] } {
@ set humidity_target [hgetpropval ${tc_root}/humidity target] @ set humidity_target [hgetpropval ${tc_root}/humidity/setpoint target]
@ } else { @ } 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 flow1_target [expr (0.01 * (100.0 - ${humidity_target})) * [sct target]]
@ set flow2_target [expr (0.01 * ( ${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/sp1 ${flow1_target}
@ hset ${tc_root}/analog/sp2 ${flow2_target} @ hset ${tc_root}/analog/sp2 ${flow2_target}
@ set nextState "idle"
@ set cmd "@@NOSEND@@" @ set cmd "@@NOSEND@@"
} }
code write_function write_humidity = { code write_function write_humidity = {
@ if { [hpropexists ${tc_root}/flow target] } { @ if { [hpropexists ${tc_root}/flow/setpoint target] } {
@ set flow_target [hgetpropval ${tc_root}/flow target] @ set flow_target [hgetpropval ${tc_root}/flow/setpoint target]
@ } else { @ } 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 flow1_target [expr (0.01 * (100.0 - [sct target])) * ${flow_target}]
@ set flow2_target [expr (0.01 * ( [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/sp1 ${flow1_target}
@ hset ${tc_root}/analog/sp2 ${flow2_target} @ hset ${tc_root}/analog/sp2 ${flow2_target}
@ set nextState "idle"
@ set cmd "@@NOSEND@@" @ set cmd "@@NOSEND@@"
} }