diff --git a/site_ansto/instrument/config/environment/huber_pilot.sct b/site_ansto/instrument/config/environment/huber_pilot.sct index 56853887..bab1921c 100644 --- a/site_ansto/instrument/config/environment/huber_pilot.sct +++ b/site_ansto/instrument/config/environment/huber_pilot.sct @@ -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] diff --git a/site_ansto/instrument/config/environment/sct_huber_pilot.tcl b/site_ansto/instrument/config/environment/sct_huber_pilot.tcl index 0442a495..8e44d203 100644 --- a/site_ansto/instrument/config/environment/sct_huber_pilot.tcl +++ b/site_ansto/instrument/config/environment/sct_huber_pilot.tcl @@ -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" }