sct_bruker_BEC1.tcl

Arndt's latest updates, this is sct_bruker_BEC1_20100625.tcl
r3135 | ffr | 2011-05-19 08:38:09 +1000 (Thu, 19 May 2011) | 2 lines
This commit is contained in:
Ferdi Franceschini
2011-05-19 08:38:09 +10:00
committed by Douglas Clowes
parent 8514dace59
commit 12b524cfbb

View File

@@ -216,6 +216,9 @@ proc bruker_BEC1_init {sct_controller tc_root} {
proc getValue {tc_root nextState cmd expectedLen} {
set catch_status [ catch {
set ::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd "$cmd"
if [hpropexists [sct] geterror] {
hdelprop [sct] geterror
}
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send $cmd
# puts "sct send !$cmd!"
@@ -299,7 +302,7 @@ proc getValue {tc_root nextState cmd expectedLen} {
# Beware that Bruker uses reverse notation.
set data [ExtractValue $orgdata $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd]
#puts "rdValue: Interpreting status byte information: $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd"
#pwrCtrl EthernetAddrHex 1 0 1 0 text spy {ETH/} {rdValue} {} {setValue} {}\
#pwrCtrl EthernetAddrHex 1 0 1 0 text spy {ETH/} {rdValue} {} {setValue} {}
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/EthernetAddrDec "UNKNOWN"
}
}
@@ -446,14 +449,19 @@ proc setDesiredField {tc_root nextState cmd} {
set ns ::scobj::lh45
set par [sct target]
#hset $tc_root/status "busy"
set wrStatus [sct writestatus]
if {$wrStatus == "start"} {
# Called by drive adapter
# puts "setDesiredField(): driving set to 1"
set nodename $tc_root/sensor/setpoint
hsetprop $nodename driving 1
}
#puts "setDesiredField(wrStatus=$wrStatus): sct send $cmd$par"
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send "$cmd$par"
return $nextState
} message ]
if {$catch_status == 1} {
# TCL_ERROR
sct driving 0
}
handle_exception $catch_status $message "in setDesiredField(). Last write command: $::scobj::bruker_BEC1::bruker_BEC1_lastWriteCmd"
}
@@ -470,14 +478,19 @@ proc setDesiredCurrent {tc_root nextState cmd} {
set ns ::scobj::lh45
set par [sct target]
#hset $tc_root/status "busy"
set wrStatus [sct writestatus]
if {$wrStatus == "start"} {
# Called by drive adapter
# puts "setDesiredCurrent(): driving set to 1"
set nodename $tc_root/sensor/nominal_outp_current
hsetprop $nodename driving 1
}
#puts "setDesiredCurrent(wrStatus=$wrStatus): sct send $cmd$par"
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send "$cmd$par"
return $nextState
} message ]
if {$catch_status == 1} {
# TCL_ERROR
sct driving 0
}
handle_exception $catch_status $message "in setDesiredCurrent(). Last write command: $::scobj::bruker_BEC1::bruker_BEC1_lastWriteCmd"
}
@@ -562,7 +575,7 @@ proc ExtractValue {response lastQueryCmd} {
# update the node last_error_msg
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/last_error_msg $::scobj::bruker_BEC1::bruker_BEC1_errMsg
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/last_error_msg2 $::scobj::bruker_BEC1::bruker_BEC1_errMsg2
#if { 0 != [string compare -length 4 $lastQueryCmd "POL/"] \
#if { 0 != [string compare -length 4 $lastQueryCmd "POL/"]
# || $::scobj::bruker_BEC1::bruker_BEC1_polarityUnitAbsent == false} {
#}
}
@@ -707,9 +720,9 @@ proc analyseStatusByte {statusByteString} {
if { 0 != [string compare -length 2 $tmp_LSB_ErrByte "00"]} {
# Error byte, LSB
# Value, hex, Explanation
set errList {\
08 {External Security}\
04 {Temperature transformer, rectifier or PWM}\
set errList {
08 {External Security}
04 {Temperature transformer, rectifier or PWM}
02 {Line Phase missing}
01 {Cooling water failure}
}
@@ -718,8 +731,8 @@ proc analyseStatusByte {statusByteString} {
if { 0 != [string compare -length 2 $tmp_MSB_ErrByte "00"]} {
# status byte hex Value, Explanation
set errList {\
08 {Inrush procedure error}\
set errList {
08 {Inrush procedure error}
01 {Current limit exceeded}
}
set MSB_ErrByteTxt [decodeErrByte $tmp_MSB_ErrByte $errList]
@@ -727,13 +740,13 @@ proc analyseStatusByte {statusByteString} {
if { 0 != [string compare -length 2 $tmp_PwrSupplyStatusByte "00"]} {
# status byte hex Value, Explanation
set errList {\
80 {Remote enabled}\
40 {DC power on}\
20 {Normal polarity}\
10 {Reverse polarity}\
04 {External reference enabled}\
02 {Field regulation enabled}\
set errList {
80 {Remote enabled}
40 {DC power on}
20 {Normal polarity}
10 {Reverse polarity}
04 {External reference enabled}
02 {Field regulation enabled}
01 {Internal reference set}
}
set PwrSupplyStatusByteTxt [decodeErrByte $tmp_PwrSupplyStatusByte $errList]
@@ -741,28 +754,28 @@ proc analyseStatusByte {statusByteString} {
if { 0 != [string compare -length 2 $tmp_StateMachineStatusByte "00"]} {
# status byte hex Value; State
set errList {\
1C {Return to neutral state}\
1B {Control DC interlock}\
1A {Wait time}\
19 {Set time 1 second}\
18 {Set Inrush OFF}\
17 {Wait time}\
16 {Set time 1 second}\
15 {Set DC ON}\
14 {Wait time}\
13 {Set time 1 second}\
12 {Set Inrush ON}\
11 {Test ADC:0}\
10 {Set DAC to 0}\
0F {Set reference to intern}\
0C {Return to neutral state}\
0B {Wait time}\
0A {Set 2 seconds}\
09 {Set reference to intern}\
08 {Set DC off}\
07 {Test ADC:0}\
06 {Test DAC:0}\
set errList {
1C {Return to neutral state}
1B {Control DC interlock}
1A {Wait time}
19 {Set time 1 second}
18 {Set Inrush OFF}
17 {Wait time}
16 {Set time 1 second}
15 {Set DC ON}
14 {Wait time}
13 {Set time 1 second}
12 {Set Inrush ON}
11 {Test ADC:0}
10 {Set DAC to 0}
0F {Set reference to intern}
0C {Return to neutral state}
0B {Wait time}
0A {Set 2 seconds}
09 {Set reference to intern}
08 {Set DC off}
07 {Test ADC:0}
06 {Test DAC:0}
05 {Ramp DAC to 0}
}
#00 {Neutral state}
@@ -946,7 +959,7 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h3 {«POL:1» Set negative polarity}
set helptext $h1$CRLF$h2$CRLF$h3
}
"actual_dac_field*" {
"desired_field*" {
set h1 {FLD «nn.nn» Query/Set magnetic field strength }
set h2 {«nn.nn» magnetic field strength in Teslas (setpoint)}
set helptext $h1$CRLF$h2
@@ -1074,9 +1087,7 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
# @param allowedValues allowed values for the node data - does not permit other
# @param klasse Nexus class name (?)
# @return OK
proc createNode {scobj_hpath sct_controller cmdGroup varName readable writable\
pollEnabled drivable replyLen dataType permission rdCmd rdFunc wrCmd\
wrFunc allowedValues klasse} {
proc createNode {scobj_hpath sct_controller cmdGroup varName readable writable pollEnabled drivable replyLen dataType permission rdCmd rdFunc wrCmd wrFunc allowedValues klasse} {
#puts "createing node for: $scobj_hpath $cmdGroup $varName $readable $writable $pollEnabled $drivable $dataType $permission $rdCmd $rdFunc $wrCmd $wrFunc"
set catch_status [ catch {
set ns ::scobj::bruker_BEC1
@@ -1171,25 +1182,25 @@ proc mk_sct_bruker_BEC1 {sct_controller klasse tempobj tol} {
# wrCmd actual device write command to be sent to the device
# wrFunc Function to be called to send the wrCmd to the device, typically setValue()
# allowedValues allowed values for the node data - does not permit other
set deviceCommandToplevel {\
sensor measured_field 1 0 1 0 13 float spy {CHF/} {rdValue} {} {setValue} {}\
sensor actual_dac_field 1 1 1 0 16 float user {FLD/} {rdValue} {FLD=} {setValue} {}\
sensor desired_current 1 1 1 1 15 float user {CUR/} {rdValue} {CUR=} {setDesiredCurrent} {}\
sensor nominal_outp_current 1 0 1 0 13 float spy {CHN/} {rdValue} {} {setDesiredCurrent} {}\
set deviceCommandToplevel {
sensor desired_field 1 1 1 0 16 float user {FLD/} {rdValue} {FLD=} {setValue} {}
sensor measured_field 1 0 1 0 13 float spy {CHF/} {rdValue} {} {setValue} {}
sensor desired_current 1 1 1 1 15 float user {CUR/} {rdValue} {CUR=} {setDesiredCurrent} {}
sensor nominal_outp_current 1 0 1 0 13 float spy {CHN/} {rdValue} {} {setDesiredCurrent} {}
}
set deviceCommand {\
pwrctrl dc_power 1 1 1 0 7 int user {DCP/} {inTolerance} {DCP=} {setValue} {0,1}\
pwrctrl pwr_ctrl_from 1 1 1 0 7 int user {EXT/} {rdValue} {EXT=} {setValue} {0,1,2}\
pwrctrl local_remote_state 1 1 1 0 7 int user {REM/} {rdValue} {REM=} {setValue} {0,1}\
pwrctrl output_voltage 1 0 1 0 12 float spy {CHV/} {rdValue} {} {setValue} {}\
pwrctrl reset_error_msg 0 1 0 0 7 int user {} {rdValue} {RST=} {setValue} {0}\
pwrctrl statusByte 1 1 1 0 13 text user {STA/} {rdValue} {STA=} {setValue} {0}\
set deviceCommand {
pwrctrl dc_power 1 1 1 0 7 int user {DCP/} {inTolerance} {DCP=} {setValue} {0,1}
pwrctrl pwr_ctrl_from 1 1 1 0 7 int user {EXT/} {rdValue} {EXT=} {setValue} {0,1,2}
pwrctrl local_remote_state 1 1 1 0 7 int user {REM/} {rdValue} {REM=} {setValue} {0,1}
pwrctrl output_voltage 1 0 1 0 12 float spy {CHV/} {rdValue} {} {setValue} {}
pwrctrl reset_error_msg 0 1 0 0 7 int user {} {rdValue} {RST=} {setValue} {0}
pwrctrl statusByte 1 1 1 0 13 text user {STA/} {rdValue} {STA=} {setValue} {0}
}
# it seems these functions are not supported by our device
#pwrCtrl EthernetAddrHex 1 0 1 0 text spy {ETH/} {rdValue} {} {setValue} {}\
#pwrCtrl LoadResistance 1 0 1 0 float spy {RES/} {rdValue} {} {setValue} {}\
#pwrCtrl QueryPolarity 1 0 1 0 int spy {POL/} {rdValue} {} {setValue} {}\
#pwrCtrl SetPolarity 0 1 0 0 int user {} {rdValue} {POL=} {setValue} {0,1}\
#pwrCtrl EthernetAddrHex 1 0 1 0 text spy {ETH/} {rdValue} {} {setValue} {}
#pwrCtrl LoadResistance 1 0 1 0 float spy {RES/} {rdValue} {} {setValue} {}
#pwrCtrl QueryPolarity 1 0 1 0 int spy {POL/} {rdValue} {} {setValue} {}
#pwrCtrl SetPolarity 0 1 0 0 int user {} {rdValue} {POL=} {setValue} {0,1}
hfactory $scobj_hpath/sensor plain spy none
foreach {cmdGroup varName readable writable pollEnabled drivable replyLen dataType permission rdCmd rdFunc wrCmd wrFunc allowedValues} $deviceCommandToplevel {
@@ -1277,13 +1288,13 @@ proc mk_sct_bruker_BEC1 {sct_controller klasse tempobj tol} {
set nxProperties "
$scobj_hpath sensor NXsensor spy
$scobj_hpath sensor/measured_field sensor user
$scobj_hpath sensor/actual_dac_field sensor user
$scobj_hpath sensor/desired_field sensor user
$scobj_hpath sensor/desired_current sensor user
$scobj_hpath sensor/nominal_outp_current sensor user
"
set aliasProperties "
$scobj_hpath measured_field sensor _sensor_MeasuredField
$scobj_hpath actual_dac_field sensor _sensor_ActualDAC_Field
$scobj_hpath desired_field sensor _sensor_ActualDAC_Field
$scobj_hpath desired_current sensor _sensor_DesiredCurrent
$scobj_hpath nominal_outp_current sensor _sensor_NominalOutpCurrent
"
@@ -1307,14 +1318,16 @@ proc mk_sct_bruker_BEC1 {sct_controller klasse tempobj tol} {
# for generating the GumTree interface and saving data for script context objects (hdf file)
# @param scobj, name of script context object (path to a node)
# @param par, optional parameter (name of the node variable)
::scobj::hinitprops $tempobj/sensor nominal_outp_current
# Changed ffr 20100625: do not call hinitprops to avoid a conflict with a change in SICServer vers. 2_5
#::scobj::hinitprops $tempobj/sensor nominal_outp_current
hsetprop $scobj_hpath/pwrctrl/statusByte control false
ansto_makesctdrive ${tempobj}_driveable $scobj_hpath/sensor/desired_current $scobj_hpath/sensor/nominal_outp_current $sct_controller
# initialise the device
bruker_BEC1_init $sct_controller $scobj_hpath
puts "Bruker BEC1 power supply for 1-Tesla magnet ready at /sample/$tempobj (Driver 2010-04-07)"
puts "Bruker BEC1 power supply for 1-Tesla magnet ready at /sample/$tempobj (Driver 2010-06-25)"
} message ]
handle_exception $catch_status $message "In subroutine mk_sct_bruker_BEC1()."
}