Split out the flow/humidity sensor/setpoint as four separate nodes
This commit is contained in:
@ -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@@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user