Add some more read-only fields to the huber
This commit is contained in:
@ -12,29 +12,69 @@ driver huber_pilot = {
|
||||
type = float;
|
||||
readable = 1;
|
||||
mutable = true;
|
||||
var sensor = {
|
||||
read_command = '01';
|
||||
permlink = 'T.S01';
|
||||
}
|
||||
var setpoint = {
|
||||
read_command = '00';
|
||||
read_function = rdTemp;
|
||||
writeable = 1;
|
||||
write_command = '00';
|
||||
driveable = Loop1/sensor;
|
||||
lowerlimit = 5.0; upperlimit = 30.0;
|
||||
tolerance = 0.5; property settle_time = 10;
|
||||
driveable = Loop1/sensor_int;
|
||||
lowerlimit = 5.0; upperlimit = 30.0; tolerance = 0.5;
|
||||
property settle_time = 10;
|
||||
permlink = 'T.SP01';
|
||||
}
|
||||
var sensor_int = {
|
||||
read_command = '01';
|
||||
read_function = rdTemp;
|
||||
permlink = 'T.S01';
|
||||
}
|
||||
var vTE = {
|
||||
read_command = '07';
|
||||
read_function = rdTemp;
|
||||
permlink = 'T.S07';
|
||||
}
|
||||
var vTmpMode = {
|
||||
type = int;
|
||||
read_command = '13';
|
||||
read_function = rdStatus;
|
||||
}
|
||||
var vTmpActive = {
|
||||
type = int;
|
||||
read_command = '14';
|
||||
read_function = rdStatus;
|
||||
}
|
||||
var vMinSP = {
|
||||
read_command = '30';
|
||||
read_function = rdTemp;
|
||||
}
|
||||
var vMaxSP = {
|
||||
read_command = '31';
|
||||
read_function = rdTemp;
|
||||
}
|
||||
}
|
||||
|
||||
code getValue = {%%
|
||||
set cmd "\{M${cmd_str}****"
|
||||
%%}
|
||||
|
||||
code rdValue = {%%
|
||||
code rdStatus = {%%
|
||||
if {[string length ${data}] < 8} {
|
||||
sct geterror "rdValue short response ${data}"
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 2] "S0"] } {
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
|
||||
sct geterror "rdValue syntax error ${data}"
|
||||
} else {
|
||||
set resp [scan [string range ${data} 4 end] "%x" val]
|
||||
if { ${resp} < 1 } {
|
||||
sct geterror "rdValue scan error ${data}"
|
||||
} else {
|
||||
set data ${val}
|
||||
}
|
||||
}
|
||||
%%}
|
||||
|
||||
code rdTemp = {%%
|
||||
if {[string length ${data}] < 8} {
|
||||
sct geterror "rdValue short response ${data}"
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
|
||||
sct geterror "rdValue syntax error ${data}"
|
||||
} else {
|
||||
set resp [scan [string range ${data} 4 end] "%x" val]
|
||||
|
@ -164,9 +164,9 @@ proc ::scobj::huber_pilot::noResponse {tc_root} {
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::huber_pilot::rdValue {tc_root} {
|
||||
proc ::scobj::huber_pilot::rdStatus {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "rdValue tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
debug_log ${tc_root} 1 "rdStatus tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
@ -177,10 +177,53 @@ proc ::scobj::huber_pilot::rdValue {tc_root} {
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# rdValue hook code starts
|
||||
# rdStatus hook code starts
|
||||
if {[string length ${data}] < 8} {
|
||||
sct geterror "rdValue short response ${data}"
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 2] "S0"] } {
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
|
||||
sct geterror "rdValue syntax error ${data}"
|
||||
} else {
|
||||
set resp [scan [string range ${data} 4 end] "%x" val]
|
||||
if { ${resp} < 1 } {
|
||||
sct geterror "rdValue scan error ${data}"
|
||||
} else {
|
||||
set data ${val}
|
||||
}
|
||||
}
|
||||
# rdStatus hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::huber_pilot::rdTemp {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "rdTemp tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# rdTemp hook code starts
|
||||
if {[string length ${data}] < 8} {
|
||||
sct geterror "rdValue short response ${data}"
|
||||
} elseif { ![string equal -nocase [string range ${data} 1 1] "S"] } {
|
||||
sct geterror "rdValue syntax error ${data}"
|
||||
} else {
|
||||
set resp [scan [string range ${data} 4 end] "%x" val]
|
||||
@ -196,7 +239,7 @@ proc ::scobj::huber_pilot::rdValue {tc_root} {
|
||||
}
|
||||
}
|
||||
}
|
||||
# rdValue hook code ends
|
||||
# rdTemp hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
@ -260,23 +303,23 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1 plain spy none
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/sensor plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor read ${ns}::getValue ${scobj_hpath} rdValue {01}
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor rdValue ${ns}::rdValue ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor control true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor data true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor permlink data_set "T${permlink_device_number}S01"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor @description "T${permlink_device_number}S01"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor oldval 0.0
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor nxalias "${name}_Loop1_sensor"
|
||||
hfactory ${scobj_hpath}/Loop1/sensor_int plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int read ${ns}::getValue ${scobj_hpath} rdTemp {01}
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int rdTemp ${ns}::rdTemp ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int control true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int data true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int permlink data_set "T${permlink_device_number}S01"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int @description "T${permlink_device_number}S01"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int oldval 0.0
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/sensor_int nxalias "${name}_Loop1_sensor_int"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/setpoint plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint read ${ns}::getValue ${scobj_hpath} rdValue {00}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint rdValue ${ns}::rdValue ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint read ${ns}::getValue ${scobj_hpath} rdTemp {00}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint rdTemp ${ns}::rdTemp ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint write ${ns}::setValue ${scobj_hpath} noResponse {00}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint check ${ns}::checkrange ${scobj_hpath}
|
||||
@ -284,7 +327,7 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint checklimits ${ns}::checklimits ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint checkstatus ${ns}::checkstatus ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint halt ${ns}::halt ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint driveable Loop1/sensor
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint driveable Loop1/sensor_int
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint control true
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint data true
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint mutable true
|
||||
@ -300,11 +343,78 @@ proc ::scobj::huber_pilot::mkDriver { sct_controller name } {
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint type "drivable"
|
||||
hsetprop ${scobj_hpath}/Loop1/setpoint nxalias "${name}_Loop1_setpoint"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/vMaxSP plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP read ${ns}::getValue ${scobj_hpath} rdTemp {31}
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP rdTemp ${ns}::rdTemp ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP control true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP data true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP oldval 0.0
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/vMaxSP nxalias "${name}_Loop1_vMaxSP"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/vMinSP plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP read ${ns}::getValue ${scobj_hpath} rdTemp {30}
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP rdTemp ${ns}::rdTemp ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP control true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP data true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP oldval 0.0
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/vMinSP nxalias "${name}_Loop1_vMinSP"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/vTE plain user float
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE read ${ns}::getValue ${scobj_hpath} rdTemp {07}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE rdTemp ${ns}::rdTemp ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE control true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE data true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE permlink data_set "T${permlink_device_number}S07"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE @description "T${permlink_device_number}S07"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE oldval 0.0
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTE nxalias "${name}_Loop1_vTE"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/vTmpActive plain user int
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive read ${ns}::getValue ${scobj_hpath} rdStatus {14}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive rdStatus ${ns}::rdStatus ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive control true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive data true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive oldval 0
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpActive nxalias "${name}_Loop1_vTmpActive"
|
||||
|
||||
hfactory ${scobj_hpath}/Loop1/vTmpMode plain user int
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode read ${ns}::getValue ${scobj_hpath} rdStatus {13}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode rdStatus ${ns}::rdStatus ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode control true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode data true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode mutable true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode nxsave true
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode oldval 0
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode type "part"
|
||||
hsetprop ${scobj_hpath}/Loop1/vTmpMode nxalias "${name}_Loop1_vTmpMode"
|
||||
|
||||
if {[string equal -nocase [SplitReply [environment_simulation]] "false"]} {
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/sensor 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/sensor_int 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/setpoint 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/vMaxSP 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/vMinSP 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/vTE 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/vTmpActive 1
|
||||
${sct_controller} poll ${scobj_hpath}/Loop1/vTmpMode 1
|
||||
${sct_controller} write ${scobj_hpath}/Loop1/setpoint
|
||||
ansto_makesctdrive ${name}_Loop1_setpoint ${scobj_hpath}/Loop1/setpoint ${scobj_hpath}/Loop1/sensor ${sct_controller}
|
||||
ansto_makesctdrive ${name}_Loop1_setpoint ${scobj_hpath}/Loop1/setpoint ${scobj_hpath}/Loop1/sensor_int ${sct_controller}
|
||||
} else {
|
||||
::scobj::huber_pilot::sics_log 9 "[environment_simulation] => No poll/write for huber_pilot"
|
||||
}
|
||||
|
Reference in New Issue
Block a user