Merged in-situ modifications for Release 2.5 candidate 5

r2895 | ffr | 2010-04-29 16:02:15 +1000 (Thu, 29 Apr 2010) | 2 lines
This commit is contained in:
Ferdi Franceschini
2010-04-29 16:02:15 +10:00
committed by Douglas Clowes
parent a2ca46ab67
commit e6e3c3be52
24 changed files with 478 additions and 363 deletions

View File

@@ -3,6 +3,8 @@
# MakeSICSObj $obj SCT_<class>
# The MakeSICSObj cmd adds a /sics/$obj node. NOTE the /sics node is not browsable.
#include <tcl.h>
##
# /*--------------------------------------------------------------------------
# B R U K E R B - E C 1 D R I V E R
@@ -19,6 +21,11 @@
# ----------------------------------------------------------------------------*/
# Notes
# Uses the astvelsel protocol handler (from ./site_ansto/hardsup/sct_velselprot.c)
# instead of the standard script context handler. This is necessary because replies
# from the device have no terminator while queries to the device need a line terminator
# (CR 0x0D). am2010-04-07
#
# Hdb nodes which report data readings should have a "get" script attached to the
# "read" property of the node. This ensures that we can update the reading on demand
# which is necessary for logging data.
@@ -35,7 +42,7 @@
# Bugs, limitations, changes:
# - checks whether the reply from the device matches the query - if not, it discards the reply.
# - added LSB_Err byte 1 interpretation (water failure). Added help notes
# - added lsb_err byte 1 interpretation (water failure). Added help notes
# for the user for the status byte text nodes.
# - MAJOR PROBLEM: Although the driver seems to be doing just about everything
# right, the BEC1 device shuts itself off (changes to DCpower=0) and goes
@@ -56,7 +63,8 @@
# - proc drivestatus now sets a retval variable that is returned. Default
# action for drivable when paused is lazy instead of pause to avoid
# stopping the histogram server.
# - source code syntax checked with nagelfar - removed a couple of potential
# problems, 20100121
##
# @brief Handle exceptions caught by a 'catch' command.
# Note: You must use 'error' not 'return -code error' to
@@ -104,7 +112,8 @@ namespace eval ::scobj::bruker_BEC1 {
# if necessary. If commands come in too fast, the DCpower may switch itself off.
set bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS 50
# set a start value for the time of the last command send to or read from the device
set bruker_BEC1_timeLastCommand [clock clicks -milliseconds]
#set bruker_BEC1_timeLastCommand 0
#set bruker_BEC1_timeLastCommand [clock clicks -milliseconds]
# Some global variables that are useful as default initilisation values or for tracking
# Name of the scriptcontext object created from calling this driver - an instrument may use more than one
@@ -203,19 +212,13 @@ proc bruker_BEC1_init {sct_controller tc_root} {
# @param idx indicates which control loop or which input channel
# the command belongs to
# @return nextState The next function to call after this one (typically 'rdValue')
proc getValue {tc_root nextState cmd expectedLen} {
set catch_status [ catch {
set ::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd "$cmd"
set tNow [clock clicks -milliseconds]
#set diff1 [expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand]
while {[expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand] < $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS} {
set tNow [clock clicks -milliseconds]
}
#set diff2 [expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand]
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send $cmd
# puts "sct send !$cmd!"
set ::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand $tNow
#puts "diff1:$diff1, diff2:$diff2 $cmd"
return $nextState
} message ]
handle_exception $catch_status $message "in getValue(). Last query command: $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd"
@@ -239,7 +242,7 @@ proc getValue {tc_root nextState cmd expectedLen} {
# Discard if it is not the reply to our query
return idle
}
set catch_status [ catch {
set catch_status [ catch {
# Continue as normal
switch -glob -- $data {
"ASCERR:*" {
@@ -297,7 +300,7 @@ proc getValue {tc_root nextState cmd expectedLen} {
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} {}\
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrCtrl/EthernetAddrDec "UNKNOWN"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/EthernetAddrDec "UNKNOWN"
}
}
}
@@ -306,7 +309,7 @@ proc getValue {tc_root nextState cmd expectedLen} {
return idle
} message ]
handle_exception $catch_status $message "in rdValue(). Last query command: $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd"
}
}
@@ -314,7 +317,7 @@ proc getValue {tc_root nextState cmd expectedLen} {
##
# @brief Does what rdValue() does plus it checks if the current is in tolerance.
# inTolerance is the default nextState after getValue() for read node pwrCtrl/DC_power.
# inTolerance is the default nextState after getValue() for read node pwrctrl/dc_power.
# If the device is switched off, current is reported to be in tolerance so that
# slow return to ambient conditions can be carried out
# @return idle Always returns system state idle - command sequence completed.
@@ -328,8 +331,8 @@ proc inTolerance {expectedLength} {
return idle
}
set catch_status [ catch {
set oldval [sct oldval]
# puts "inTolerance(): data=$data oldval=$oldval"
set oldvalue [sct oldval]
# puts "inTolerance(): data=$data oldval=$oldvalue"
switch -glob -- $data {
"ASCERR:*" {
puts "ASCERR in inTolerance: Last query command: $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd"
@@ -345,8 +348,8 @@ proc inTolerance {expectedLength} {
return idle
}
set data [ExtractValue $data $::scobj::bruker_BEC1::bruker_BEC1_lastQueryCmd]
if {$data != $oldval} {
if {$oldval == "UNKNOWN"} {
if {$data != $oldvalue} {
if {$oldvalue == "UNKNOWN"} {
sct utime timecheck
}
sct oldval $data
@@ -360,27 +363,27 @@ proc inTolerance {expectedLength} {
# is within tolerance of the corresponding setpoint
if {$data == 0 } {
# DC power switched off
hset $tc_root/emon/monMode "idle"
hset $tc_root/emon/isInTolerance "inTolerance"
hset $tc_root/emon/mon_mode "idle"
hset $tc_root/emon/is_in_tolerance "inTolerance"
hset $tc_root/status "idle"
} else {
set intol [checktol $tc_root]
if {$intol==0} { sct utime timecheck }
set nodename $tc_root/sensor/NominalOutpCurrent
set nodename $tc_root/sensor/nominal_outp_current
set setpt [hval $nodename]
set nodename $tc_root/sensor/DesiredCurrent
set NominalOutpCurrent [hval $nodename]
set nodename $tc_root/sensor/desired_current
set nominal_outp_current [hval $nodename]
# puts "inTolerance(): comparing sensor/setpoint=$setpt with actual sensorValue=$temp"
set diff [expr abs($setpt - $NominalOutpCurrent)]
set diff [expr {abs($setpt - $NominalOutpCurrent)}]
if {$diff > $::scobj::bruker_BEC1::bruker_BEC1_driveTolerance} {
# ERROR: node /sics/ma1/emon/monMode not found. Last query command: DCP/
set nodename $tc_root/emon/monMode
# ERROR: node /sics/ma1/emon/mon_mode not found. Last query command: DCP/
set nodename $tc_root/emon/mon_mode
hset $nodename "drive"
hset $tc_root/status "busy"
} else {
set nodename $tc_root/sensor/NominalOutpCurrent
set nodename $tc_root/sensor/nominal_outp_current
hsetprop $nodename driving 0
set nodename $tc_root/emon/monMode
set nodename $tc_root/emon/mon_mode
hset $nodename "monitor"
hset $tc_root/status "idle"
}
@@ -407,18 +410,14 @@ proc setValue {tc_root nextState cmd } {
set catch_status [ catch {
set par [sct target]
set ::scobj::bruker_BEC1::bruker_BEC1_lastWriteCmd "$cmd$par"
set tNow [clock clicks -milliseconds]
while {[expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand] < $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS} {
set tNow [clock clicks -milliseconds]
}
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send "$cmd$par"
set ::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand $tNow
if { 0 == [string compare -length 4 $cmd "RST=0"] } {
# Reset error messages - also update the node displaying the last error
set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "none"
set ::scobj::bruker_BEC1::bruker_BEC1_errMsg2 "none"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/lastErrorMsg $::scobj::bruker_BEC1::bruker_BEC1_errMsg
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/lastErrorMsg2 $::scobj::bruker_BEC1::bruker_BEC1_errMsg2
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
}
return $nextState
} message ]
@@ -456,11 +455,7 @@ proc setDesiredField {tc_root nextState cmd} {
hsetprop $nodename driving 1
}
#puts "setDesiredField(wrStatus=$wrStatus): sct send $cmd$par"
set tNow [clock clicks -milliseconds]
#set diff1 [expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand]
while {[expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand] < $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS} {
set tNow [clock clicks -milliseconds]
}
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send "$cmd$par"
return $nextState
} message ]
@@ -485,17 +480,12 @@ proc setDesiredCurrent {tc_root nextState cmd} {
if {$wrStatus == "start"} {
# Called by drive adapter
# puts "setDesiredCurrent(): driving set to 1"
set nodename $tc_root/sensor/NominalOutpCurrent
set nodename $tc_root/sensor/nominal_outp_current
hsetprop $nodename driving 1
}
#puts "setDesiredCurrent(wrStatus=$wrStatus): sct send $cmd$par"
set tNow [clock clicks -milliseconds]
#set diff1 [expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand]
while {[expr $tNow - $::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand] < $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS} {
set tNow [clock clicks -milliseconds]
}
after $::scobj::bruker_BEC1::bruker_BEC1_MIN_TIME_BETWEEN_COMMANDS
sct send "$cmd$par"
set ::scobj::bruker_BEC1::bruker_BEC1_timeLastCommand $tNow
return $nextState
} message ]
handle_exception $catch_status $message "in setDesiredCurrent(). Last write command: $::scobj::bruker_BEC1::bruker_BEC1_lastWriteCmd"
@@ -512,7 +502,7 @@ proc setDesiredCurrent {tc_root nextState cmd} {
proc drivestatus {tc_root} {
# broadcast "DEBUG: in drivestatus. Last write command: $::scobj::bruker_BEC1::bruker_BEC1_lastWriteCmd"
set catch_status [ catch {
if [sct driving] {
if {[sct driving]} {
set retval busy
} else {
set retval idle
@@ -529,8 +519,8 @@ proc drivestatus {tc_root} {
# @return idle Indicates that the device is ready for the next command
proc halt {tc_root} {
# stop driving at current field strength or current
set sensorValue $tc_root/sensor/DesiredCurrent
set nodename $tc_root/sensor/NominalOutpCurrent
set sensorValue $tc_root/sensor/desired_current
set nodename $tc_root/sensor/nominal_outp_current
hset $nodename [hval $sensorValue]
hsetprop $nodename driving 0
return idle
@@ -571,7 +561,7 @@ proc ExtractValue {response lastQueryCmd} {
"E01*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "FUNCTION ERROR - Function not supported, $response"}
"E02*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "ARGUMENT ERROR - command argument contains unexpected characters, $response"}
"E03*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "PORT NOT AVAILABLE, $response"}
"E04*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "LOCAL ERROR - access denied, check LocalRemoteState setting, $response"}
"E04*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "LOCAL ERROR - access denied, check local_remote_state setting, $response"}
"E05*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "RANGE ERROR - the arguments are out of the allowed range, $response"}
"E06*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "MODE ERROR - access denied, external reference active, $response"}
"E07*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "ERROR PENDING, $response"}
@@ -579,9 +569,9 @@ proc ExtractValue {response lastQueryCmd} {
"E99*" {set ::scobj::bruker_BEC1::bruker_BEC1_errMsg "NO TCP/IP COMMUNICATION, $response"}
}
set extractedValue $::scobj::bruker_BEC1::bruker_BEC1_errValue
# update the node lastErrorMsg
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/lastErrorMsg $::scobj::bruker_BEC1::bruker_BEC1_errMsg
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/emon/lastErrorMsg2 $::scobj::bruker_BEC1::bruker_BEC1_errMsg2
# 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/"] \
# || $::scobj::bruker_BEC1::bruker_BEC1_polarityUnitAbsent == false} {
#}
@@ -662,11 +652,14 @@ proc decodeErrByte {errByte errList} {
#puts "decodeErrByte: errByte:$errByte"
set catch_status [ catch {
# convert to decimal for calculations
set decErrByte [expr 0x$errByte]
set hexvar "0x$errByte"
set decErrByte [expr {$hexvar}]
# puts "errByte=$errByte, hexvar=$hexvar, decErrByte=$decErrByte"
foreach {hexVal errText} $errList {
#puts "errByte:$errByte hexVal:$hexVal errText:$errText"
# convert to decimal for calculations
set decVal [expr 0x$hexVal]
set hexvar "0x$hexVal"
set decVal [expr { $hexvar }]
#puts "decErrByte:$decErrByte decVal:$decVal errText:$errText"
if { $decErrByte >= $decVal } {
if {[string length $errorText] > 1} {
@@ -674,11 +667,11 @@ proc decodeErrByte {errByte errList} {
} else {
set errorText $errText
}
set decErrByte [expr $decErrByte - $decVal]
set decErrByte [expr {$decErrByte - $decVal}]
}
}
if {2 > [string length $errText]} {
set $errorText "Unknown error"
set errorText "Unknown error"
}
return $errorText
} message ]
@@ -696,10 +689,10 @@ proc extractStatusByte {statusByteString whichByte} {
set catch_status [ catch {
set statusByte "UNKNOWN"
set statusByteStringLength [string length $statusByteString]
set offset [expr $whichByte*2]
set offset [expr {$whichByte*2}]
# allow for an initial offset of 4 char for 'STA/'
incr offset 4
set statusByte [string range $statusByteString $offset [expr $offset+1]]
set statusByte [string range $statusByteString $offset [expr {$offset+1}]]
#puts "ExtractValue(): response:$response, extractedValue:$extractedValue"
return $statusByte
} message ]
@@ -787,13 +780,13 @@ proc analyseStatusByte {statusByteString} {
}
#puts "LSB_ErrByte :x$tmp_LSB_ErrByte: $LSB_ErrByteTxt"
#puts "MSB_ErrByte :x$tmp_MSB_ErrByte: $MSB_ErrByteTxt"
#puts "PwrSupplyStatus:x$tmp_PwrSupplyStatusByte: $PwrSupplyStatusByteTxt"
#puts "pwr_supply_status:x$tmp_PwrSupplyStatusByte: $PwrSupplyStatusByteTxt"
#puts "StateMachine :x$tmp_StateMachineStatusByte: $StateMachineStatusTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrCtrl/LSB_Err "x$tmp_LSB_ErrByte: $LSB_ErrByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrCtrl/MSB_Err "x$tmp_MSB_ErrByte: $MSB_ErrByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrCtrl/PwrSupplyStatus "x$tmp_PwrSupplyStatusByte: $PwrSupplyStatusByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrCtrl/StateMachineStatus "x$tmp_StateMachineStatusByte: $StateMachineStatusByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/lsb_err "x$tmp_LSB_ErrByte: $LSB_ErrByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/msb_err "x$tmp_MSB_ErrByte: $MSB_ErrByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/pwr_supply_status "x$tmp_PwrSupplyStatusByte: $PwrSupplyStatusByteTxt"
hset $::scobj::bruker_BEC1::bruker_BEC1_path2nodes/pwrctrl/state_machine_status "x$tmp_StateMachineStatusByte: $StateMachineStatusByteTxt"
return "Ok"
} message ]
handle_exception $catch_status $message "in analyseStatusByte(). statusByteString: $statusByteString"
@@ -829,7 +822,7 @@ proc getValFromString {s element separator} {
# startIdx points to the first non-blank character of the value we are interested in
set returnval ""
if {$startIdx < 0} {
return returnval
return $returnval
}
set endIdx [string first $separator $s $startIdx]
incr endIdx -1
@@ -843,7 +836,7 @@ proc getValFromString {s element separator} {
}
#puts "getValFromString $s, $element, $separator,\n returns: $returnval"
return $returnval
}
}
@@ -854,18 +847,18 @@ proc getValFromString {s element separator} {
proc checktol {tc_root} {
set catch_status [ catch {
set retVal 0
set sensorValue $tc_root/sensor/DesiredCurrent
set NominalOutpCurrent [hval $sensorValue]
set isetp $tc_root/sensor/NominalOutpCurrent
set sensorValue $tc_root/sensor/desired_current
set nominal_outp_current [hval $sensorValue]
set isetp $tc_root/sensor/nominal_outp_current
set setpt [hval $isetp]
set tol [hval $tc_root/emon/tolerance]
set loField [expr $setpt - $tol]
set hiField [expr $setpt + $tol]
set loField [expr {$setpt - $tol}]
set hiField [expr {$setpt + $tol}]
if { $NominalOutpCurrent < $loField || $NominalOutpCurrent > $hiField} {
hset $tc_root/emon/isInTolerance "outsideTolerance"
hset $tc_root/emon/is_in_tolerance "outsideTolerance"
set retVal 0
} else {
hset $tc_root/emon/isInTolerance "inTolerance"
hset $tc_root/emon/is_in_tolerance "inTolerance"
set retVal 1
}
return $retVal
@@ -926,23 +919,23 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set helptext "No help available"
#puts "helpNotes4user $scobj_hpath/$cmdGroup varName"
switch -glob $varName {
"LocalRemoteState*" {
"local_remote_state*" {
set h1 {REM: «n» Query or Set local/remote state.}
set h2 {«n» 0:local (local and remote comands allowed).}
set h3 {«n» 1:remote state (only remote commands allowed).}
set helptext $h1$CRLF$h2$CRLF$h3
}
"DC_power*" {
"dc_power*" {
set h1 {DCP «off/on» DC power }
set h2 { 0:off, 1:on}
set helptext $h1$CRLF$h2
}
"DesiredCurrent*" {
"desired_current*" {
set h1 {CUR «nn.nn» Read and set DAC current}
set h2 {«nn.nn» DAC current in Amperes}
set helptext $h1$CRLF$h2
}
"PwrCtrlFrom*" {
"pwr_ctrl_from*" {
set h1 {EXT: «n» Query / Set source of reference for power supply control}
set h2 {«EXT:0» internal reference, DAC}
set h3 {«EXT:1» external reference voltage}
@@ -963,17 +956,17 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h3 {«POL:1» Set negative polarity}
set helptext $h1$CRLF$h2$CRLF$h3
}
"ActualDAC_Field*" {
"actual_dac_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
}
"NominalOutpCurrent*" {
"nominal_outp_current*" {
set h1 {CHN «nn.nn» Query nominal output current.}
set h2 {«nn.nn» Nominal output current in Amperes}
set helptext $h1$CRLF$h2
}
"OutputVoltage*" {
"output_voltage*" {
set h1 {CHV «nn.nn» Query output voltage.}
set h2 { «nn.nn» Output voltage in Volts.}
set helptext $h1$CRLF$h2
@@ -983,13 +976,13 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h2 {Returned: Load resistance in Ohms.}
set helptext $h1$CRLF$h2
}
"MeasuredField*" {
"measured_field*" {
set h1 {CHF/ Query measured magnetic field. }
set h2 {Returned: Measured magnetic field in Teslas.}
set h3 {}
set helptext $h1$CRLF$h2$CRLF$h3
}
"ResetErrorMsg*" {
"reset_error_msg*" {
set h1 {RST: «0» Reset error messages. }
set h2 { «0» Send zero to reset error messages.}
set helptext $h1$CRLF$h2
@@ -999,25 +992,25 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h2 {Returned: status byte in hexadecimal format. Note: DC power must be ON}
set helptext $h1$CRLF$h2
}
"LSB_Err*" {
"lsb_err*" {
set h1 {Interpretation of the first 2 hexadecimal characters of the StatusByte string.}
set h2 {LSB (lower status byte) contains interlock status conditions}
set h3 {such as water or partial power failure.}
set helptext $h1$CRLF$h2$CRLF$h3
}
"MSB_Err*" {
"msb_err*" {
set h1 {Interpretation of the hexadecimal characters 3 and 4 of the StatusByte string.}
set h2 {MSB (machine status byte) contains interlock status conditions}
set h3 {such as an overcurrent condition.}
set helptext $h1$CRLF$h2$CRLF$h3
}
"PwrSupplyStatus*" {
"pwr_supply_status*" {
set h1 {Interpretation of the hexadecimal characters 5 and 6 of the StatusByte string.}
set h2 {Contains information about the power supply status}
set h3 {such as DC power on or off.}
set helptext $h1$CRLF$h2$CRLF$h3
}
"StateMachineStatus*" {
"state_machine_status*" {
set h1 {Interpretation of the hexadecimal characters 7 and 8 of the StatusByte string.}
set h2 {Contains information about the power supply State Machines}
set h3 {such as the Inrush or Test DAC states.}
@@ -1031,7 +1024,7 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h2 {Returned: ethernet address in hexadecimal numbers.}
set helptext $h1$CRLF$h2
}
"isInTolerance*" {
"is_in_tolerance*" {
set h1 {A flag that indicates whether the actual magnetic field strength is within tolerance}
set h2 {of the setpoint field strength.}
set helptext $h1$CRLF$h2
@@ -1045,7 +1038,7 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h1 {Tolerance specifies the magnetic field strength tolerance in Tesla applicable to the setpoint.}
set helptext $h1
}
"monMode*" {
"mon_mode*" {
set h1 {A flag that indicates whether the magnet's current is being actively changed to}
set h2 {drive the magnetic field towards the setpoint or whether the current is stable}
set h3 {with the magnetic field in tolerance with the setpoint.}
@@ -1056,8 +1049,8 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
set h2 {The default action is always 'pause'.}
set helptext $h1$CRLF$h2
}
"lastErrorMsg*" {
set helptext {lastErrorMsg and lastErrorMsg2 display the last 2 error messages received from the device.}
"last_error_msg*" {
set helptext {last_error_msg and last_error_msg2 display the last 2 error messages received from the device.}
}
default {
set helptext {Sorry mate. No help available.}
@@ -1089,11 +1082,11 @@ proc helpNotes4user {scobj_hpath cmdGroup varName} {
# @param wrCmd actual device write command to be sent to the device
# @param wrFunc Function to be called to send the wrCmd to the device, typically setValue()
# @param allowedValues allowed values for the node data - does not permit other
# @param klass Nexus class name (?)
# @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 klass} {
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
@@ -1145,11 +1138,11 @@ proc createNode {scobj_hpath sct_controller cmdGroup varName readable writable\
##
# @brief mk_sct_bruker_BEC1() creates a scriptcontext object for a Bruker BEC1 power supply (for 1T magnet)
# @param sct_controller name of the bruker_BEC1 scriptcontext object (typically sct_bruker_BEC1_tc1 or tc2)
# @param klass Nexus class name (?), typically 'environment'
# @param klasse Nexus class name (?), typically 'environment'
# @param tempobj short name for the magnet power supply scriptcontext object (typ. ma1 or ma2)
# @param tol magentic field strength tolerance in Tesla (typ. 1)
# @return nothing (well, the sct object)
proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
proc mk_sct_bruker_BEC1 {sct_controller klasse tempobj tol} {
set catch_status [ catch {
set ns ::scobj::bruker_BEC1
set ::scobj::bruker_BEC1::bruker_BEC1_sct_obj_name $tempobj
@@ -1159,10 +1152,10 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
#set LF "\n"
set ::scobj::bruker_BEC1::bruker_BEC1_tolerance $tol
set ::scobj::bruker_BEC1::bruker_BEC1_driveTolerance [expr $tol * $::scobj::bruker_BEC1::bruker_BEC1_tolerance]
set ::scobj::bruker_BEC1::bruker_BEC1_driveTolerance [expr {$tol * $::scobj::bruker_BEC1::bruker_BEC1_tolerance}]
MakeSICSObj $tempobj SCT_OBJECT
sicslist setatt $tempobj klass $klass
sicslist setatt $tempobj klass $klasse
sicslist setatt $tempobj long_name $tempobj
# Create a base node for all the state machines of this sics object
set scobj_hpath /sics/$tempobj
@@ -1189,18 +1182,18 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
# 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 MeasuredField 1 0 1 0 13 float spy {CHF/} {rdValue} {} {setValue} {}\
sensor ActualDAC_Field 1 1 1 0 16 float user {FLD/} {rdValue} {FLD=} {setValue} {}\
sensor DesiredCurrent 1 1 1 1 15 float user {CUR/} {rdValue} {CUR=} {setDesiredCurrent} {}\
sensor NominalOutpCurrent 1 0 1 0 13 float spy {CHN/} {rdValue} {} {setDesiredCurrent} {}\
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 deviceCommand {\
pwrCtrl DC_power 1 1 1 0 7 int user {DCP/} {inTolerance} {DCP=} {setValue} {0,1}\
pwrCtrl PwrCtrlFrom 1 1 1 0 7 int user {EXT/} {rdValue} {EXT=} {setValue} {0,1,2}\
pwrCtrl LocalRemoteState 1 1 1 0 7 int user {REM/} {rdValue} {REM=} {setValue} {0,1}\
pwrCtrl OutputVoltage 1 0 1 0 12 float spy {CHV/} {rdValue} {} {setValue} {}\
pwrCtrl ResetErrorMsg 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}\
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} {}\
@@ -1210,26 +1203,26 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
hfactory $scobj_hpath/sensor plain spy none
foreach {cmdGroup varName readable writable pollEnabled drivable replyLen dataType permission rdCmd rdFunc wrCmd wrFunc allowedValues} $deviceCommandToplevel {
createNode $scobj_hpath $sct_controller $cmdGroup $varName $readable $writable $pollEnabled $drivable $replyLen $dataType $permission $rdCmd $rdFunc $wrCmd $wrFunc $allowedValues $klass
createNode $scobj_hpath $sct_controller $cmdGroup $varName $readable $writable $pollEnabled $drivable $replyLen $dataType $permission $rdCmd $rdFunc $wrCmd $wrFunc $allowedValues $klasse
}
# create a base node for each commandGroup element - these are all polled
hfactory $scobj_hpath/emon plain spy none
hfactory $scobj_hpath/pwrCtrl plain spy none
hfactory $scobj_hpath/pwrctrl plain spy none
foreach {cmdGroup varName readable writable pollEnabled drivable replyLen dataType permission rdCmd rdFunc wrCmd wrFunc allowedValues} $deviceCommand {
createNode $scobj_hpath $sct_controller $cmdGroup $varName $readable $writable $pollEnabled $drivable $replyLen $dataType $permission $rdCmd $rdFunc $wrCmd $wrFunc $allowedValues $klass
createNode $scobj_hpath $sct_controller $cmdGroup $varName $readable $writable $pollEnabled $drivable $replyLen $dataType $permission $rdCmd $rdFunc $wrCmd $wrFunc $allowedValues $klasse
}
# Create state machines for the following required nodes that do not correspond
# to device commands.
hfactory $scobj_hpath/emon/lastErrorMsg plain user text
#hsetprop $scobj_hpath/emon/lastErrorMsg values *any*
hset $scobj_hpath/emon/lastErrorMsg $::scobj::bruker_BEC1::bruker_BEC1_errMsg
helpNotes4user $scobj_hpath "emon" "lastErrorMsg"
hfactory $scobj_hpath/emon/lastErrorMsg2 plain user text
hset $scobj_hpath/emon/lastErrorMsg2 $::scobj::bruker_BEC1::bruker_BEC1_errMsg2
helpNotes4user $scobj_hpath "emon" "lastErrorMsg2"
hfactory $scobj_hpath/emon/last_error_msg plain user text
#hsetprop $scobj_hpath/emon/last_error_msg values *any*
hset $scobj_hpath/emon/last_error_msg $::scobj::bruker_BEC1::bruker_BEC1_errMsg
helpNotes4user $scobj_hpath "emon" "last_error_msg"
hfactory $scobj_hpath/emon/last_error_msg2 plain user text
hset $scobj_hpath/emon/last_error_msg2 $::scobj::bruker_BEC1::bruker_BEC1_errMsg2
helpNotes4user $scobj_hpath "emon" "last_error_msg2"
#hfactory $scobj_hpath/emon/statusText plain user text
#hset $scobj_hpath/emon/statusText $::scobj::bruker_BEC1::bruker_BEC1_statusText
@@ -1240,10 +1233,10 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
hset $scobj_hpath/emon/apply_tolerance 1
helpNotes4user $scobj_hpath "emon" "apply_tolerance"
hfactory $scobj_hpath/emon/isInTolerance plain spy text
hsetprop $scobj_hpath/emon/isInTolerance values idle,drive,monitor,error
hset $scobj_hpath/emon/isInTolerance "inTolerance"
helpNotes4user $scobj_hpath "emon" "isInTolerance"
hfactory $scobj_hpath/emon/is_in_tolerance plain spy text
hsetprop $scobj_hpath/emon/is_in_tolerance values idle,drive,monitor,error
hset $scobj_hpath/emon/is_in_tolerance "inTolerance"
helpNotes4user $scobj_hpath "emon" "is_in_tolerance"
hfactory $scobj_hpath/emon/tolerance plain user float
hsetprop $scobj_hpath/emon/tolerance units $::scobj::bruker_BEC1::bruker_BEC1_magneticFiledUnits
@@ -1252,34 +1245,34 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
helpNotes4user $scobj_hpath "emon" "tolerance"
# environment monitoring flags: shows if setpoints (field, current) are in tolerance
hfactory $scobj_hpath/emon/monMode plain user text
hsetprop $scobj_hpath/emon/monMode values idle,drive,monitor,error
hset $scobj_hpath/emon/monMode "idle"
helpNotes4user $scobj_hpath "emon" "monMode"
hfactory $scobj_hpath/emon/mon_mode plain user text
hsetprop $scobj_hpath/emon/mon_mode values idle,drive,monitor,error
hset $scobj_hpath/emon/mon_mode "idle"
helpNotes4user $scobj_hpath "emon" "mon_mode"
hfactory $scobj_hpath/emon/errhandler plain spy text
hset $scobj_hpath/emon/errhandler "lazy"
helpNotes4user $scobj_hpath "emon" "errhandler"
hfactory $scobj_hpath/pwrCtrl/LSB_Err plain spy text
hset $scobj_hpath/pwrCtrl/LSB_Err "UNKNOWN"
helpNotes4user $scobj_hpath "pwrCtrl" "LSB_Err"
hfactory $scobj_hpath/pwrctrl/lsb_err plain spy text
hset $scobj_hpath/pwrctrl/lsb_err "UNKNOWN"
helpNotes4user $scobj_hpath "pwrctrl" "lsb_err"
hfactory $scobj_hpath/pwrCtrl/MSB_Err plain spy text
hset $scobj_hpath/pwrCtrl/MSB_Err "UNKNOWN"
helpNotes4user $scobj_hpath "pwrCtrl" "MSB_Err"
hfactory $scobj_hpath/pwrctrl/msb_err plain spy text
hset $scobj_hpath/pwrctrl/msb_err "UNKNOWN"
helpNotes4user $scobj_hpath "pwrctrl" "msb_err"
hfactory $scobj_hpath/pwrCtrl/PwrSupplyStatus plain spy text
hset $scobj_hpath/pwrCtrl/PwrSupplyStatus "UNKNOWN"
helpNotes4user $scobj_hpath "pwrCtrl" "PwrSupplyStatus"
hfactory $scobj_hpath/pwrctrl/pwr_supply_status plain spy text
hset $scobj_hpath/pwrctrl/pwr_supply_status "UNKNOWN"
helpNotes4user $scobj_hpath "pwrctrl" "pwr_supply_status"
hfactory $scobj_hpath/pwrCtrl/StateMachineStatus plain spy text
hset $scobj_hpath/pwrCtrl/StateMachineStatus "UNKNOWN"
helpNotes4user $scobj_hpath "pwrCtrl" "StateMachineStatus"
hfactory $scobj_hpath/pwrctrl/state_machine_status plain spy text
hset $scobj_hpath/pwrctrl/state_machine_status "UNKNOWN"
helpNotes4user $scobj_hpath "pwrctrl" "state_machine_status"
#hfactory $scobj_hpath/pwrCtrl/EthernetAddrDec plain user text
#hset $scobj_hpath/pwrCtrl/EthernetAddrDec "UNKNOWN"
#helpNotes4user $scobj_hpath "pwrCtrl" "EthernetAddrDec"
#hfactory $scobj_hpath/pwrctrl/EthernetAddrDec plain user text
#hset $scobj_hpath/pwrctrl/EthernetAddrDec "UNKNOWN"
#helpNotes4user $scobj_hpath "pwrctrl" "EthernetAddrDec"
hfactory $scobj_hpath/status plain spy text
hsetprop $scobj_hpath/status values busy,idle
@@ -1293,19 +1286,19 @@ proc mk_sct_bruker_BEC1 {sct_controller klass tempobj tol} {
# Note: node names longer than 8 characters cause eror messages - avoid
set nxProperties "
$scobj_hpath sensor NXsensor spy
$scobj_hpath sensor/MeasuredField sensor user
$scobj_hpath sensor/ActualDAC_Field sensor user
$scobj_hpath sensor/DesiredCurrent sensor user
$scobj_hpath sensor/NominalOutpCurrent sensor user
$scobj_hpath sensor/measured_field sensor user
$scobj_hpath sensor/actual_dac_field sensor user
$scobj_hpath sensor/desired_current sensor user
$scobj_hpath sensor/nominal_outp_current sensor user
"
set aliasProperties "
$scobj_hpath MeasuredField sensor _sensor_MeasuredField
$scobj_hpath ActualDAC_Field sensor _sensor_ActualDAC_Field
$scobj_hpath DesiredCurrent sensor _sensor_DesiredCurrent
$scobj_hpath NominalOutpCurrent sensor _sensor_NominalOutpCurrent
$scobj_hpath measured_field sensor _sensor_MeasuredField
$scobj_hpath actual_dac_field sensor _sensor_ActualDAC_Field
$scobj_hpath desired_current sensor _sensor_DesiredCurrent
$scobj_hpath nominal_outp_current sensor _sensor_NominalOutpCurrent
"
foreach {rootpath hpath klass priv} $nxProperties {
hsetprop $rootpath/$hpath klass $klass
foreach {rootpath hpath klasse priv} $nxProperties {
hsetprop $rootpath/$hpath klass $klasse
hsetprop $rootpath/$hpath privilege $priv
hsetprop $rootpath/$hpath control true
hsetprop $rootpath/$hpath data true
@@ -1324,21 +1317,23 @@ proc mk_sct_bruker_BEC1 {sct_controller klass 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 NominalOutpCurrent
::scobj::hinitprops $tempobj/sensor nominal_outp_current
hsetprop $scobj_hpath/pwrctrl/statusByte control false
ansto_makesctdrive ${tempobj}_driveable $scobj_hpath/sensor/DesiredCurrent $scobj_hpath/sensor/NominalOutpCurrent $sct_controller
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 20091209)"
puts "Bruker BEC1 power supply for 1-Tesla magnet ready at /sample/$tempobj (Driver 2010-04-07)"
} message ]
handle_exception $catch_status $message "In subroutine mk_sct_bruker_BEC1()."
}
namespace export mk_sct_bruker_BEC1
# endproc mk_sct_bruker_BEC1 sct_controller klass tempobj tol bruker_BEC1_LSmodel
}
namespace export mk_sct_bruker_BEC1
# endproc mk_sct_bruker_BEC1 sct_controller klasse tempobj tol bruker_BEC1_LSmodel
}
# end of namespace mk_sct_bruker_BEC1
##
# @brief add_bruker_BEC1() adds a scriptcontext object for a Bruker BEC1 power supply (1T magnet)
# and makes it available to SICServer
@@ -1351,15 +1346,16 @@ proc add_bruker_BEC1 {name IP port {_tol 0.1} } {
# Don't create a magnet controller for the script validator, this may cause the
# the BEC1 to lock up.
# NOTE: This is placed outside the catch block because "return" raises an exception
if [SplitReply [environment_simulation]] {
if {[SplitReply [environment_simulation]]} {
return
}
set catch_status [ catch {
puts "\nadd_bruker_BEC1: makesctcontroller $name std ${IP}:$port for Bruker BEC1 1-Tesla magnet power supply"
# Command terminator for Bruker unit is only carriage return without linefeed '\r'
makesctcontroller sct_bruker_BEC1_$name std ${IP}:$port "\r"
puts "\nadd_bruker_BEC1: makesctcontroller $name astvelsel ${IP}:$port for Bruker BEC1 1-Tesla magnet power supply"
# Command terminator for Bruker unit is always carriage return without linefeed '\r'
makesctcontroller sct_bruker_BEC1_$name astvelsel ${IP}:$port "\r"
# proc mk_sct_bruker_BEC1 (sct_controller klasse tempobj tol)
mk_sct_bruker_BEC1 sct_bruker_BEC1_$name environment $name $_tol
makesctemon $name /sics/$name/emon/monMode /sics/$name/emon/isInTolerance /sics/$name/emon/errhandler
makesctemon $name /sics/$name/emon/mon_mode /sics/$name/emon/is_in_tolerance /sics/$name/emon/errhandler
} message ]
handle_exception $catch_status $message "In subroutine add_bruker_BEC1()."
}

View File

@@ -8,7 +8,7 @@ namespace eval ::scobj::et2000 {
# /tempcont/setpoint
# /tempcont/sensor/value
proc debug_log {args} {
set fd [open "/home/dcl/et2000.log" a]
set fd [open "/tmp/et2000.log" a]
puts $fd $args
close $fd
}
@@ -317,6 +317,7 @@ debug_log "halt $tc_root"
hsetprop $scobj_hpath privilege spy
::scobj::hinitprops $tempobj setpoint
hsetprop $scobj_hpath/setpoint data true
if {[SplitReply [environment_simulation]]=="false"} {
ansto_makesctdrive ${tempobj}_driveable $scobj_hpath/setpoint $scobj_hpath/sensor/value $sct_controller
}
@@ -335,7 +336,7 @@ debug_log "halt $tc_root"
# @param port, the IP protocol port number of the device (502 for modbus)
# @param _tol (optional), this is the initial tolerance setting
proc add_et2000 {name IP port dev_id {_tol 5.0}} {
set fd [open "/home/dcl/et2000.log" a]
set fd [open "/tmp/et2000.log" a]
if {[SplitReply [environment_simulation]]=="false"} {
puts $fd "makesctcontroller sct_et2000 modbus ${IP}:$port"
makesctcontroller sct_et2000 modbus ${IP}:$port
@@ -348,11 +349,11 @@ proc add_et2000 {name IP port dev_id {_tol 5.0}} {
}
puts stdout "file evaluation of sct_eurotherm_2000.tcl"
set fd [open "/home/dcl/et2000.log" w]
set fd [open "/tmp/et2000.log" w]
puts $fd "file evaluation of sct_eurotherm_2000.tcl"
close $fd
namespace import ::scobj::et2000::*
add_et2000 et2000 137.157.201.213 502 1 5
#add_et2000 et2000 137.157.201.213 502 1 5
#add_et2000 et2000 localhost 30502 1 5

View File

@@ -38,6 +38,12 @@ set instrument_dictionary [subst {
datatype @none
property {data true control true nxsave true klass parameters type part}
}
instrument/reduce {
privilege spy
sobj {@any reduce}
datatype @none
property {data true control true nxsave true klass reduce type part}
}
instrument/parameters/parameters_group {
privilege spy
datatype @none

View File

@@ -11,7 +11,7 @@ set boolean {true false}
#}
# SICS OBJECTS MUST PROVIDE THE FOLLOWING INFORMATION
set sobj_klass_list {@none aperture attenuator collimator command crystal data detector disk_chopper entry environment experiment graphics instrument slits monitor monochromator parameter plc sample scan sensor source user}
set sobj_klass_list {@none aperture attenuator collimator command crystal data detector disk_chopper entry environment experiment graphics instrument slits monitor monochromator parameter plc reduce sample scan sensor source user}
set sobj_sicstype_list {chopperadapter environment_controller sicsvariable macro motor configurablevirtualmotor singlecounter histmem nxscript sicsdata scanobject sct_object}
# Different kinds of things are added to the hdb in different ways.
# command: This is something a client can run with hset /a/b/c start, it may have parameters and feedback.

View File

@@ -42,12 +42,6 @@ namespace eval histogram_memory {
set ic_count_methods [concat [list time unlimited period count frame] $::counter::isc_beam_monitor_list ]
if {$histmem_simulation == "true"} {
MakeHM hmm SIM
# MakeHM hmm_xy SIM
# MakeHM hmm_xt SIM
# MakeHM hmm_yt SIM
# MakeHM hmm_x SIM
# MakeHM hmm_y SIM
# MakeHM hmm_t SIM
hmm configure daq Stopped
hmm configure statuscheck false
hmm configure num_events_filled_to_histo 12345
@@ -230,19 +224,6 @@ namespace eval histogram_memory {
## Scan Callback Procedures ##
##############################################
##############################################
if {0} {
#XXX REMOVE
proc init {} {
}
proc graphics_hpath_setup {parent} {
}
proc commands_hpath_setup {parent} {
}
proc instrument_hpath_setup {parent} {
}
proc experiment_hpath_setup {parent} {
}
}
proc set_sobj_attributes {} {
if [ catch {
# SICS commands

View File

@@ -43,10 +43,10 @@ proc ::scobj::dethvps::rdValue {vPath} {
"ASCERR:*" {
sct geterror $data
if {$currSuperState == $RAMPBUSY || $currSuperState == $RAMPSTART} {
broadcast "ERROR: $data, dhv1 stopped ramping detector voltage"
broadcast "DHVERROR: $data, dhv1 stopped ramping detector voltage"
statemon stop dhv1
} else {
# broadcast "ERROR: $data"
# broadcast "DHVERROR: $data"
}
if {$currSuperState != $RAMPIDLE} {
sct ramping $RAMPIDLE
@@ -85,7 +85,7 @@ proc ::scobj::dethvps::rdValue {vPath} {
return idle
}
default {
broadcast "ERROR: dhv1([info level 0]) sct ramping = [sct ramping], STOPPING"
broadcast "DHVERROR: dhv1([info level 0]) sct ramping = [sct ramping], STOPPING"
sct ramping $RAMPIDLE
statemon stop dhv1
return idle
@@ -107,8 +107,8 @@ proc ::scobj::dethvps::setValue {nextSubState} {
set par [sct target]
set maxV [sct max]
if {$par < 0 || $par > $maxV} {
broadcast "ERROR: dhv1 target must be between 0 and $maxV"
sct seterror "ERROR: dhv1 target must be between 0 and $maxV"
broadcast "DHVERROR: dhv1 target must be between 0 and $maxV"
sct seterror "DHVERROR: dhv1 target must be between 0 and $maxV"
return idle
}
set currSuperState [sct ramping]
@@ -147,10 +147,10 @@ proc ::scobj::dethvps::getACK {} {
"ASCERR:*" {
sct seterror $data
if {$currSuperState == $RAMPBUSY || $currSuperState == $RAMPSTART} {
broadcast "ERROR: $data, dhv1 stopped ramping detector voltage"
broadcast "DHVERROR: $data, dhv1 stopped ramping detector voltage"
statemon stop dhv1
} else {
# broadcast "ERROR: $data"
# broadcast "DHVERROR: $data"
}
if {$currSuperState != $RAMPSTOP} {
sct ramping $RAMPSTOP
@@ -198,8 +198,8 @@ proc ::scobj::dethvps::ramping {cmd} {
}
default {
sct ramping $RAMPSTOP
broadcast "ERROR: dhv1, Invalid ramp step: $rampstep STOPPING"
sct seterror "ERROR: dhv1, Invalid ramp step: $rampstep"
broadcast "DHVERROR: dhv1, Invalid ramp step: $rampstep STOPPING"
sct seterror "DHVERROR: dhv1, Invalid ramp step: $rampstep"
return idle
}
}
@@ -235,8 +235,8 @@ proc ::scobj::dethvps::drvCmd {} {
hset $potValPath 0
}
default {
clientput "ERROR: Unknown command $cmd"
sct seterror "ERROR: Unknown command $cmd"
clientput "DHVERROR: Unknown command $cmd"
sct seterror "DHVERROR: Unknown command $cmd"
return idle
}
}
@@ -304,7 +304,7 @@ proc ::scobj::dethvps::dhv1 {{CMD getVoltage} {val ""} } {
if {[SplitReply [config myrights]] == 0} {
hsetprop $qsObjPath $CMD $val
} else {
error "ERROR: $CMD can only be initialised from a configuration file"
error "DHVERROR: $CMD can only be initialised from a configuration file"
}
} else {
return "dhv1.$CMD = [hgetpropval $qsObjPath $CMD]"

View File

@@ -242,6 +242,7 @@ proc ::scan::hmm_scan_finish {sobj uobj} {
::histogram_memory::stop
::scan::runscan_cmd -set feedback status IDLE
run_mode "normal"
set ::histogram_memory::histmem_axes(SVAR) "/instrument/run_number"
# Make sure that the next save command doesn't overwrite our scan data.
# and clear any data links
::nexus::newfile clear data
@@ -260,6 +261,7 @@ proc ::scan::bm_scan_finish {sobj uobj} {
variable reset_position
::scan::hdb_bmonscan -set feedback status IDLE
run_mode "normal"
set ::histogram_memory::histmem_axes(SVAR) "/instrument/run_number"
# Make sure that the next save command doesn't overwrite our scan data.
# and clear any data links
::nexus::newfile clear data

View File

@@ -129,8 +129,8 @@ proc ::histogram_memory::isc_initialize {} {
::histogram_memory::init_OAT_TABLE res "std_968x128"
::histogram_memory::upload_config Filler_defaults
::nexus::data alias ::histogram_memory::vertical_axis ::histogram_memory::y_pixel_offset
::nexus::data alias ::histogram_memory::horizontal_axis ::histogram_memory::x_pixel_angular_offset
set ::histogram_memory::histmem_axes(HOR) /instrument/detector/x_pixel_angular_offset
set ::histogram_memory::histmem_axes(VER) /instrument/detector/y_pixel_offset
} message ] {
if {$::errorCode=="NONE"} {return $message}
return -code error $message

View File

@@ -10,7 +10,7 @@ Motor eom $motor_driver_type [params \
axis A\
units degrees\
hardlowerlim -45\
hardupperlim 60\
hardupperlim 80\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
@@ -18,7 +18,7 @@ Motor eom $motor_driver_type [params \
absEnc 1\
absEncHome $eom_Home\
cntsPerX -8192]
setHomeandRange -motor eom -home 0 -lowrange 35 -uprange 55
setHomeandRange -motor eom -home 0 -lowrange 35 -uprange 80
eom speed 1
eom movecount $move_count
eom precision 0.01

View File

@@ -406,8 +406,8 @@ ss1r softlowerlim $ss1r_LoRange
ss1r softupperlim $ss1r_HiRange
ss1r home 0
ss1r movecount $move_count
ss1r part slits.first
ss1r long_name right
ss1r part slits
ss1r long_name first_right
# Slit 1, left
Motor ss1l $motor_driver_type [params \
@@ -425,8 +425,8 @@ ss1l softlowerlim $ss1l_LoRange
ss1l softupperlim $ss1l_HiRange
ss1l home 0
ss1l movecount $move_count
ss1l part slits.first
ss1l long_name left
ss1l part slits
ss1l long_name first_left
# Slit 1, up
Motor ss1u $motor_driver_type [params \
@@ -444,8 +444,8 @@ ss1u softlowerlim $ss1u_LoRange
ss1u softupperlim $ss1u_HiRange
ss1u home 0
ss1u movecount $move_count
ss1u part slits.first
ss1u long_name top
ss1u part slits
ss1u long_name first_top
# Slit 1, down
Motor ss1d $motor_driver_type [params \
@@ -463,8 +463,8 @@ ss1d softlowerlim $ss1d_LoRange
ss1d softupperlim $ss1d_HiRange
ss1d home 0
ss1d movecount $move_count
ss1d part slits.first
ss1d long_name bottom
ss1d part slits
ss1d long_name first_bottom
############################
# Motor Controller 4
@@ -495,8 +495,8 @@ ss2r softlowerlim $ss2r_LoRange
ss2r softupperlim $ss2r_HiRange
ss2r home 0
ss2r movecount $move_count
ss2r part slits.second
ss2r long_name right
ss2r part slits
ss2r long_name second_right
# Slit 2, left
Motor ss2l $motor_driver_type [params \
@@ -514,8 +514,8 @@ ss2l softlowerlim $ss2l_LoRange
ss2l softupperlim $ss2l_HiRange
ss2l home 0
ss2l movecount $move_count
ss2l part slits.second
ss2l long_name left
ss2l part slits
ss2l long_name second_left
# Slit 2, up
Motor ss2u $motor_driver_type [params \
@@ -533,8 +533,8 @@ ss2u softlowerlim $ss2u_LoRange
ss2u softupperlim $ss2u_HiRange
ss2u home 0
ss2u movecount $move_count
ss2u part slits.second
ss2u long_name top
ss2u part slits
ss2u long_name second_top
# Slit 2, down
Motor ss2d $motor_driver_type [params \
@@ -552,8 +552,8 @@ ss2d softlowerlim $ss2d_LoRange
ss2d softupperlim $ss2d_HiRange
ss2d home 0
ss2d movecount $move_count
ss2d part slits.second
ss2d long_name bottom
ss2d part slits
ss2d long_name second_bottom
}
proc mthGet {} { return [expr [SplitReply [mtth]]/2.0]}

View File

@@ -1,3 +1,4 @@
# Author: Ferdi Franceschini (ffr@ansto.gov.au)
# Required by server_config.tcl
@@ -30,6 +31,8 @@ fileeval $cfPath(hmm)/hmm_configuration.tcl
fileeval $cfPath(nexus)/nxscripts.tcl
fileeval $cfPath(scan)/scan.tcl
fileeval $cfPath(commands)/commands.tcl
fileeval $cfPath(commands)/pulser.tcl
fileeval $cfPath(commands)/hvcommands.tcl
fileeval $cfPath(anticollider)/anticollider.tcl
fileeval $cfPath(hmm)/hmm_rapid.tcl
source gumxml.tcl
@@ -41,14 +44,17 @@ source gumxml.tcl
# ::environment::temperature::add_ls340 tc2 2
# New Lakeshore series driver for models 340 and 336 - (tcl-code, version 20090824) - beta status
# driverName shortName IP-address portOnMoxa temperatureTolerance LakeshoreModel
# driverName shortName IP-address portOnMoxa temperatureTolerance1 Tolerance2 LakeshoreModel
# ffr 2009-11-11: NOTE I've added a line terminator argument to the ls3xx setup.
# You need to set the line termintator to either "\r\n" for CRLF or "\r" for CR
# add_ls3xx tc1 137.157.201.85 7777 "\r\n" 0.5 336
# add_ls3xx tc2 137.157.201.85 4002 "\r\n" 0.5 340
# name IP-address port term LakeshoreModel tol1 tol2
add_ls3xx tc1 137.157.201.85 7777 "\r\n" 336 5 5
# add_ls3xx tc1 137.157.201.86 4001 "\r\" 400 340
# add_ls3xx tc2 137.157.201.86 4002 "\r" 5 5 340
#::environment::temperature::add_west400
#::environment::temperature::add_west400 137.157.201.88
server_init
###########################################
# WARNING: Do not add any code below server_init, if you do SICS may fail to initialise properly.

View File

@@ -3,7 +3,7 @@ namespace eval robot {
MakeAsyncProtocol robot
MakeAsyncQueue robby robot 137.157.201.26 6000
robby delay 500
robby timeout 5000
robby timeout 50000
drive sx 0 sy 0 som 0
}
}

View File

@@ -165,8 +165,8 @@ proc ::histogram_memory::isc_initialize {} {
::histogram_memory::init_CAT_TABLE
::histogram_memory::upload_config Filler_defaults
::nexus::data alias ::histogram_memory::vertical_axis ::histogram_memory::y_pixel_offset
::nexus::data alias ::histogram_memory::horizontal_axis ::histogram_memory::x_pixel_angular_offset
set ::histogram_memory::histmem_axes(HOR) /instrument/detector/x_pixel_angular_offset
set ::histogram_memory::histmem_axes(VER) /instrument/detector/y_pixel_offset
} message ] {
if {$::errorCode=="NONE"} {return $message}
return -code error $message

View File

@@ -539,8 +539,8 @@ ss1r softlowerlim $ss1r_LoRange
ss1r softupperlim $ss1r_HiRange
ss1r home 0
ss1r movecount $move_count
ss1r part slits.first
ss1r long_name right
ss1r part slits
ss1r long_name first_right
# Slit 1, left
Motor ss1l $motor_driver_type [params \
@@ -558,8 +558,8 @@ ss1l softlowerlim $ss1l_LoRange
ss1l softupperlim $ss1l_HiRange
ss1l home 0
ss1l movecount $move_count
ss1l part slits.first
ss1l long_name left
ss1l part slits
ss1l long_name first_left
# Slit 1, up
Motor ss1u $motor_driver_type [params \
@@ -577,8 +577,8 @@ ss1u softlowerlim $ss1u_LoRange
ss1u softupperlim $ss1u_HiRange
ss1u home 0
ss1u movecount $move_count
ss1u part slits.first
ss1u long_name top
ss1u part slits
ss1u long_name first_top
# Slit 1, down
Motor ss1d $motor_driver_type [params \
@@ -596,8 +596,8 @@ ss1d softlowerlim $ss1d_LoRange
ss1d softupperlim $ss1d_HiRange
ss1d home 0
ss1d movecount $move_count
ss1d part slits.first
ss1d long_name bottom
ss1d part slits
ss1d long_name first_bottom
############################
# Motor Controller 4
@@ -650,8 +650,8 @@ ss2r softlowerlim $ss2r_LoRange
ss2r softupperlim $ss2r_HiRange
ss2r home 0
ss2r movecount $move_count
ss2r part slits.second
ss2r long_name right
ss2r part slits
ss2r long_name second_right
# Slit 2, left
Motor ss2l $motor_driver_type [params \
@@ -669,8 +669,8 @@ ss2l softlowerlim $ss2l_LoRange
ss2l softupperlim $ss2l_HiRange
ss2l home 0
ss2l movecount $move_count
ss2l part slits.second
ss2l long_name left
ss2l part slits
ss2l long_name second_left
# Slit 2, up
Motor ss2u $motor_driver_type [params \
@@ -688,8 +688,8 @@ ss2u softlowerlim $ss2u_LoRange
ss2u softupperlim $ss2u_HiRange
ss2u home 0
ss2u movecount $move_count
ss2u part slits.second
ss2u long_name top
ss2u part slits
ss2u long_name second_top
# Slit 2, down
Motor ss2d $motor_driver_type [params \
@@ -707,8 +707,8 @@ ss2d softlowerlim $ss2d_LoRange
ss2d softupperlim $ss2d_HiRange
ss2d home 0
ss2d movecount $move_count
ss2d part slits.second
ss2d long_name bottom
ss2d part slits
ss2d long_name second_bottom
# Virtual and Simulated Motors
# ----------------------------

View File

@@ -1,3 +1,4 @@
# Author: Ferdi Franceschini (ffr@ansto.gov.au)
# Required by server_config.tcl
@@ -35,16 +36,29 @@ fileeval $cfPath(anticollider)/anticollider.tcl
fileeval $cfPath(environment)/robby_configuration.tcl
source gumxml.tcl
# Old Lakeshore340 driver (c-code)
# ::environment::temperature::add_ls340 tc1 1
# ::environment::temperature::add_ls340 tc2 2
#
# New sct Lakeshore340 driver (in tcl)
# ::environment::temperature::add_ls340t tc1 1
# ::environment::temperature::add_ls340t tc2 2
###::environment::temperature::add_ls340 tc2 1
# ::environment::temperature::add_west400 137.157.201.14
::robot::add_robby
##
# New lakeshore driver. BETA status. Data saving not tested
#add_ls340t tc1 ca5-[instname] 4001
#add_ls340t tc2 ca5-[instname] 4002
# New Lakeshore series driver for models 340 and 336
# driverName shortName IP-address portOnMoxa temperatureTolerance1 Tolerance2 LakeshoreModel
# ffr 2009-11-11: NOTE I've added a line terminator argument to the ls3xx setup.
# You need to set the line termintator to either "\r\n" for CRLF or "\r" for CR
# axm 2010-02-10: NOTE the ls3xx driver versions 2010-01-25 and newer expect 2 tolerance values,
# one for each control loop.
# name IP-address port term tol1 tol2 LakeshoreModel
# add_ls3xx tc1 137.157.201.23 7777 "\r\n" 2.0 10.0 336
###add_ls3xx tc1 137.157.201.23 7777 "\r\n" 5.0 336
#add_ls3xx tc1 ca5-[instname] 4001 "\r\n" 0.5 340
#add_ls3xx tc2 ca5-[instname] 4001 "\r" 0.5 340
::environment::temperature::add_west400 137.157.201.14
###::robot::add_robby
server_init
###########################################
# WARNING: Do not add any code below server_init, if you do SICS may fail to initialise properly.

View File

@@ -36,7 +36,7 @@ namespace eval exp_mode {
#4=Single
variable c1ht_pos
set valid_modes [list SB DB FOC MT POL]
set c1ht_pos [list 1057 806.7 557.1 200 0.1]
set c1ht_pos [list 1057 806.7 557.1 320 68.9]
command set_mode "text=[join $valid_modes ,] arg " { ;#need to change all softzero's
global ::exp_mode::valid_modes
@@ -64,8 +64,21 @@ namespace eval exp_mode {
# the following line does the job. However, it is duplicated when the mode is set in
# set_omega, so it is commented out for now.
# drive ss1u 0 ss1d 0 ss2u 0 ss2d 0 ss3u 0 ss3d 0 ss4u 0 ss4d 0
if {[catch {::exp_mode::set_omega $arg1} errMsg]} {return -code error $errMsg}
if {[catch {::exp_mode::set_two_theta $arg2} errMsg]} {return -code error $errMsg}
# if {[catch {::exp_mode::set_omega $arg1} errMsg]} {return -code error $errMsg}
# if {[catch {::exp_mode::set_two_theta $arg2} errMsg]} {return -code error $errMsg}
omega $arg1
twotheta $arg2
if {[catch {
::exp_mode::set_omega $arg1
::exp_mode::set_two_theta $arg2
} errMsg ] } {
omega -1
twotheta -1
return -code error $errMsg
}
return -code ok
}
@@ -114,9 +127,10 @@ proc ::exp_mode::set_omega { arg } {
switch $expmode {
SB { ;#checked ARJN on 081231
if {[catch {::exp_mode::checkMotionAndDrive m1ro [expr -1.*$arg/2.]} errMsg]} {return -code error $errMsg}
drive st4vt 0
if {[catch {::exp_mode::checkMotionAndDrive m1ro [expr -1.*$arg/2.]} errMsg]} {return -code error $errMsg}
set d1 [expr [SplitReply [slit3_distance]] - [SplitReply [guide1_distance]]]
set d1 [expr [SplitReply [slit3_distance]] - [SplitReply [guide1_distance]]]
set d2 [expr [SplitReply [sample_distance]] - [SplitReply [guide1_distance]]]
set h1 [expr -1. * $d1 * tan($argrad)]
set h2 [expr -1. * $d2 * tan($argrad)]
@@ -148,23 +162,37 @@ proc ::exp_mode::set_omega { arg } {
if { [catch {checkMotionAndDrive sz $h2} errMsg]} {return -code error $errMsg}
}
FOC {
if { [catch {checkMotionAndDrive sth $arg} errMsg]} {return -code error $errMsg}
if {[catch {checkMotionAndDrive st3vt 0} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion sth $arg
checkMotion st3vt 0
} errMsg ] } {
return -code error $errMsg
}
run sth $arg st3vt 0
}
MT {
if {[catch {checkMotionAndDrive st3vt 0} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive sth $arg} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion sth $arg
checkMotion st3vt 0
} errMsg ] } {
return -code error $errMsg
}
run sth $arg st3vt 0
}
POL {
if {[catch {checkMotionAndDrive st3vt 0} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive sth $arg} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion sth $arg
checkMotion st3vt 0
} errMsg ] } {
return -code error $errMsg
}
run sth $arg st3vt 0
}
default {
return -code error "omega driving not specified for that mode"
}
}
omega $arg
return -code ok
}
publish ::exp_mode::set_omega user
@@ -231,43 +259,56 @@ proc ::exp_mode::set_two_theta { arg } {
if { [catch {checkMotionAndDrive dz [expr $h3 + $h4]} errMsg]} {return -code error $errMsg}
}
FOC {
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive dz $h1} errMsg]} {return -code error $errMsg}
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion st4vt $h2
checkMotion dz $h1
} errMsg]} {
return -code error $errMsg
}
run st4vt $h2 dz $h1
}
MT {
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive dz $h1} errMsg]} {return -code error $errMsg}
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion st4vt $h2
checkMotion dz $h1
} errMsg ] } {
return -code error $errMsg
}
run st4vt $h2 dz $h1
}
POL {
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set d3 [expr [SplitReply [anal_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
set h3 [expr $d3 * tan($argrad)]
set ang1 [expr $arg + 0.8]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive dz $h1} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive analz $h3} errMsg]} {return -code error $errMsg}
if { [catch {checkMotionAndDrive analtilt $ang1} errMsg]} {return -code error $errMsg}
set d1 [SplitReply [dy]]
set d2 [expr [SplitReply [slit4_distance]] - [SplitReply [sample_distance]]]
set d3 [expr [SplitReply [anal_distance]] - [SplitReply [sample_distance]]]
set h1 [expr $d1 * tan($argrad)]
set h2 [expr $d2 * tan($argrad)]
set h3 [expr $d3 * tan($argrad)]
set ang1 [expr $arg + 0.8]
if { [catch {isszst4vtsafe st4vt $h2} errMsg]} {return -code error $errMsg}
if { [catch {
checkMotion st4vt $h2
checkMotion dz $h1
checkMotion analz $h3
checkMotion analtilit $ang1
} errMsg ] } {
return -code error $errMsg
}
run st4vt $h2 dz $h1 analz $h3 analtilit $ang1
}
default {
return -code error "two_theta not defined for that mode: $expmode"
return -code error "two_theta not defined for that mode: $expmode"
}
}
twotheta $arg
return -code ok
}
publish ::exp_mode::set_two_theta user

View File

@@ -34,7 +34,8 @@ if {$sim_mode == "true"} {
#Measured absolute encoder reading at home position
set bz_home 8142000
set c1ht_home 8152065
#set c1ht_home 8152065 - this is wrong, it should be 8265000
set c1ht_home 8265000
set m1ro_home 134658
set bat_home 8308518
set st3vt_home 5250496

View File

@@ -52,27 +52,31 @@ detector_distance 10000
detector_base 300
anal_distance 1808
anal_base 20
slit4_distance 5527
slit4_distance 5331.15
slit4_base 20
sample_distance 5129
sample_distance 5045.4
sample_base 50
slit3_distance 4808
slit3_distance 4744.4
slit3_base 20
guide1_distance 2900.4 ;# distance measured to axis of rotation
guide1_base
guide2_distance 3200 ;# distance measured to midpoint of the 2nd compound mirror (i.e. closest to the sample)
guide2_base
slit2_distance 1895
slit2_distance 1909.9
slit2_base 20
chopper4_distance 823
chopper4_distance 808
chopper4_base 20
chopper3_distance 370
chopper4_phase_offset 0.3246
chopper3_distance 359
chopper3_base 20
chopper2_distance 102
chopper3_phase_offset 0.38500
chopper2_distance 103
chopper2_base 20
chopper2_phase_offset -0.02
chopper1_distance 0
chopper1_base 20
slit1_distance -244
chopper1_phase_offset -1.857
slit1_distance -256.1
slit1_base 20
mode NONE
omega -1

View File

@@ -38,9 +38,9 @@ source gumxml.tcl
::utility::mkVar ::anticollider::protect_detector text manager protect_detector false detector true false
::anticollider::protect_detector "true"
# Driver for Bruker BEC1 power supply (1-Tesla Magnet) - beta
# Driver for Bruker BEC1 power supply (1-Tesla Magnet)
# driver short-name IP-address MoxaPort Tolerance(Amps)
#add_bruker_BEC1 ma1 137.157.202.145 4003 0.1
#add_bruker_BEC1 ma1 137.157.202.152 4444 0.1
server_init
###########################################

View File

@@ -4,33 +4,91 @@
# Home value for Eulerian cradle
#
#
# this is the Huber Eulerian cradle
#
set eom_Home 23165406
set ephi_Home 6647676
set echi_Home 8919336
set eom_stepsPerX [expr -25000.0]
set eom_cntsPerX [expr 8192.0]
set ephi_stepsPerX [expr -25000.0/2.0]
set ephi_cntsPerX [expr -8192.0/2.0]
set echi_stepsPerX [expr -25000.0/1.0]
set echi_cntsPerX [expr 8192.0/1.0]
#
# this is our own tiny black cradle
#
#set eom_Home 23165406
#set ephi_Home 20947518
#set echi_Home 24735790
#
#set eom_stepsPerX [expr -25000.0]
#set eom_cntsPerX [expr 8192.0]
#
#set ephi_stepsPerX [expr -25000.0]
#set ephi_cntsPerX [expr 8192.0]
#
#set echi_stepsPerX [expr -25000.0]
#set echi_cntsPerX [expr 8192.0]
# Sample Tilt 1, euler omega stage -> exchange with ssw further down
#Motor eom $motor_driver_type [params \
# asyncqueue mc4\
# axis F\
# units degrees\
# hardlowerlim -390\
# hardupperlim 390\
# maxSpeed 1\
# maxAccel 1\
# maxDecel 1\
# stepsPerX $eom_stepsPerX\
# absEnc 1\
# absEncHome $eom_Home\
# cntsPerX $eom_cntsPer]
#setHomeandRange -motor eom -home 0 -lowrange -390 -uprange 390
#eom speed 1
#eom softlowerlim -390
#eom softupperlim 390
#eom movecount $move_count
#eom precision 0.01
#eom part sample
#eom long_name eom
#
# use sample omega until euler omega gets its own cables
#
#
# Sample Omega, rotate
Motor eom $motor_driver_type [params \
asyncqueue mc4\
axis F\
asyncqueue mc2\
axis E\
units degrees\
hardlowerlim -390\
hardupperlim 390\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX -25000\
hardlowerlim -180\
hardupperlim 180\
maxSpeed 3\
maxAccel 5\
maxDecel 5\
stepsPerX [expr -25000.0*(383.0/360.0)]\
absEnc 1\
absEncHome $eom_Home\
cntsPerX 8192]
eom speed 1
eom softlowerlim -390
eom softupperlim 390
eom home 0
eom movecount $move_count
absEncHome 26472736\
cntsPerX [expr 8192.0*(383.0/360.0)]]
setHomeandRange -motor som -home 0 -lowrange 178 -uprange 178
eom Backlash_offset -0.5
eom speed 2
eom accel 0.1
eom decel 0.1
eom precision 0.01
eom part sample
eom long_name eom
# Sample Tilt 2, euler chi stage -> EC1
Motor echi $motor_driver_type [params \
asyncqueue mc2\
@@ -38,13 +96,14 @@ Motor echi $motor_driver_type [params \
units degrees\
hardlowerlim -390\
hardupperlim 390\
maxSpeed 5\
maxSpeed 10\
maxAccel 3\
maxDecel 3\
stepsPerX [expr -25000 ]\
stepsPerX $echi_stepsPerX\
absEnc 1\
absEncHome $echi_Home\
cntsPerX [expr 8192 ] ]
cntsPerX $echi_cntsPerX ]
setHomeandRange -motor echi -home 0 -lowrange -390 -uprange 390
echi softlowerlim -10
echi softupperlim 90
echi home 0
@@ -61,13 +120,13 @@ Motor ephi $motor_driver_type [params \
units degrees\
hardlowerlim -400\
hardupperlim 400\
maxSpeed 3\
maxSpeed 10\
maxAccel 1\
maxDecel 1\
stepsPerX [expr -25000.0/2.0]\
stepsPerX $ephi_stepsPerX\
absEnc 1\
absEncHome $ephi_Home\
cntsPerX [expr -8192.0/2.0]]
cntsPerX $ephi_cntsPerX]
setHomeandRange -motor ephi -home 0 -lowrange 400 -uprange 400
ephi softlowerlim -400
ephi softupperlim 400

View File

@@ -68,7 +68,7 @@ set sz_home 2147456656
#set sx_Home 9041997
# value after dismanteling the table
# parameter sz=419.01 - mtth=79
set sx_Home 9050918
set sx_Home 9050281
#set sy_Home 7230717
@@ -84,7 +84,7 @@ set sx_Home 9050918
# value after dismanteling the table
# parameter sz=419.01 - mtth=79
#set sy_Home 18814870
set sy_Home 18815280
set sy_Home 18815689
# swapped sx with sy after rotation of vertical stage
set sx_pitch 4.9995324
@@ -116,19 +116,20 @@ set psho_home 7576691
set psp_home 3977689
# set home value to be equal to front limit switch 28.01.2009, corr. to 50 mm distance to the stits front edge
set psp_home 4084134
set psp_home 4813236
#set psw_home 2040518
#set psw_home 7784698
set psw_home 7789698
#set psw_home 7789698
set psw_home 7785599
#set ssho_home 500000
#set ssho_home 7193394
set ssho_home 6877100
#set ssp_home 2043085
#set ssp_home 8701689
set ssp_home 8701400
#set ssp_home 8701400
set ssp_home 9192956
set move_count 10
@@ -325,7 +326,7 @@ Motor sz $motor_driver_type [params \
axis A\
units mm\
hardlowerlim 0\
hardupperlim 460\
hardupperlim 500\
maxSpeed 2\
maxAccel 1\
maxDecel 1\
@@ -334,8 +335,8 @@ Motor sz $motor_driver_type [params \
absenchome $sz_home\
cntsPerX -[expr (1<<15)/260.165]]
setHomeandRange -motor sz -home 0 -lowrange 0 -uprange 350
sz speed 1
sz softupperlim 460
sz speed 0.6
sz softupperlim 500
sz softlowerlim 0
sz part sample
sz backlash_offset -1
@@ -471,7 +472,7 @@ Motor som $motor_driver_type [params \
axis E\
units degrees\
hardlowerlim -180\
hardupperlim 185\
hardupperlim 180\
maxSpeed 3\
maxAccel 5\
maxDecel 5\
@@ -479,7 +480,7 @@ Motor som $motor_driver_type [params \
absEnc 1\
absEncHome $som_Home\
cntsPerX [expr -8192.0*(383.0/360.0)]]
setHomeandRange -motor som -home 0 -lowrange 180 -uprange 180
setHomeandRange -motor som -home 0 -lowrange 178 -uprange 178
som Backlash_offset -0.5
som speed 2
som accel 0.1
@@ -493,7 +494,7 @@ Motor stth $motor_driver_type [params \
asyncqueue mc2\
axis F\
units degrees\
hardlowerlim 40\
hardlowerlim 30\
hardupperlim 119.6\
maxSpeed 0.5\
maxAccel 0.1\
@@ -502,7 +503,7 @@ Motor stth $motor_driver_type [params \
absEnc 1\
absEncHome $stth_Home\
cntsPerX [expr -8192.0/$stth_pitch]]
stth softlowerlim 40
stth softlowerlim 30
stth softupperlim 119.6
stth home 0
stth speed 0.2
@@ -607,7 +608,7 @@ Motor psp $motor_driver_type [params \
axis B\
units mm\
hardlowerlim 0\
hardupperlim 150\
hardupperlim 280\
maxSpeed 4\
maxAccel 1\
maxDecel 1\
@@ -619,7 +620,7 @@ psp speed 4
psp Backlash_offset -0.3
psp part slits
psp long_name primary_psp
setHomeandRange -motor psp -home 0 -lowrange 0 -uprange 150
setHomeandRange -motor psp -home 0 -lowrange 0 -uprange 280
# Primary Slit, width, 0-30mm
Motor psw $motor_driver_type [params \
@@ -670,7 +671,7 @@ Motor ssp $motor_driver_type [params \
axis E\
units mm\
hardlowerlim 0\
hardupperlim 150\
hardupperlim 220\
maxSpeed 4\
maxAccel 1\
maxDecel 1\
@@ -682,7 +683,7 @@ ssp speed 4
ssp Backlash_offset -0.3
ssp part slits
ssp long_name secondary_ssp
setHomeandRange -motor ssp -home 0 -lowrange 0 -uprange 150
setHomeandRange -motor ssp -home 0 -lowrange 0 -uprange 220
# Primary Slit, height, 0-30mm
#Motor psh $motor_driver_type [params \

View File

@@ -1,4 +1,4 @@
set ssw_home 8220625
set ssw_home 8216527
# Secondary Slit, width
Motor ssw $motor_driver_type [params \

View File

@@ -3,6 +3,9 @@
# START MOTOR CONFIGURATION
::utility::mkVar FastShutter text manager FastShutter false instrument true false
# SET TO 1 TO USE THE TILT STAGE ie sample phi and chi
set use_tiltstage 0
set animal quokka
set sim_mode [SplitReply [motor_simulation]]
@@ -174,7 +177,7 @@ dummy_motor softlowerlim -500
dummy_motor softupperlim 500
dummy_motor home 0
if $use_tiltstage {
# Sample tilt along beam [-20,+20] degrees
Motor samchi $motor_driver_type [params \
asyncqueue mc1\
@@ -218,7 +221,7 @@ samphi long_name sample_phi
samphi softlowerlim -20
samphi softupperlim 20
samphi home 0
}
# Sample translation across beam [0,1000] mm
Motor samx $motor_driver_type [params \
asyncqueue mc1\
@@ -724,25 +727,25 @@ apx softupperlim 5
apx speed 5
# Sample aperture y
Motor apz $motor_driver_type [params \
asyncqueue mc3\
host mc3-quokka\
port pmc3-quokka\
axis F\
units mm\
hardlowerlim -10\
hardupperlim 10\
maxSpeed 1\
maxAccel 1\
maxDecel 1\
stepsPerX 25000\
absEnc 1\
absEncHome $apz_Home\
cntsPerX -8192]
apz part collimator
apz long_name apz
setHomeandRange -motor apz -home 0 -lowrange 0 -uprange 5
apz speed 1
#Motor apz $motor_driver_type [params \
# asyncqueue mc3\
# host mc3-quokka\
# port pmc3-quokka\
# axis F\
# units mm\
# hardlowerlim -10\
# hardupperlim 10\
# maxSpeed 1\
# maxAccel 1\
# maxDecel 1\
# stepsPerX 25000\
# absEnc 1\
# absEncHome $apz_Home\
# cntsPerX -8192]
#apz part collimator
#apz long_name apz
#setHomeandRange -motor apz -home 0 -lowrange 0 -uprange 5
#apz speed 1
# Rotary attenuator
set att_factor [expr ((1.0 - (1.0)/360.0)*(3000.0/61.0))/360.0]

View File

@@ -7,8 +7,8 @@
##
# Note EndFacePosY and RotApPosY are surveyed positions
foreach {var lname type priv units klass} {
BeamCenterX BeamCenterX float user mm parameter
BeamCenterZ BeamCenterZ float user mm parameter
BeamCenterX BeamCenterX float user mm reduce
BeamCenterZ BeamCenterZ float user mm reduce
BeamStop BeamStop int user none parameter
BSdiam BSdiam float user mm parameter
EApPosY EApPosY float user mm parameter