Add total flow and PID-ish control
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
# Simple driver generator for the Hiden Isochema XCS vapour delivery system
|
# Simple driver generator for the Hiden Isochema XCS vapour delivery system
|
||||||
# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent
|
# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent
|
||||||
#
|
#
|
||||||
driver hiden_xcs_gen = {
|
driver hiden_xcs = {
|
||||||
# driver_property douglas = clowes
|
# driver_property douglas = clowes
|
||||||
usecreatenode = false
|
usecreatenode = false
|
||||||
vendor = hiden; device = xcs; protocol = std;
|
vendor = hiden; device = xcs; protocol = std;
|
||||||
@ -19,6 +19,25 @@ driver hiden_xcs_gen = {
|
|||||||
type = float
|
type = float
|
||||||
priv = user
|
priv = user
|
||||||
var temperature
|
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 flow1
|
||||||
var flow2
|
var flow2
|
||||||
var flow3
|
var flow3
|
||||||
@ -28,11 +47,20 @@ driver hiden_xcs_gen = {
|
|||||||
readable = 1
|
readable = 1
|
||||||
read_command = '?ALL DATA'
|
read_command = '?ALL DATA'
|
||||||
read_function = read_all_data
|
read_function = read_all_data
|
||||||
|
write_function = no_op
|
||||||
checkrange_function = chkrange_function
|
checkrange_function = chkrange_function
|
||||||
value = 50
|
value = 50
|
||||||
lowerlimit = 10
|
lowerlimit = 10
|
||||||
upperlimit = 90
|
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;
|
writeable = 1;
|
||||||
read_function = read_digital;
|
read_function = read_digital;
|
||||||
write_Function = write_digital;
|
write_Function = write_digital;
|
||||||
var dout2 = {
|
var enabled = {
|
||||||
read_command = '?DOUT,2';
|
read_command = '?DOUT,2';
|
||||||
write_command = '!DOUT,2,';
|
write_command = '!DOUT,2,';
|
||||||
allowed = '0,1';
|
allowed = '0,1';
|
||||||
@ -149,6 +177,70 @@ driver hiden_xcs_gen = {
|
|||||||
@ } else {
|
@ } else {
|
||||||
@ sct geterror "Syntax error for read_all_data in: '${data}'"
|
@ 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 = {
|
code write_function write_digital = {
|
||||||
}
|
}
|
||||||
@ -163,9 +255,17 @@ driver hiden_xcs_gen = {
|
|||||||
@ } else {
|
@ } else {
|
||||||
@ set span 500.0
|
@ 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}"
|
@ 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
|
# This code is after database creation
|
||||||
#
|
#
|
||||||
|
Reference in New Issue
Block a user