add Pelican
r3112 | jgn | 2011-04-20 12:44:37 +1000 (Wed, 20 Apr 2011) | 1 line
This commit is contained in:
committed by
Douglas Clowes
parent
baf6961a82
commit
506a265815
@@ -7,85 +7,6 @@ namespace eval motor {
|
|||||||
variable is_homing_list ""
|
variable is_homing_list ""
|
||||||
}
|
}
|
||||||
|
|
||||||
#namespace eval sample {
|
|
||||||
# command select {int=0:8 sampid} {
|
|
||||||
# SampleNum $sampid
|
|
||||||
# }
|
|
||||||
#}
|
|
||||||
|
|
||||||
|
|
||||||
#namespace eval beamstops {
|
|
||||||
# command selbsn {int=1,2,3,4,5,6 bs} {
|
|
||||||
# selbs $bs "UNDEF" "UNDEF"
|
|
||||||
# }
|
|
||||||
# command selbsxz {int=1,2,3,4,5,6 bs float bx float bz} {
|
|
||||||
# selbs $bs $bx $bz
|
|
||||||
# }
|
|
||||||
#}
|
|
||||||
|
|
||||||
#namespace eval optics {
|
|
||||||
# VarMake ::optics::select::section text user
|
|
||||||
# VarMake ::optics::polarizer::in text user
|
|
||||||
# VarMake ::optics::lens::selection text user
|
|
||||||
|
|
||||||
# command rotary_attenuator {int=0,15,45,90,180 angle} {
|
|
||||||
# drive att $angle
|
|
||||||
# }
|
|
||||||
|
|
||||||
# command entrance_aperture {
|
|
||||||
# int=0,45,90,135,180,270 angle
|
|
||||||
# } {
|
|
||||||
# drive srce $angle
|
|
||||||
# }
|
|
||||||
|
|
||||||
# TODO Do we need this
|
|
||||||
# command sample_aperture {
|
|
||||||
# int=25,50 size
|
|
||||||
# text=circ,squ,open,rect shape
|
|
||||||
# } {
|
|
||||||
# SApXmm $size
|
|
||||||
# SApZmm $size
|
|
||||||
# SApShape $shape
|
|
||||||
# }
|
|
||||||
|
|
||||||
##############################
|
|
||||||
##
|
|
||||||
# @brief The "guide" command uses a lookup table to setup the collimation system
|
|
||||||
# @param row, selects a row from the guide configuration table
|
|
||||||
#
|
|
||||||
# eg\n
|
|
||||||
# guide ga
|
|
||||||
# command guide "
|
|
||||||
# text=[join [array names ::optics::guide_configuration] , ] configuration
|
|
||||||
# " {
|
|
||||||
#
|
|
||||||
# variable guide_configuration
|
|
||||||
# variable guide_configuration_columns
|
|
||||||
#
|
|
||||||
# if [ catch {
|
|
||||||
#
|
|
||||||
# foreach {compselection position} $guide_configuration($configuration) {
|
|
||||||
# foreach el $compselection guide $guide_configuration_columns {
|
|
||||||
# lappend to_config $guide
|
|
||||||
# lappend to_config [set ::optics::${guide}_map($el)]
|
|
||||||
# }
|
|
||||||
# ::optics::guide -set feedback status BUSY
|
|
||||||
# set msg [eval "drive $to_config"]
|
|
||||||
# EApPosY $position
|
|
||||||
# }
|
|
||||||
# GuideConfig $configuration
|
|
||||||
# } message ] {
|
|
||||||
# ::optics::guide -set feedback status IDLE
|
|
||||||
# if {$::errorCode=="NONE"} {return $message}
|
|
||||||
# return -code error $message
|
|
||||||
# }
|
|
||||||
# ::optics::guide -set feedback status IDLE
|
|
||||||
# }
|
|
||||||
# ::optics::guide -addfb text status
|
|
||||||
# ::optics::guide -set feedback status IDLE
|
|
||||||
#}
|
|
||||||
|
|
||||||
|
|
||||||
proc ::commands::isc_initialize {} {
|
proc ::commands::isc_initialize {} {
|
||||||
::commands::ic_initialize
|
::commands::ic_initialize
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,6 @@ proc ::histogram_memory::init_OAT_TABLE {} {
|
|||||||
proc ::histogram_memory::pre_count {} {}
|
proc ::histogram_memory::pre_count {} {}
|
||||||
proc ::histogram_memory::post_count {} {}
|
proc ::histogram_memory::post_count {} {}
|
||||||
proc ::histogram_memory::isc_initialize {} {
|
proc ::histogram_memory::isc_initialize {} {
|
||||||
# Instrument specific X and Y dimension names
|
|
||||||
#variable INST_NXC "oat_nxc_eff"
|
|
||||||
#variable INST_NYC "oat_nyc_eff"
|
|
||||||
|
|
||||||
if [ catch {
|
if [ catch {
|
||||||
::histogram_memory::init_hmm_objs
|
::histogram_memory::init_hmm_objs
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
proc AsciiPlot_findScale {ydatalist scale baseline} {
|
|
||||||
upvar $scale sc
|
|
||||||
upvar $baseline bl
|
|
||||||
set min +99999999.99
|
|
||||||
set max -99999999.99
|
|
||||||
foreach yval $ydatalist {
|
|
||||||
if {$yval > $max} {
|
|
||||||
set max $yval
|
|
||||||
}
|
|
||||||
if {$yval < $min} {
|
|
||||||
set min $yval
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set sc [expr 61./($max-$min)]
|
|
||||||
set bl [expr int(-$min*$sc+1.)]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
proc AsciiPlot_clearLine {line} {
|
|
||||||
upvar $line Zeile
|
|
||||||
for {set i 0} {$i < 64} {incr i} {
|
|
||||||
set Zeile($i) " "
|
|
||||||
}
|
|
||||||
set Zeile(64) "\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
proc AsciiPlot_printLine {xtxt line} {
|
|
||||||
upvar $line Zeile
|
|
||||||
set txtline ""
|
|
||||||
set txtline "$txtline$xtxt"
|
|
||||||
for {set i 0} {$i <= 64} {incr i} {
|
|
||||||
set txtline "$txtline$Zeile($i)"
|
|
||||||
}
|
|
||||||
ClientPut $txtline
|
|
||||||
}
|
|
||||||
|
|
||||||
proc AsciiPlot_list {xdata ydata} {
|
|
||||||
AsciiPlot_findScale $ydata scale baseValue
|
|
||||||
set xty 0
|
|
||||||
set avgy 0
|
|
||||||
foreach xval $xdata yval $ydata {
|
|
||||||
set xty [expr $xty+$xval*$yval]
|
|
||||||
set avgy [expr $avgy+$yval]
|
|
||||||
AsciiPlot_clearLine line
|
|
||||||
set line(0) "!"
|
|
||||||
set height [expr int($yval*$scale+$baseValue)]
|
|
||||||
if {$height >= 1} {
|
|
||||||
if {$height < 69} {
|
|
||||||
set line($height) "*"
|
|
||||||
} else {
|
|
||||||
set line(68) "*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AsciiPlot_printLine [format %+#1.3e $xval] line
|
|
||||||
}
|
|
||||||
ClientPut "\ncenter of gravity = [expr 1.*$xty/$avgy]\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
proc AsciiPlot_xydata2list {xydatalist xdata ydata} {
|
|
||||||
upvar $xdata xd
|
|
||||||
upvar $ydata yd
|
|
||||||
set xd {}
|
|
||||||
set yd {}
|
|
||||||
set xydl [$xydatalist list]
|
|
||||||
foreach {x y} $xydl {
|
|
||||||
lappend xd $x
|
|
||||||
lappend yd $y
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
proc AsciiPlot {data} {
|
|
||||||
AsciiPlot_xydata2list $data xdata ydata
|
|
||||||
AsciiPlot_list $xdata $ydata
|
|
||||||
}
|
|
||||||
|
|
||||||
Publish AsciiPlot Spy
|
|
||||||
alias asciiplot AsciiPlot
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
#--------------------------------------------------------------
|
|
||||||
# This is the initialisation code for the ANDOR iKon-M
|
|
||||||
# camera and the CDDWWW WWW-server. It got separated into
|
|
||||||
# a separate file in order to support moving that camera around.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, November 2010
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
|
|
||||||
#source $scripthome/ccdwww.tcl
|
|
||||||
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
set ccdwww::initnodes [list daqmode camerano accucycle accucounts \
|
|
||||||
triggermode temperature imagepar shutterlevel \
|
|
||||||
shuttermode openingtime closingtime flip rotate \
|
|
||||||
hspeed vspeed vamp]
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc writecooler {} {
|
|
||||||
set target [sct target]
|
|
||||||
set status [ccdwww::httpsend "/ccd/cooling?status=$target"]
|
|
||||||
andisct queue /sics/andi/cooler read read
|
|
||||||
andisct queue /sics/andi/temperature read read
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc readcooler {} {
|
|
||||||
sct send "/ccd/iscooling"
|
|
||||||
return coolerreply
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc coolerreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {ccdwww::httptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
} else {
|
|
||||||
catch {hdelprop [sct] geterror}
|
|
||||||
if {$data == 0} {
|
|
||||||
sct update off
|
|
||||||
} else {
|
|
||||||
sct update on
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc readtemp {} {
|
|
||||||
ccdwww::httpsend "/ccd/temperature"
|
|
||||||
return tempreply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc tempreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {ccdwww::httptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
} else {
|
|
||||||
catch {hdelprop [sct] geterror}
|
|
||||||
sct update $data
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc MakeAndorHM {name host } {
|
|
||||||
ccdwww::MakeCCDWWW $name $host "ccdwww::initscript $name"
|
|
||||||
hfactory /sics/$name/daqmode plain mugger text
|
|
||||||
hset /sics/$name/daqmode single
|
|
||||||
hfactory /sics/$name/camerano plain mugger int
|
|
||||||
hset /sics/$name/camerano 0
|
|
||||||
hfactory /sics/$name/accucycle plain mugger int
|
|
||||||
hset /sics/$name/accucycle 20
|
|
||||||
hfactory /sics/$name/accucounts plain mugger int
|
|
||||||
hset /sics/$name/accucounts 5
|
|
||||||
hfactory /sics/$name/triggermode plain mugger int
|
|
||||||
hset /sics/$name/triggermode 0
|
|
||||||
hfactory /sics/$name/temperature plain mugger int
|
|
||||||
hset /sics/$name/temperature -30
|
|
||||||
hfactory /sics/$name/imagepar plain mugger intar 6
|
|
||||||
hset /sics/$name/imagepar 1 1 1 1024 1 1024
|
|
||||||
hfactory /sics/$name/shutterlevel plain mugger int
|
|
||||||
hset /sics/$name/shutterlevel 0
|
|
||||||
hfactory /sics/$name/shuttermode plain mugger int
|
|
||||||
hset /sics/$name/shuttermode 0
|
|
||||||
hfactory /sics/$name/openingtime plain mugger int
|
|
||||||
hset /sics/$name/openingtime 20
|
|
||||||
hfactory /sics/$name/closingtime plain mugger int
|
|
||||||
hset /sics/$name/closingtime 20
|
|
||||||
hfactory /sics/$name/flip plain mugger intar 2
|
|
||||||
hset /sics/$name/flip 0 1
|
|
||||||
hfactory /sics/$name/rotate plain mugger int
|
|
||||||
hset /sics/$name/rotate 0
|
|
||||||
hfactory /sics/$name/hspeed plain mugger int
|
|
||||||
hset /sics/$name/hspeed 2
|
|
||||||
hfactory /sics/$name/vspeed plain mugger int
|
|
||||||
hset /sics/$name/vspeed 0
|
|
||||||
hfactory /sics/$name/vamp plain mugger int
|
|
||||||
hset /sics/$name/vamp 1
|
|
||||||
hfactory /sics/$name/cooler plain mugger text
|
|
||||||
hset /sics/$name/cooler off
|
|
||||||
hsetprop /sics/$name/cooler write writecooler
|
|
||||||
hsetprop /sics/$name/cooler httpreply ccdwww::httpreply
|
|
||||||
hsetprop /sics/$name/cooler read readcooler
|
|
||||||
hsetprop /sics/$name/cooler coolerreply coolerreply
|
|
||||||
${name}sct write /sics/$name/cooler
|
|
||||||
${name}sct poll /sics/$name/cooler 30
|
|
||||||
hfactory /sics/$name/sensor_temperature plain mugger float
|
|
||||||
hsetprop /sics/$name/sensor_temperature read readtemp
|
|
||||||
hsetprop /sics/$name/sensor_temperature tempreply tempreply
|
|
||||||
${name}sct poll /sics/$name/sensor_temperature 30
|
|
||||||
$name dim 1024 1024
|
|
||||||
$name init
|
|
||||||
}
|
|
||||||
@@ -1,524 +0,0 @@
|
|||||||
#--------------------------------------------------------------
|
|
||||||
# This is a new style driver for the Astrium chopper systems in
|
|
||||||
# the new sicsobj/scriptcontext based system. Please note that
|
|
||||||
# actual implementations may differ in the number of choppers
|
|
||||||
# and the address of the chopper on the network.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# SCRIPT CHAINS:
|
|
||||||
# - reading parameters:
|
|
||||||
# astchopread - readastriumchopperpar - readastriumchopperpar - ...
|
|
||||||
# - writing
|
|
||||||
# astchopwrite - astchopwritereply
|
|
||||||
#
|
|
||||||
# Another remark:
|
|
||||||
# In order for chosta to work properly, the chopperparlist and
|
|
||||||
# chopperlonglist must be aligned.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, February 2009
|
|
||||||
#
|
|
||||||
# If something goes wrong with this, the following things ought
|
|
||||||
# to be checked:
|
|
||||||
# - Is the standard Tcl scan command been properly renamed to stscan?
|
|
||||||
# - Is a communication possible with the chopper via telnet?
|
|
||||||
# This may not be the case because of other SICS servers blocking
|
|
||||||
# things or the old driver being active and capturing the terminal
|
|
||||||
# server port in SerPortServer. Scriptcontext then fails silently.
|
|
||||||
# But may be we will fix the latter.
|
|
||||||
# - The other thing which happens is that the parameter list of
|
|
||||||
# the chopper differs in little ways between instances.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, April 2009
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
MakeSICSObj choco AstriumChopper
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc astriumchopperputerror {txt} {
|
|
||||||
global choppers chopperparlist
|
|
||||||
foreach chopper $choppers {
|
|
||||||
foreach par $chopperparlist {
|
|
||||||
set path /sics/choco/${chopper}/${par}
|
|
||||||
hsetprop $path geterror $txt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
# Paramamters look like: name value, entries for parameters are
|
|
||||||
# separated by ;
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc astriumsplitreply {chopper reply} {
|
|
||||||
set parlist [split [string trim $reply] ";"]
|
|
||||||
foreach par $parlist {
|
|
||||||
catch {stscan $par "%s %s" token val} count
|
|
||||||
if {[string first ERROR $count] < 0 && $count == 2} {
|
|
||||||
set val [string trim $val]
|
|
||||||
set token [string trim $token]
|
|
||||||
catch {hupdate /sics/choco/${chopper}/${token} $val}
|
|
||||||
catch {hdelprop /sics/choco/${chopper}/${token} geterror}
|
|
||||||
} else {
|
|
||||||
#-------- special fix for dphas and averl
|
|
||||||
if {[string first dphas $par] >= 0} {
|
|
||||||
set val [string range $par 5 end]
|
|
||||||
if {$val > 360} {
|
|
||||||
set val [expr $val -360.]
|
|
||||||
}
|
|
||||||
hupdate /sics/choco/${chopper}/dphas $val
|
|
||||||
hdelprop /sics/choco/${chopper}/dphas geterror
|
|
||||||
}
|
|
||||||
if {[string first averl $par] >= 0} {
|
|
||||||
set val [string range $par 5 end]
|
|
||||||
hupdate /sics/choco/${chopper}/averl $val
|
|
||||||
hdelprop /sics/choco/${chopper}/averl geterror
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
# update those parameters which are dependent on the chopper
|
|
||||||
# status just read. Some of them may or may not be there, this
|
|
||||||
# is why this is protected by catch'es.
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc astcopydependentpar {} {
|
|
||||||
global choppers
|
|
||||||
foreach chop $choppers {
|
|
||||||
set val [hval /sics/choco/${chop}/aspee]
|
|
||||||
catch {hupdate /sics/choco/${chop}/speed $val}
|
|
||||||
set val [hval /sics/choco/${chop}/nphas]
|
|
||||||
set dp [hval /sics/choco/${chop}/dphas]
|
|
||||||
set val [expr $val + $dp]
|
|
||||||
catch {hupdate /sics/choco/${chop}/phase $val}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc readastriumchopperpar {} {
|
|
||||||
global choppers
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first ERR $reply] >= 0} {
|
|
||||||
astriumchopperputerror $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
if {[string first "not valid" $reply] >= 0 } {
|
|
||||||
astriumchopperputerror "ERROR: chopper responded with not valid"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
set count [sct replycount]
|
|
||||||
if {$count == -1} {
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
sct replycount 0
|
|
||||||
hupdate /sics/choco/asyst ""
|
|
||||||
hdelprop /sics/choco/asyst geterror
|
|
||||||
return astchoppar
|
|
||||||
} else {
|
|
||||||
set oldval [hval /sics/choco/asyst]
|
|
||||||
hupdate /sics/choco/asyst "$oldval $reply"
|
|
||||||
astriumsplitreply [lindex $choppers $count] $reply
|
|
||||||
incr count
|
|
||||||
sct replycount $count
|
|
||||||
if {$count < [llength $choppers] } {
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
return astchoppar
|
|
||||||
} else {
|
|
||||||
astcopydependentpar
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc astchopread {} {
|
|
||||||
sct send "asyst 1"
|
|
||||||
sct replycount -1
|
|
||||||
return astchoppar
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc astriumMakeChopperParameters {} {
|
|
||||||
global choppers chopperparlist
|
|
||||||
foreach chopper $choppers {
|
|
||||||
hfactory /sics/choco/${chopper} plain spy none
|
|
||||||
foreach par $chopperparlist {
|
|
||||||
set path /sics/choco/${chopper}/${par}
|
|
||||||
hfactory $path plain internal text
|
|
||||||
chocosct connect $path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hfactory /sics/choco/asyst plain user text
|
|
||||||
hsetprop /sics/choco/asyst read astchopread
|
|
||||||
hsetprop /sics/choco/asyst astchoppar readastriumchopperpar
|
|
||||||
hfactory /sics/choco/stop plain user int
|
|
||||||
chocosct poll /sics/choco/asyst 60
|
|
||||||
#--------- This is for debugging
|
|
||||||
# chocosct poll /sics/choco/asyst 10
|
|
||||||
}
|
|
||||||
#=================== write support ==============================
|
|
||||||
proc astchopwrite {prefix} {
|
|
||||||
set val [sct target]
|
|
||||||
sct send "$prefix $val"
|
|
||||||
sct writestart 1
|
|
||||||
hupdate /sics/choco/stop 0
|
|
||||||
return astchopwritereply
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
# Make sure to send a status request immediatly after a reply in
|
|
||||||
# order to avoid timing problems
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc astchopwritereply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first ERR $reply] >= 0} {
|
|
||||||
sct print $reply
|
|
||||||
hupdate /sics/choco/stop 1
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
if {[string first "chopper error" $reply] >= 0} {
|
|
||||||
sct print "ERROR: $reply"
|
|
||||||
hupdate /sics/choco/stop 1
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
if {[string first "not valid" $reply] >= 0 } {
|
|
||||||
sct print "ERROR: chopper responded with not valid"
|
|
||||||
hupdate /sics/choco/stop 1
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
set state [sct writestart]
|
|
||||||
if {$state == 1} {
|
|
||||||
sct writestart 0
|
|
||||||
sct send "asyst 1"
|
|
||||||
sct replycount -1
|
|
||||||
return astchopwritereply
|
|
||||||
} else {
|
|
||||||
set status [readastriumchopperpar]
|
|
||||||
if {[string first idle $status] >= 0} {
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
return astchopwritereply
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc astchopcompare {path1 path2 delta} {
|
|
||||||
set v1 [hval $path1]
|
|
||||||
set v2 [hval $path2]
|
|
||||||
if {abs($v1 - $v2) < $delta} {
|
|
||||||
return 1
|
|
||||||
} else {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc astchopcheckspeed {chopper} {
|
|
||||||
set stop [hval /sics/choco/stop]
|
|
||||||
if {$stop == 1} {
|
|
||||||
return fault
|
|
||||||
}
|
|
||||||
chocosct queue /sics/choco/asyst progress read
|
|
||||||
set tg [sct target]
|
|
||||||
set p1 /sics/choco/${chopper}/nspee
|
|
||||||
set p2 /sics/choco/${chopper}/aspee
|
|
||||||
set tst [astchopcompare $p1 $p2 50]
|
|
||||||
if {$tst == 1 } {
|
|
||||||
wait 1
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
return busy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc astchopcheckphase {chopper} {
|
|
||||||
set stop [hval /sics/choco/stop]
|
|
||||||
if {$stop == 1} {
|
|
||||||
return fault
|
|
||||||
}
|
|
||||||
chocosct queue /sics/choco/asyst progress read
|
|
||||||
set p2 [hval /sics/choco/${chopper}/dphas]
|
|
||||||
if {abs($p2) < .03} {
|
|
||||||
wait 15
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
return busy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc astchopcheckratio {} {
|
|
||||||
global choppers
|
|
||||||
set stop [hval /sics/choco/stop]
|
|
||||||
if {$stop == 1} {
|
|
||||||
return fault
|
|
||||||
}
|
|
||||||
set ch1 [lindex $choppers 0]
|
|
||||||
set ch2 [lindex $choppers 1]
|
|
||||||
chocosct queue /sics/choco/asyst progress read
|
|
||||||
set p1 [hval /sics/choco/${ch1}/aspee]
|
|
||||||
set p2 [hval /sics/choco/${ch2}/aspee]
|
|
||||||
set target [sct target]
|
|
||||||
if {$p2 < 10} {
|
|
||||||
return busy
|
|
||||||
}
|
|
||||||
if {abs($p1/$p2 - $target*1.) < .3} {
|
|
||||||
set tst 1
|
|
||||||
} else {
|
|
||||||
set tst 0
|
|
||||||
}
|
|
||||||
if {$tst == 1 } {
|
|
||||||
wait 1
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
return busy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc astchopstop {} {
|
|
||||||
sct print "No real way to stop choppers but I will release"
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
hupdate /sics/choco/stop 1
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc astspeedread {chopper} {
|
|
||||||
set val [hval /sics/choco/${chopper}/aspee]
|
|
||||||
sct update $val
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc astchopspeedlimit {chidx} {
|
|
||||||
global choppers maxspeed
|
|
||||||
set chname [lindex $choppers $chidx]
|
|
||||||
set val [sct target]
|
|
||||||
if {$val < 0 || $val > $maxspeed} {
|
|
||||||
error "Desired chopper speed out of range"
|
|
||||||
}
|
|
||||||
if {$chidx > 0} {
|
|
||||||
set state [hval /sics/choco/${chname}/state]
|
|
||||||
if {[string first async $state] < 0} {
|
|
||||||
error "Chopper in wrong state"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc astMakeChopperSpeed1 {var} {
|
|
||||||
global choppers
|
|
||||||
set ch [lindex $choppers 0]
|
|
||||||
set path /sics/choco/${ch}/speed
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
hsetprop $path read astspeedread $ch
|
|
||||||
hsetprop $path write astchopwrite "nspee 1 "
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopspeedlimit 0
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckspeed $ch
|
|
||||||
hsetprop $path priv manager
|
|
||||||
makesctdriveobj $var $path DriveAdapter chocosct
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc astMakeChopperSpeed2 {var} {
|
|
||||||
global choppers
|
|
||||||
set ch [lindex $choppers 1]
|
|
||||||
set path /sics/choco/${ch}/speed
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
hsetprop $path read astspeedread $ch
|
|
||||||
hsetprop $path write astchopwrite "nspee 2 "
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopspeedlimit 0
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckspeed $ch
|
|
||||||
hsetprop $path priv manager
|
|
||||||
makesctdriveobj $var $path DriveAdapter chocosct
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc astchopphaselimit {} {
|
|
||||||
set val [sct target]
|
|
||||||
if {$val < -359.9 || $val > 359.9} {
|
|
||||||
error "chopper phase out of range"
|
|
||||||
}
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc astphaseread {chopper} {
|
|
||||||
set val [hval /sics/choco/${chopper}/aphas]
|
|
||||||
sct update $val
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc astMakeChopperPhase1 {var} {
|
|
||||||
global choppers
|
|
||||||
set ch [lindex $choppers 0]
|
|
||||||
set path /sics/choco/${ch}/phase
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
hsetprop $path read astphaseread $ch
|
|
||||||
hsetprop $path write astchopwrite "nphas 1 "
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopphaselimit
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckphase $ch
|
|
||||||
hsetprop $path priv manager
|
|
||||||
makesctdriveobj $var $path DriveAdapter chocosct
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc astMakeChopperPhase2 {var} {
|
|
||||||
global choppers
|
|
||||||
set ch [lindex $choppers 1]
|
|
||||||
set path /sics/choco/${ch}/phase
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
hsetprop $path read astphaseread $ch
|
|
||||||
hsetprop $path write astchopwrite "nphas 2 "
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopphaselimit
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckphase $ch
|
|
||||||
hsetprop $path priv manager
|
|
||||||
makesctdriveobj $var $path DriveAdapter chocosct
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc astchopratiolimit {} {
|
|
||||||
set val [sct target]
|
|
||||||
if {$val < 1} {
|
|
||||||
error "Ratio out of range"
|
|
||||||
}
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc astMakeChopperRatio {var} {
|
|
||||||
global choppers
|
|
||||||
set ch [lindex $choppers 1]
|
|
||||||
set path /sics/choco/${ch}/Ratio
|
|
||||||
hdel $path
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
chocosct connect $path
|
|
||||||
hsetprop $path write astchopwrite "ratio 2 "
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopratiolimit
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckratio
|
|
||||||
makesctdriveobj $var $path DriveAdapter chocosct
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc chosta {} {
|
|
||||||
global chopperlonglist chopperparlist choppers chopperheader
|
|
||||||
set result "$chopperheader\n"
|
|
||||||
append line [format "%-20s " ""]
|
|
||||||
set count 1
|
|
||||||
foreach ch $choppers {
|
|
||||||
append line [format "%-20s " $ch]
|
|
||||||
incr count
|
|
||||||
}
|
|
||||||
append result $line "\n"
|
|
||||||
set nchop [llength $choppers]
|
|
||||||
set len [llength $chopperlonglist]
|
|
||||||
for {set i 0} {$i < $len} {incr i} {
|
|
||||||
set line ""
|
|
||||||
set par [lindex $chopperlonglist $i]
|
|
||||||
append line [format "%-20s " $par]
|
|
||||||
for {set n 0} {$n < $nchop} {incr n} {
|
|
||||||
set chname [lindex $choppers $n]
|
|
||||||
set parname [lindex $chopperparlist $i]
|
|
||||||
set val [hval /sics/choco/${chname}/${parname}]
|
|
||||||
append line [format "%-20s " $val]
|
|
||||||
}
|
|
||||||
append result $line "\n"
|
|
||||||
}
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#======================= Configuration Section ==========================
|
|
||||||
|
|
||||||
if {$amor == 1} {
|
|
||||||
set choppers [list chopper1 chopper2]
|
|
||||||
set chopperparlist [list amode aspee nspee nphas dphas averl ratio vibra t_cho \
|
|
||||||
durch vakum valve sumsi spver state]
|
|
||||||
set chopperlonglist [list "Chopper Mode" "Actual Speed" "Set Speed" "Phase" "Phase Error" \
|
|
||||||
"Loss Current" Ratio Vibration Temperature "Water Flow" Vakuum \
|
|
||||||
Valve Sumsi]
|
|
||||||
set chopperheader "AMOR Chopper Status"
|
|
||||||
makesctcontroller chocosct std ${ts}:3014 "\r\n" 60
|
|
||||||
# makesctcontroller chocosct std localhost:8080 "\r\n" 60
|
|
||||||
chocosct debug -1
|
|
||||||
set maxspeed 5000
|
|
||||||
set minphase 0
|
|
||||||
astriumMakeChopperParameters
|
|
||||||
astMakeChopperSpeed1 chopperspeed
|
|
||||||
astMakeChopperPhase2 chopper2phase
|
|
||||||
Publish chosta Spy
|
|
||||||
}
|
|
||||||
|
|
||||||
#----------------------------- POLDI -----------------------------------------
|
|
||||||
if {$poldi == 1} {
|
|
||||||
|
|
||||||
proc poldiastchopphaselimit {} {
|
|
||||||
set val [sct target]
|
|
||||||
if {$val < 80 || $val > 100} {
|
|
||||||
error "chopper phase out of range"
|
|
||||||
}
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#-------
|
|
||||||
proc poldispeedwrite {} {
|
|
||||||
set val [sct target]
|
|
||||||
set l [split [config myrights] =]
|
|
||||||
set rights [string trim [lindex $l 1]]
|
|
||||||
if {$rights == 2} {
|
|
||||||
if {$val < 4990 || $val > 15000} {
|
|
||||||
clientput "ERROR: Users may only drive the chopper between 5000 - 15000 RPM"
|
|
||||||
hupdate /sics/choco/stop 1
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [astchopwrite "nspee 1 "]
|
|
||||||
}
|
|
||||||
#-----------
|
|
||||||
set choppers [list chopper]
|
|
||||||
set chopperparlist [list amode aspee nspee nphas dphas averl ratio vibra vibax t_cho \
|
|
||||||
flowr vakum valve sumsi spver state]
|
|
||||||
set chopperlonglist [list "Chopper Mode" "Actual Speed" "Set Speed" "Phase" "Phase Error" \
|
|
||||||
"Loss Current" Ratio Vibration "Actual Vibration" Temperature "Water Flow" Vakuum \
|
|
||||||
Valve Sumsi]
|
|
||||||
set chopperheader "POLDI Chopper Status"
|
|
||||||
makesctcontroller chocosct std lnsts13:3005 "\r\n" 60
|
|
||||||
# makesctcontroller chocosct std localhost:8080 "\r\n" 60
|
|
||||||
chocosct debug -1
|
|
||||||
set maxspeed 15000
|
|
||||||
set minphase 80
|
|
||||||
astriumMakeChopperParameters
|
|
||||||
# astMakeChopperSpeed1 chopperspeed
|
|
||||||
|
|
||||||
set path /sics/choco/chopper/speed
|
|
||||||
hfactory $path plain user float
|
|
||||||
hsetprop $path read astspeedread chopper
|
|
||||||
hsetprop $path write poldispeedwrite
|
|
||||||
hsetprop $path astchopwritereply astchopwritereply
|
|
||||||
chocosct write $path
|
|
||||||
hsetprop $path checklimits astchopspeedlimit 0
|
|
||||||
hsetprop $path halt astchopstop
|
|
||||||
hsetprop $path checkstatus astchopcheckspeed chopper
|
|
||||||
hsetprop $path priv user
|
|
||||||
makesctdriveobj chopperspeed $path DriveAdapter chocosct
|
|
||||||
|
|
||||||
astMakeChopperPhase1 chopperphase
|
|
||||||
hsetprop /sics/choco/chopper/phase checklimit poldiastchopphaselimit
|
|
||||||
Publish chosta Spy
|
|
||||||
}
|
|
||||||
#----------------------------- FOCUS -----------------------------------------------------
|
|
||||||
if {$focus == 1} {
|
|
||||||
set choppers [list fermi disk]
|
|
||||||
set chopperparlist [list state amode aspee nspee nphas dphas averl ratio vibra t_cho \
|
|
||||||
durch vakum valve sumsi]
|
|
||||||
set chopperlonglist [list "Chopper State" "Chopper Mode" "Actual Speed" "Set Speed" \
|
|
||||||
"Phase" "Phase Error" \
|
|
||||||
"Loss Current" Ratio Vibration Temperature "Water Flow" \
|
|
||||||
Vakuum Valve Sumsi]
|
|
||||||
set chopperheader "FOCUS Chopper Status"
|
|
||||||
makesctcontroller chocosct std psts227:3008 "\r\n" 60
|
|
||||||
# makesctcontroller chocosct std localhost:8080 "\r\n" 60
|
|
||||||
chocosct debug -1
|
|
||||||
set maxspeed 20000
|
|
||||||
set minphase 0
|
|
||||||
astriumMakeChopperParameters
|
|
||||||
astMakeChopperSpeed1 fermispeed
|
|
||||||
astMakeChopperSpeed2 diskspeed
|
|
||||||
astMakeChopperRatio ratio
|
|
||||||
astMakeChopperPhase2 phase
|
|
||||||
Publish chosta Spy
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
proc nextBackupTime {now period last} {
|
|
||||||
upvar $last l
|
|
||||||
set l [expr $now / $period * $period]
|
|
||||||
return [expr $l + $period]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc backupCron {path {minutes 10} {days 1}} {
|
|
||||||
global next_backup
|
|
||||||
set now [clock seconds]
|
|
||||||
set minutes [expr $minutes * 60]
|
|
||||||
set days [expr $days * 24*3600]
|
|
||||||
if {! [info exists next_backup]} {
|
|
||||||
set next_backup(min) [nextBackupTime $now $minutes last]
|
|
||||||
set next_backup(day) [nextBackupTime $now $days last]
|
|
||||||
set file [clock format $now -format "$path/backupd-%m-%d.tcl"]
|
|
||||||
if {![file exists $file]} {
|
|
||||||
backup $file
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$now > $next_backup(min)} {
|
|
||||||
set next_backup(min) [nextBackupTime $now $minutes last]
|
|
||||||
set file [clock format $last -format "$path/backup-%Hh%M.tcl"]
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if {$now > $next_backup(day)} {
|
|
||||||
set next_backup(day) [nextBackupTime $now $days last]
|
|
||||||
set file [clock format $last -format "$path/backupd-%m-%d.tcl"]
|
|
||||||
}
|
|
||||||
backup $file
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#--------------------------------------------
|
|
||||||
# The old batchrun, batchroot pair
|
|
||||||
# Mark Koennecke, since 1996
|
|
||||||
#--------------------------------------------
|
|
||||||
|
|
||||||
if { [info exists batchinit] == 0 } {
|
|
||||||
set batchinit 1
|
|
||||||
Publish batchroot Spy
|
|
||||||
Publish batchrun User
|
|
||||||
}
|
|
||||||
|
|
||||||
proc SplitReply { text } {
|
|
||||||
set l [split $text =]
|
|
||||||
return [lindex $l 1]
|
|
||||||
}
|
|
||||||
#---------------------
|
|
||||||
proc batchrun file {
|
|
||||||
exe [string trim [SplitReply [batchroot]]/$file]
|
|
||||||
}
|
|
||||||
#---------------------
|
|
||||||
proc batchroot args {
|
|
||||||
if {[llength $args] > 1} {
|
|
||||||
exe batchpath [lindex $args 0]
|
|
||||||
return OK
|
|
||||||
} else {
|
|
||||||
set bp [SplitReply [exe batchpath]]
|
|
||||||
return "batchroot = $bp"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
#------------------------------------------------------
|
|
||||||
# This is SICS HM driver code for the CCDWWW CCD camera
|
|
||||||
# WWW server as used at SINQ. It uses, of course, the
|
|
||||||
# scriptcontext asynchronous I/O system
|
|
||||||
#
|
|
||||||
# Mark Koennecke, September 2010
|
|
||||||
#-------------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval ccdwww {}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
# This is a default init script. The user has to initialise
|
|
||||||
# a list of nodes to send to the CCD in XML format as
|
|
||||||
# variable ccdwww::initnodes
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc ccdwww::initscript {name} {
|
|
||||||
global ccdwww::initnodes
|
|
||||||
|
|
||||||
append confdata "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
|
||||||
foreach var $ccdwww::initnodes {
|
|
||||||
set val [hval /sics/${name}/${var}]
|
|
||||||
append confdata "<$var>$val</$var>\n"
|
|
||||||
}
|
|
||||||
return $confdata
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc ccdwww::httpsend {url} {
|
|
||||||
sct send $url
|
|
||||||
return httpreply
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc ccdwww::httpsendstart {url} {
|
|
||||||
sct send $url
|
|
||||||
return httpstartreply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc ccdwww::httptest {data} {
|
|
||||||
if {[string first ASCERR $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
if {[string first ERROR $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
return $data
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc ccdwww::httpreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {httptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
} else {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc ccdwww::httpstartreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {httptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
} else {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
}
|
|
||||||
clientput $data
|
|
||||||
after 100
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
# A CCD works like a camera. When exposing, it cannot be stopped,
|
|
||||||
# paused or anything. This is why the appropriate methods
|
|
||||||
# here have no implementation
|
|
||||||
#----------------------------------------------------------
|
|
||||||
proc ccdwww::httpcontrol {} {
|
|
||||||
set target [sct target]
|
|
||||||
switch $target {
|
|
||||||
1000 {
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
set preset [hval $path/preset]
|
|
||||||
set ret [ccdwww::httpsendstart "/ccd/expose?time=$preset"]
|
|
||||||
hupdate $path/status run
|
|
||||||
[sct controller] queue $path/status progress read
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
1001 {}
|
|
||||||
1002 {}
|
|
||||||
1003 {}
|
|
||||||
1005 {
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
set script [hval $path/initscript]
|
|
||||||
set confdata [eval $script]
|
|
||||||
clientput $confdata
|
|
||||||
return [ccdwww::httpsend "post:/ccd/configure:$confdata"]
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
sct print "ERROR: bad start target $target given to control"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc ccdwww::httpdata {name} {
|
|
||||||
set path "/sics/${name}/data"
|
|
||||||
set com [format "node:%s:/ccd/data" $path]
|
|
||||||
sct send $com
|
|
||||||
return httpdatareply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc ccdwww::httpdatareply {} {
|
|
||||||
set status [catch {httpreply} txt]
|
|
||||||
if {$status == 0} {
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
hdelprop $path/data geterror
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc ccdwww::httpstatus {} {
|
|
||||||
sct send /ccd/locked
|
|
||||||
return httpevalstatus
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc ccdwww::httpstatusdata {} {
|
|
||||||
catch {httpdatareply}
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc ccdwww::httpevalstatus {name} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {httptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
sct update error
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
if {$data == 0} {
|
|
||||||
httpdata $name
|
|
||||||
return httpstatusdata
|
|
||||||
} else {
|
|
||||||
sct update run
|
|
||||||
[sct controller] queue [sct] progress read
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc ccdwww::MakeCCDWWW {name host initscript} {
|
|
||||||
sicsdatafactory new ${name}transfer
|
|
||||||
makesctcontroller ${name}sct sinqhttpopt $host ${name}transfer 600
|
|
||||||
MakeSecHM $name 2
|
|
||||||
hsetprop /sics/${name}/control write ccdwww::httpcontrol
|
|
||||||
hsetprop /sics/${name}/control httpreply ccdwww::httpreply
|
|
||||||
hsetprop /sics/${name}/control httpstartreply ccdwww::httpstartreply
|
|
||||||
${name}sct write /sics/${name}/control
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/data read ccdwww::httpdata $name
|
|
||||||
hsetprop /sics/${name}/data httpdatareply ccdwww::httpdatareply
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/status read ccdwww::httpstatus
|
|
||||||
hsetprop /sics/${name}/status httpevalstatus ccdwww::httpevalstatus $name
|
|
||||||
hsetprop /sics/${name}/status httpstatusdata ccdwww::httpstatusdata
|
|
||||||
${name}sct poll /sics/${name}/status 60
|
|
||||||
|
|
||||||
hfactory /sics/${name}/initscript plain mugger text
|
|
||||||
hset /sics/${name}/initscript $initscript
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
gdb -d /afs/psi.ch/user/k/koennecke/src/workspace/sics -d /afs/psi.ch/user/k/koennecke/src/workspace/sics/psi SICServer $*
|
|
||||||
@@ -1,357 +0,0 @@
|
|||||||
#---------------------------------------------------------------
|
|
||||||
# These are the scripts for the delta-tau PMAC motor
|
|
||||||
# controller.
|
|
||||||
#
|
|
||||||
# !!!!!!!!! Script Chains !!!!!!!!!!!
|
|
||||||
# -- For reading parameters:
|
|
||||||
# sendpmacread code -- pmacreadreply
|
|
||||||
# -- For setting standard parameters
|
|
||||||
# sendpmacwrite code -- pmacreadreply
|
|
||||||
# -- For reading limits
|
|
||||||
# sendpmaclim -- readpmaclim
|
|
||||||
# -- For reading the status
|
|
||||||
# pmacsendaxer --- pmacrcvaxerr -- pmacrcvpos -- pmacrcvstat
|
|
||||||
# This means we check for an axis error first, then update the position,
|
|
||||||
# then check the axis status itself.
|
|
||||||
# -- For setting the position
|
|
||||||
# pmacsendhardpos -- pmacrcvhardpos -- pmacrcvhardax
|
|
||||||
# This means, we send the positioning command, read the reply and read the
|
|
||||||
# axisstatus until the axis has started
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, December 2008, March 2009
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc translatePMACError {key} {
|
|
||||||
set pmacerr(ERR001) "Command not allowed while executing"
|
|
||||||
set pmacerr(ERR002) "Password error"
|
|
||||||
set pmacerr(ERR003) "Unrecognized command"
|
|
||||||
set pmacerr(ERR004) "Illegal character"
|
|
||||||
set pmacerr(ERR005) "Command not allowed"
|
|
||||||
set pmacerr(ERR006) "No room in buffer for command"
|
|
||||||
set pmacerr(ERR007) "Buffer already in use"
|
|
||||||
set pmacerr(ERR008) "MACRO auxiliary communication error"
|
|
||||||
set pmacerr(ERR009) "Bad program in MCU"
|
|
||||||
set pmacerr(ERR010) "Both HW limits set"
|
|
||||||
set pmacerr(ERR011) "Previous move did not complete"
|
|
||||||
set pmacerr(ERR012) "A motor is open looped"
|
|
||||||
set pmacerr(ERR013) "A motor is not activated"
|
|
||||||
set pmacerr(ERR014) "No motors"
|
|
||||||
set pmacerr(ERR015) "No valid program in MCU"
|
|
||||||
set pmacerr(ERR016) "Bad program in MCU"
|
|
||||||
set pmacerr(ERR017) "Trying to resume after H or Q"
|
|
||||||
set pmacerr(ERR018) "Invalid operation during move"
|
|
||||||
set pmacerr(ERR019) "Illegal position change command during move"
|
|
||||||
return $pmacerr($key)
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc translateAxisError {key} {
|
|
||||||
switch [string trim $key] {
|
|
||||||
0 {return "no error"}
|
|
||||||
1 { return "limit violation"}
|
|
||||||
2 -
|
|
||||||
3 -
|
|
||||||
4 { return "jog error"}
|
|
||||||
5 {return "command not allowed"}
|
|
||||||
6 {return "watchdog triggered"}
|
|
||||||
7 {return "current limit reached"}
|
|
||||||
8 -
|
|
||||||
9 {return "Air cushion error"}
|
|
||||||
10 {return "MCU lim reached"}
|
|
||||||
11 {return "following error triggered"}
|
|
||||||
12 {return "EMERGENCY STOP ACTIVATED"}
|
|
||||||
13 {return "Driver electronics error"}
|
|
||||||
default { return "Unknown axis error $key"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc evaluateAxisStatus {key} {
|
|
||||||
#----- Tcl does not like negative numbers as keys.
|
|
||||||
if {$key < 0} {
|
|
||||||
set key [expr 50 + abs($key)]
|
|
||||||
}
|
|
||||||
switch $key {
|
|
||||||
0 -
|
|
||||||
14 {return idle}
|
|
||||||
1 -
|
|
||||||
2 -
|
|
||||||
3 -
|
|
||||||
4 -
|
|
||||||
5 -
|
|
||||||
6 -
|
|
||||||
7 -
|
|
||||||
8 -
|
|
||||||
9 -
|
|
||||||
10 -
|
|
||||||
56 -
|
|
||||||
11 {return run}
|
|
||||||
55 {error "Axis is deactivated"}
|
|
||||||
54 {error "emergency stop activated, please release"}
|
|
||||||
53 {error "Axis inhibited"}
|
|
||||||
51 -
|
|
||||||
52 {error "Incoming command is blocked"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc checkpmacresult {} {
|
|
||||||
set data [sct result]
|
|
||||||
if {[string first ASCERR $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
if {[string first ERR $data] >= 0} {
|
|
||||||
error [translatePMACError $data]
|
|
||||||
}
|
|
||||||
return [string trim $data]
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc sendpmacread {code} {
|
|
||||||
sct send $code
|
|
||||||
return pmacreadreply
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacreadreply {} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
} else {
|
|
||||||
sct update $data
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc sendpmaclim {code} {
|
|
||||||
sct send $code
|
|
||||||
return pmacreadlim
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc pmacreadlim {motname} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
} else {
|
|
||||||
set scale [hval /sics/${motname}/scale_factor]
|
|
||||||
sct update [expr $data * $scale]
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc sendpmacwrite {code} {
|
|
||||||
set value [sct target]
|
|
||||||
sct send "$code=$value"
|
|
||||||
return pmacwritereply
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacwritereply {} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
sct print "ERROR: $data"
|
|
||||||
} else {
|
|
||||||
set con [sct controller]
|
|
||||||
$con queue [sct] read read
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc configurePMACPar {name par code sct} {
|
|
||||||
set path /sics/$name/$par
|
|
||||||
hsetprop $path read "sendpmacread $code"
|
|
||||||
hsetprop $path pmacreadreply pmacreadreply
|
|
||||||
$sct poll $path 30
|
|
||||||
hsetprop $path write "sendpmacwrite $code"
|
|
||||||
hsetprop $path pmacwritereply pmacwritereply
|
|
||||||
$sct write $path
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc makePMACPar {name par code sct priv} {
|
|
||||||
set path /sics/$name/$par
|
|
||||||
hfactory $path plain $priv float
|
|
||||||
configurePMACPar $name $par $code $sct
|
|
||||||
}
|
|
||||||
#========================== status functions =============================
|
|
||||||
proc pmacsendaxerr {num} {
|
|
||||||
sct send "P${num}01"
|
|
||||||
return rcvaxerr
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacrcvaxerr {motname num} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $motname : $data"
|
|
||||||
sct update error
|
|
||||||
sct geterror $data
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hupdate /sics/$motname/axiserror $data
|
|
||||||
if {$data != 0 } {
|
|
||||||
set err [translateAxisError $data]
|
|
||||||
if {[string first following $err] >= 0} {
|
|
||||||
clientput "WARNING: $motname : $err"
|
|
||||||
sct update poserror
|
|
||||||
} else {
|
|
||||||
clientput "ERROR: $motname : $err"
|
|
||||||
sct update error
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hupdate /sics/$motname/axiserror $data
|
|
||||||
sct send "Q${num}10"
|
|
||||||
return rcvpos
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacrcvpos {motname num} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $motname : $data"
|
|
||||||
sct geterror $data
|
|
||||||
sct update error
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hupdate /sics/$motname/hardposition $data
|
|
||||||
sct send "P${num}00"
|
|
||||||
return rcvstat
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacrcvstat {motname num sct} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $motname : $data"
|
|
||||||
sct update error
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
set status [catch {evaluateAxisStatus $data} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct update error
|
|
||||||
} else {
|
|
||||||
sct update $msg
|
|
||||||
switch $msg {
|
|
||||||
idle {
|
|
||||||
# force an update of the motor position
|
|
||||||
$sct queue /sics/$motname/hardposition progress read
|
|
||||||
}
|
|
||||||
run {
|
|
||||||
# force an update of ourselves, while running
|
|
||||||
$sct queue /sics/$motname/status progress read
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc configurePMACStatus {motname num sct} {
|
|
||||||
set path /sics/$motname/status
|
|
||||||
hsetprop $path read "pmacsendaxerr $num"
|
|
||||||
hsetprop $path rcvaxerr "pmacrcvaxerr $motname $num"
|
|
||||||
hsetprop $path rcvpos "pmacrcvpos $motname $num"
|
|
||||||
hsetprop $path rcvstat "pmacrcvstat $motname $num $sct"
|
|
||||||
$sct poll $path 60
|
|
||||||
}
|
|
||||||
#======================= setting hard position ===========================
|
|
||||||
proc pmacsendhardpos {motname num} {
|
|
||||||
hupdate /sics/$motname/status run
|
|
||||||
set value [sct target]
|
|
||||||
sct send [format "P%2.2d23=0 Q%2.2d01=%12.4f M%2.2d=1" $num $num $value $num]
|
|
||||||
return rcvhardpos
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc pmacrcvhardpos {num} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $data"
|
|
||||||
sct seterror $data
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
sct send "P${num}00"
|
|
||||||
return rcvhardax
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc pmacrcvhardax {motname num sct} {
|
|
||||||
set status [catch {checkpmacresult} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $motname : $data"
|
|
||||||
sct seterror $data
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
set status [catch {evaluateAxisStatus $data} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $motname : $msg"
|
|
||||||
sct seterror $msg
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
switch $msg {
|
|
||||||
idle {
|
|
||||||
sct send "P${num}00"
|
|
||||||
return rcvhardax
|
|
||||||
}
|
|
||||||
run {
|
|
||||||
$sct queue /sics/$motname/status progress read
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc configurePMAChardwrite {motname num sct} {
|
|
||||||
set path /sics/$motname/hardposition
|
|
||||||
hsetprop $path write "pmacsendhardpos $motname $num"
|
|
||||||
hsetprop $path rcvhardpos "pmacrcvhardpos $num"
|
|
||||||
hsetprop $path rcvhardax "pmacrcvhardax $motname $num $sct"
|
|
||||||
}
|
|
||||||
#======================= Halt =============================================
|
|
||||||
proc pmacHalt {sct num} {
|
|
||||||
$sct send "M${num}=8" halt
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#==================== Reference Run =======================================
|
|
||||||
proc pmacrefrun {motorname sct num} {
|
|
||||||
set path /sics/${motorname}/status
|
|
||||||
$sct send "M${num}=9"
|
|
||||||
hupdate /sics/${motorname}/status run
|
|
||||||
set motstat run
|
|
||||||
wait 3
|
|
||||||
while {[string compare $motstat run] == 0} {
|
|
||||||
$sct queue $path progress read
|
|
||||||
wait 1
|
|
||||||
set motstat [string trim [hval $path]]
|
|
||||||
}
|
|
||||||
return "Done"
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
proc MakeDeltaTau {name sct num} {
|
|
||||||
MakeSecMotor $name
|
|
||||||
hsetprop /sics/${name}/hardupperlim read "sendpmaclim I${num}13"
|
|
||||||
hsetprop /sics/${name}/hardupperlim pmacreadlim "pmacreadlim $name"
|
|
||||||
$sct poll /sics/${name}/hardupperlim 180
|
|
||||||
hsetprop /sics/${name}/hardlowerlim read "sendpmaclim I${num}14"
|
|
||||||
hsetprop /sics/${name}/hardlowerlim pmacreadlim "pmacreadlim $name"
|
|
||||||
$sct poll /sics/${name}/hardlowerlim 180
|
|
||||||
|
|
||||||
# configurePMACPar $name hardlowerlim "Q${num}09" $sct
|
|
||||||
# configurePMACPar $name hardupperlim "Q${num}08" $sct
|
|
||||||
|
|
||||||
configurePMACPar $name hardposition "Q${num}10" $sct
|
|
||||||
configurePMAChardwrite $name $num $sct
|
|
||||||
hfactory /sics/$name/numinmcu plain internal int
|
|
||||||
hupdate /sics/$name/numinmcu ${num}
|
|
||||||
makePMACPar $name enable "M${num}14" $sct mugger
|
|
||||||
makePMACPar $name scale_factor "Q${num}00" $sct mugger
|
|
||||||
makePMACPar $name maxspeed "Q${num}03" $sct mugger
|
|
||||||
makePMACPar $name commandspeed "Q${num}04" $sct mugger
|
|
||||||
makePMACPar $name maxaccel "Q${num}05" $sct mugger
|
|
||||||
makePMACPar $name commandedaccel "Q${num}06" $sct mugger
|
|
||||||
makePMACPar $name offset "Q${num}07" $sct mugger
|
|
||||||
makePMACPar $name axisstatus "P${num}00" $sct internal
|
|
||||||
makePMACPar $name axiserror "P${num}01" $sct internal
|
|
||||||
makePMACPar $name poshwlimitactive "M${num}21" $sct internal
|
|
||||||
makePMACPar $name neghwlimitactive "M${num}22" $sct internal
|
|
||||||
makePMACPar $name liftaircushion "M${num}96" $sct internal
|
|
||||||
configurePMACStatus $name $num $sct
|
|
||||||
$name makescriptfunc halt "pmacHalt $sct $num" user
|
|
||||||
$name makescriptfunc refrun "pmacrefrun $name $sct $num" user
|
|
||||||
set parlist [list scale_factor hardposition maxspeed \
|
|
||||||
commandspeed maxaccel offset axisstatus axiserror status poshwlimitactive \
|
|
||||||
neghwlimitactive liftaircushion hardlowerlim hardupperlim]
|
|
||||||
# $sct send [format "M%2.2d14=1" $num]
|
|
||||||
foreach par $parlist {
|
|
||||||
$sct queue /sics/$name/$par progress read
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,488 +0,0 @@
|
|||||||
#--------------------------------------------------------
|
|
||||||
# This is a scriptcontext based driver for the EL734
|
|
||||||
# motor controller. This is part of an ongoing effort to
|
|
||||||
# expire older drivers and to consolidate on the new
|
|
||||||
# scriptcontext system.
|
|
||||||
#
|
|
||||||
# Scriptchains:
|
|
||||||
# Rather then having long script chains many of the
|
|
||||||
# intricacies of the EL734 are handled via a command
|
|
||||||
# processing state machine. See the docs below for
|
|
||||||
# details
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, February 2011
|
|
||||||
#--------------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval el734 {}
|
|
||||||
|
|
||||||
#---------------------------------------------------------
|
|
||||||
# The EL734 is a a tricky thing. Some special conditions
|
|
||||||
# apply:
|
|
||||||
# - On emergency stop an *ES is sent. But only the second
|
|
||||||
# response of this kind is valid because there can be
|
|
||||||
# spurious *ES on the line even when the emergency stop
|
|
||||||
# has been released.
|
|
||||||
# - If someone fingers the EL734 or after startup it is in
|
|
||||||
# local mode. Then two commands have to be sent in order to
|
|
||||||
# make it go into remote mode before retrying the command.
|
|
||||||
# - In some echo modes of the controller it sends a echo
|
|
||||||
# of the command. This has to be ignored in order to get at
|
|
||||||
# the real problem
|
|
||||||
#
|
|
||||||
# In order to deal with all this, el734::command is implemented
|
|
||||||
# as a state machine which calls another script when a valid
|
|
||||||
# reponse has actually been found.
|
|
||||||
# The state of the current command processing
|
|
||||||
# is saved in a node property comstate. The actual command to send
|
|
||||||
# is in the property comstring. The script to call if we actually
|
|
||||||
# have a valid response is stored in the property comresponse
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc el734::setcommand {command responsescript {motno 0}} {
|
|
||||||
sct comresponse $responsescript
|
|
||||||
sct comstate start
|
|
||||||
sct comstring $command
|
|
||||||
sct commotno $motno
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
# As implemented now this can go in an endless loop if switching
|
|
||||||
# to local fails repeatedly. TODO: test if this happens with the
|
|
||||||
# real device
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc el734::command {} {
|
|
||||||
set state [sct comstate]
|
|
||||||
switch $state {
|
|
||||||
start {
|
|
||||||
set com [sct comstring]
|
|
||||||
sct send $com
|
|
||||||
sct comstate waitresponse
|
|
||||||
}
|
|
||||||
waitstart {
|
|
||||||
wait 1
|
|
||||||
sct comstate start
|
|
||||||
return [el734::command]
|
|
||||||
}
|
|
||||||
waitresponse {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first "*ES" $reply] >= 0} {
|
|
||||||
set com [sct comstring]
|
|
||||||
sct send $com
|
|
||||||
sct comstate waitES
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
if {[string first "?LOC" $reply] >= 0} {
|
|
||||||
sct send "RMT 1"
|
|
||||||
sct comstate waitrmt
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
if {[string first "?BSY" $reply] >= 0} {
|
|
||||||
set mot [sct commotno]
|
|
||||||
if {$mot != 0} {
|
|
||||||
set com [format "S %d" $mot]
|
|
||||||
} else {
|
|
||||||
set com "S"
|
|
||||||
}
|
|
||||||
sct send $com
|
|
||||||
sct comstate waitstart
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
set com [sct comstring]
|
|
||||||
set idx [string first $com $reply]
|
|
||||||
if {[string first $com $reply] >= 0} {
|
|
||||||
sct send @@NOSEND@@
|
|
||||||
sct comstate waitresponse
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
set responsescript [sct comresponse]
|
|
||||||
return [eval $responsescript]
|
|
||||||
}
|
|
||||||
waitES {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first "*ES" $reply] >= 0} {
|
|
||||||
clientput "Emergency STOP ENGAGED, release to continue"
|
|
||||||
error "Emergency Stop ENGAGED"
|
|
||||||
}
|
|
||||||
set responsescript [sct comresponse]
|
|
||||||
return [eval $responsescript]
|
|
||||||
}
|
|
||||||
waitrmt {
|
|
||||||
sct send "ECHO 0"
|
|
||||||
sct comstate start
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return command
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::checkerror {} {
|
|
||||||
set err(?ADR) "Bad address"
|
|
||||||
set err(?CMD) "Bad command"
|
|
||||||
set err(?PAR) "Bad parameter"
|
|
||||||
set err(?RNG) "Parameter out of range"
|
|
||||||
set err(?BSY) "Motor busy"
|
|
||||||
set err(*MS) "Bad step"
|
|
||||||
set err(*ES) "Emergency stop engaged"
|
|
||||||
|
|
||||||
set reply [string trim [sct result]]
|
|
||||||
set errlist [array names err]
|
|
||||||
foreach entry $errlist {
|
|
||||||
if {[string first $entry $reply] >= 0} {
|
|
||||||
error $err($entry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $reply
|
|
||||||
}
|
|
||||||
#========================== Position ===============================
|
|
||||||
proc el734::readpos {num} {
|
|
||||||
set com [format "u %d" $num]
|
|
||||||
return [el734::setcommand $com el734::posresponse]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::posresponse {} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
sct update $reply
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setpos {name num} {
|
|
||||||
set newpos [sct target]
|
|
||||||
set com [format "p %d %f" $num $newpos]
|
|
||||||
hupdate /sics/${name}/status run
|
|
||||||
hupdate /sics/${name}/oredmsr 3
|
|
||||||
hupdate /sics/${name}/runfault 0
|
|
||||||
hupdate /sics/${name}/posfault 0
|
|
||||||
return [el734::setcommand $com "el734::setposresponse $name"]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setposresponse {name} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
[sct controller] queue /sics/${name}/status progress read
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#===================== Limits =====================================
|
|
||||||
proc el734::getlim {name num} {
|
|
||||||
set com [format "H %d" $num]
|
|
||||||
return [el734::setcommand $com "el734::limresponse $name"]
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------
|
|
||||||
proc el734::limresponse {name} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
stscan $reply "%f %f" low high
|
|
||||||
hupdate /sics/${name}/hardlowerlim $low
|
|
||||||
hupdate /sics/${name}/hardupperlim $high
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc el734::setlim {controller name num low high} {
|
|
||||||
set com [format "H %d %f %f" $num $low $high]
|
|
||||||
$controller send $com
|
|
||||||
$controller queue /sics/${name}/hardlowerlim progress read
|
|
||||||
wait 1
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#======================== status ================================
|
|
||||||
proc el734::decodemsr {name msr} {
|
|
||||||
set oredata(0x02) idle:none
|
|
||||||
set oredata(0x10) error:lowlim
|
|
||||||
set oredata(0x20) error:hilim
|
|
||||||
set oredata(0x80) posfault:runfault
|
|
||||||
set oredata(0x200) posfault:posfault
|
|
||||||
set oredata(0x1000) "error:air cushion"
|
|
||||||
set oredata(0x40) "error:bad step"
|
|
||||||
set oredata(0x100) error:positionfault
|
|
||||||
set oredata(0x400) error:positionfault
|
|
||||||
|
|
||||||
set msrdata(0x20) hilim
|
|
||||||
set msrdata(0x10) lowlim
|
|
||||||
set msrdata(0x1000) "air cushion"
|
|
||||||
set msrdata(0x40) "Bad step"
|
|
||||||
set msrdata(0x100) posfault
|
|
||||||
set msrdata(0x400) posfault
|
|
||||||
|
|
||||||
set oredmsr [hval /sics/${name}/oredmsr]
|
|
||||||
if {$msr == 0} {
|
|
||||||
#-------- FINISHED
|
|
||||||
set pos [hval /sics/${name}/posfault]
|
|
||||||
set run [hval /sics/${name}/runfault]
|
|
||||||
if {$pos > 0 || $run > 0} {
|
|
||||||
return posfault
|
|
||||||
}
|
|
||||||
|
|
||||||
set orlist [array names oredata]
|
|
||||||
foreach code $orlist {
|
|
||||||
if {$oredmsr & $code} {
|
|
||||||
set l [split $oredata($code) :]
|
|
||||||
set txt [lindex $l 1]
|
|
||||||
set ret [lindex $l 0]
|
|
||||||
hupdate /sics/${name}/lasterror $txt
|
|
||||||
if {[string compare $ret error] == 0} {
|
|
||||||
clientput "ERROR: $txt on motor $name"
|
|
||||||
}
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$oredmsr == 0} {
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#------------ Still Running.........
|
|
||||||
set msrlist [array names msrdata]
|
|
||||||
foreach code $msrlist {
|
|
||||||
if {$msr & $code} {
|
|
||||||
clientput "ERROR: $msrdata($code) on motor $name"
|
|
||||||
return error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$msr & 0x80} {
|
|
||||||
set val [hval /sics/${name}/runfault]
|
|
||||||
incr val
|
|
||||||
hupdate /sics/${name}/runfault $val
|
|
||||||
}
|
|
||||||
if {$msr & 0x200} {
|
|
||||||
set val [hval /sics/${name}/posfault]
|
|
||||||
incr val
|
|
||||||
hupdate /sics/${name}/posfault $val
|
|
||||||
}
|
|
||||||
|
|
||||||
hupdate /sics/${name}/oredmsr [expr $oredmsr | $msr]
|
|
||||||
return run
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc el734::readstatus {num name} {
|
|
||||||
set com [format "msr %d" $num]
|
|
||||||
return [el734::setcommand $com "el734::statresponse $name $num"]
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc el734::statresponse {name num} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
stscan $reply "%d" msr
|
|
||||||
set status [el734::decodemsr $name $msr]
|
|
||||||
sct update $status
|
|
||||||
switch $status {
|
|
||||||
run {
|
|
||||||
set con [sct controller]
|
|
||||||
$con queue /sics/${name}/hardposition progress read
|
|
||||||
$con queue /sics/${name}/status progress read
|
|
||||||
}
|
|
||||||
idle {
|
|
||||||
set com [format "u %d" $num]
|
|
||||||
return [el734::setcommand $com "el734::posstat $name" ]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc el734::posstat {name} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
hupdate /sics/${name}/hardposition $reply
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#========================== Halt =================================
|
|
||||||
proc el734::halt {controller no} {
|
|
||||||
set com [format "S %d" $no]
|
|
||||||
$controller send $com
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#========================= Speed ================================
|
|
||||||
proc el734::readspeed {num} {
|
|
||||||
set com [format "J %d" $num]
|
|
||||||
return [el734::setcommand $com el734::speedresponse]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::speedresponse {} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
sct update $reply
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setspeed {name num} {
|
|
||||||
set newpos [sct target]
|
|
||||||
set com [format "J %d %d" $num $newpos]
|
|
||||||
return [el734::setcommand $com "el734::setspeedresponse $name $num"]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setspeedresponse {name num} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
return [el734::readspeed $num]
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#========================= refnull ================================
|
|
||||||
proc el734::readref {num} {
|
|
||||||
set com [format "V %d" $num]
|
|
||||||
return [el734::setcommand $com el734::refresponse]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::refresponse {} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
sct update $reply
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setref {name num} {
|
|
||||||
set newpos [sct target]
|
|
||||||
set com [format "V %d %d" $num $newpos]
|
|
||||||
return [el734::setcommand $com "el734::setrefresponse $name $num"]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc el734::setrefresponse {name num} {
|
|
||||||
set stat [catch {checkerror} reply]
|
|
||||||
if {$stat == 0} {
|
|
||||||
return [el734::readref $num]
|
|
||||||
} else {
|
|
||||||
clientput $reply
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#============================= SS =================================
|
|
||||||
proc el734::readss {num} {
|
|
||||||
set com [format "SS %d" $num]
|
|
||||||
sct send $com
|
|
||||||
return ssread
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------
|
|
||||||
proc el734::ssread {} {
|
|
||||||
sct update [sct result]
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#======================== setpos ================================
|
|
||||||
proc el734::forcepos {controller name num newpos} {
|
|
||||||
set com [format "U %d %f" $num $newpos]
|
|
||||||
$controller send $com
|
|
||||||
$controller queue /sics/${name}/hardposition progress read
|
|
||||||
wait 1
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#======================= refrun ==================================
|
|
||||||
proc el734::refrun {controller name num} {
|
|
||||||
clientput "Starting reference run"
|
|
||||||
$controller send [format "R %d" $num]
|
|
||||||
$controller queue /sics/${name}/ss progress read
|
|
||||||
while {1} {
|
|
||||||
wait 2
|
|
||||||
set ss [hval /sics/${name}/ss]
|
|
||||||
if { [string first ?BSY $ss] < 0} {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
set rupt [getint]
|
|
||||||
if { [string compare $rupt continue] != 0} {
|
|
||||||
error "Refererence run interrupted"
|
|
||||||
}
|
|
||||||
$controller queue /sics/${name}/ss progress read
|
|
||||||
}
|
|
||||||
$controller queue /sics/${name}/hardposition progress read
|
|
||||||
wait 2
|
|
||||||
return "Reference run Finished"
|
|
||||||
}
|
|
||||||
#================================================================
|
|
||||||
proc el734::reset {name} {
|
|
||||||
set x [hval /sics/${name}/hardlowerlim]
|
|
||||||
hupdate /sics/${name}/softlowerlim $x
|
|
||||||
set x [hval /sics/${name}/hardupperlim]
|
|
||||||
hupdate /sics/${name}/softupperlim $x
|
|
||||||
hupdate /sics/${name}/softzero 0
|
|
||||||
hupdate /sics/${name}/fixed -1
|
|
||||||
}
|
|
||||||
#========================= Make ==================================
|
|
||||||
proc el734::make {name no controller} {
|
|
||||||
MakeSecMotor $name
|
|
||||||
|
|
||||||
hfactory /sics/${name}/oredmsr plain internal int
|
|
||||||
hfactory /sics/${name}/runfault plain internal int
|
|
||||||
hfactory /sics/${name}/posfault plain internal int
|
|
||||||
hfactory /sics/${name}/lasterror plain internal text
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition read el734::readpos $no
|
|
||||||
hsetprop /sics/${name}/hardposition command el734::command
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition write el734::setpos $name $no
|
|
||||||
hsetprop /sics/${name}/hardposition command el734::command
|
|
||||||
$controller write /sics/${name}/hardposition
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardlowerlim read el734::getlim $name $no
|
|
||||||
hsetprop /sics/${name}/hardlowerlim command el734::command
|
|
||||||
$controller poll /sics/${name}/hardlowerlim 120
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/status read el734::readstatus $no $name
|
|
||||||
hsetprop /sics/${name}/status command el734::command
|
|
||||||
$controller poll /sics/${name}/status 40
|
|
||||||
|
|
||||||
hfactory /sics/${name}/speed plain user int
|
|
||||||
hsetprop /sics/${name}/speed read el734::readspeed $no
|
|
||||||
hsetprop /sics/${name}/speed command el734::command
|
|
||||||
$controller poll /sics/${name}/speed 120
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/speed write el734::setspeed $name $no
|
|
||||||
hsetprop /sics/${name}/speed command el734::command
|
|
||||||
$controller write /sics/${name}/speed
|
|
||||||
|
|
||||||
$name makescriptfunc halt "el734::halt $controller $no" user
|
|
||||||
$name makescriptfunc reset "el734::reset $name" user
|
|
||||||
|
|
||||||
$name makescriptfunc sethardlim "el734::setlim $controller $name $no" mugger
|
|
||||||
hfactory /sics/${name}/sethardlim/low plain mugger float
|
|
||||||
hfactory /sics/${name}/sethardlim/high plain mugger float
|
|
||||||
|
|
||||||
hfactory /sics/${name}/motno plain internal int
|
|
||||||
hupdate /sics/${name}/motno $no
|
|
||||||
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
proc el734::addrefstuff {name no controller} {
|
|
||||||
hfactory /sics/${name}/refnull plain user int
|
|
||||||
hsetprop /sics/${name}/refnull read el734::readref $no
|
|
||||||
hsetprop /sics/${name}/refnull command el734::command
|
|
||||||
$controller poll /sics/${name}/refnull 300
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/refnull write el734::setref $name $no
|
|
||||||
hsetprop /sics/${name}/refnull command el734::command
|
|
||||||
$controller write /sics/${name}/refnull
|
|
||||||
|
|
||||||
hfactory /sics/${name}/ss plain internal text
|
|
||||||
hsetprop /sics/${name}/ss read el734::readss $no
|
|
||||||
hsetprop /sics/${name}/ss ssread el734::ssread
|
|
||||||
$controller poll /sics/${name}/ss 300
|
|
||||||
|
|
||||||
$name makescriptfunc refrun "el734::refrun $controller $name $no" user
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,321 +0,0 @@
|
|||||||
#-----------------------------------------------------
|
|
||||||
# This is a second generation counter driver for
|
|
||||||
# the PSI EL737 counter boxes using scriptcontext
|
|
||||||
# communication.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Scriptchains:
|
|
||||||
# start: el737sendstart - el737cmdreply
|
|
||||||
# pause,cont, stop: el737sendcmd - el737cmdreply
|
|
||||||
# status: el737readstatus - el737status
|
|
||||||
# \ el737statval - el737statread
|
|
||||||
# values: el737readvalues - el737val
|
|
||||||
# threshold write: el737threshsend - el737threshrcv - el737cmdreply
|
|
||||||
#
|
|
||||||
# Mark Koennecke, February 2009
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc el737error {reply} {
|
|
||||||
if {[string first ERR $reply] >= 0} {
|
|
||||||
error $reply
|
|
||||||
}
|
|
||||||
if {[string first ? $reply] < 0} {
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
if {[string first "?OV" $reply] >= 0} {
|
|
||||||
error overflow
|
|
||||||
}
|
|
||||||
if {[string first "?1" $reply] >= 0} {
|
|
||||||
error "out of range"
|
|
||||||
}
|
|
||||||
if {[string first "?2" $reply] >= 0} {
|
|
||||||
error "bad command"
|
|
||||||
}
|
|
||||||
if {[string first "?3" $reply] >= 0} {
|
|
||||||
error "bad parameter"
|
|
||||||
}
|
|
||||||
if {[string first "?4" $reply] >= 0} {
|
|
||||||
error "bad counter"
|
|
||||||
}
|
|
||||||
if {[string first "?5" $reply] >= 0} {
|
|
||||||
error "parameter missing"
|
|
||||||
}
|
|
||||||
if {[string first "?6" $reply] >= 0} {
|
|
||||||
error "to many counts"
|
|
||||||
}
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc el737cmdreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {el737error $reply} err]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $err
|
|
||||||
set data [sct send]
|
|
||||||
if {[string first overflow $err] >= 0} {
|
|
||||||
clientput "WARNING: trying to fix $err on command = $data"
|
|
||||||
sct send $data
|
|
||||||
return el737cmdreply
|
|
||||||
} else {
|
|
||||||
clientput "ERROR: $err, command = $data"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc sctroot {} {
|
|
||||||
set path [sct]
|
|
||||||
return [file dirname $path]
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc el737sendstart {} {
|
|
||||||
set obj [sctroot]
|
|
||||||
set mode [string tolower [string trim [hval $obj/mode]]]
|
|
||||||
set preset [string trim [hval $obj/preset]]
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
switch $mode {
|
|
||||||
timer {
|
|
||||||
set cmd [format "TP %.2f" $preset]
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
set cmd [format "MP %d" [expr int($preset)]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sct send $cmd
|
|
||||||
set con [sct controller]
|
|
||||||
$con queue $obj/status progress read
|
|
||||||
catch {hupdate $obj/status run}
|
|
||||||
catch {hupdate $obj/values 0 0 0 0 0 0 0 0}
|
|
||||||
return el737cmdreply
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc el737sendcmd {cmd} {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
sct send $cmd
|
|
||||||
return el737cmdreply
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc el737control {} {
|
|
||||||
set target [sct target]
|
|
||||||
switch $target {
|
|
||||||
1000 {return [el737sendstart] }
|
|
||||||
1001 {return [el737sendcmd S] }
|
|
||||||
1002 {return [el737sendcmd PS] }
|
|
||||||
1003 {return [el737sendcmd CO] }
|
|
||||||
default {
|
|
||||||
sct print "ERROR: bad start target $target given to control"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc el737readstatus {} {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
sct send RS
|
|
||||||
return el737status
|
|
||||||
}
|
|
||||||
#-------------------------------------------------
|
|
||||||
proc el737statval {} {
|
|
||||||
el737readvalues
|
|
||||||
return el737statread
|
|
||||||
}
|
|
||||||
#-------------------------------------------------
|
|
||||||
proc el737statread {} {
|
|
||||||
el737val
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#--------------------------------------------------
|
|
||||||
proc el737status {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {el737error $reply} err]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $err
|
|
||||||
sct update error
|
|
||||||
sct print "ERROR: $err"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
set path [sct]
|
|
||||||
set con [sct controller]
|
|
||||||
hupdate [sctroot]/RS $reply
|
|
||||||
switch [string trim $reply] {
|
|
||||||
0 {
|
|
||||||
return el737statval
|
|
||||||
}
|
|
||||||
1 -
|
|
||||||
2 {
|
|
||||||
sct update run
|
|
||||||
$con queue $path progress read
|
|
||||||
}
|
|
||||||
5 -
|
|
||||||
6 {
|
|
||||||
sct update nobeam
|
|
||||||
$con queue $path progress read
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
sct update pause
|
|
||||||
$con queue $path progress read
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set count [sct moncount]
|
|
||||||
if {$count >= 10} {
|
|
||||||
set root [sctroot]
|
|
||||||
$con queue $root/values progress read
|
|
||||||
sct moncount 0
|
|
||||||
} else {
|
|
||||||
incr count
|
|
||||||
sct moncount $count
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------
|
|
||||||
proc el737readvalues {} {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
sct send RA
|
|
||||||
return el737val
|
|
||||||
}
|
|
||||||
#--------------------------------------------------
|
|
||||||
proc swapFirst {l} {
|
|
||||||
set m1 [lindex $l 0]
|
|
||||||
set cts [lindex $l 1]
|
|
||||||
lappend res $cts $m1
|
|
||||||
for {set i 2} {$i < [llength $l]} {incr i} {
|
|
||||||
lappend res [lindex $l $i]
|
|
||||||
}
|
|
||||||
return $res
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
# There are two types of reponses to the RA command:
|
|
||||||
# the old form with 5 values and the new one
|
|
||||||
# with 9 values
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc el737val {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {el737error $reply} err]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $err
|
|
||||||
sct print "ERROR: $err"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hupdate [sctroot]/RA $reply
|
|
||||||
set l [split $reply]
|
|
||||||
set root [sctroot]
|
|
||||||
if {[llength $l] > 5} {
|
|
||||||
set l2 [lrange $l 1 end]
|
|
||||||
set l2 [swapFirst $l2]
|
|
||||||
catch {hupdate ${root}/values [join $l2]}
|
|
||||||
catch {set time [lindex $l 0]}
|
|
||||||
catch {hupdate ${root}/time $time}
|
|
||||||
} else {
|
|
||||||
set last [expr [llength $l] - 1]
|
|
||||||
set l2 [lrange $l 0 $last]
|
|
||||||
set l2 [swapFirst $l2]
|
|
||||||
hupdate ${root}/values [join $l2]
|
|
||||||
set time [lindex $l $last]
|
|
||||||
hupdate ${root}/time $time
|
|
||||||
}
|
|
||||||
set mode [hval ${root}/mode]
|
|
||||||
switch $mode {
|
|
||||||
timer {
|
|
||||||
hupdate ${root}/control $time
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
set mon [lindex $l2 1]
|
|
||||||
hupdate ${root}/control $time
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#----------------------------------------------
|
|
||||||
proc el737threshsend {} {
|
|
||||||
set val [string trim [sct target]]
|
|
||||||
set root [sctroot]
|
|
||||||
set cter [string trim [hval $root/thresholdcounter]]
|
|
||||||
sct send [format "DL %1.1d %f" $cter $val]
|
|
||||||
return el737threshrecv
|
|
||||||
}
|
|
||||||
#---------------------------------------------
|
|
||||||
proc el737threshrecv {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {el737error $reply} err]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $err
|
|
||||||
sct print "ERROR: $err"
|
|
||||||
}
|
|
||||||
set root [sctroot]
|
|
||||||
set cter [string trim [hval $root/thresholdcounter]]
|
|
||||||
sct send [format "DR %1.1d" $cter]
|
|
||||||
set sctcon [sct controller]
|
|
||||||
$sctcon queue [sct] progress read
|
|
||||||
return el737cmdreply
|
|
||||||
}
|
|
||||||
#---------------------------------------------
|
|
||||||
proc el737threshread {} {
|
|
||||||
set root [sctroot]
|
|
||||||
set cter [string trim [hval $root/thresholdcounter]]
|
|
||||||
sct send [format "DL %1.1d" $cter]
|
|
||||||
return el737thresh
|
|
||||||
}
|
|
||||||
#----------------------------------------------
|
|
||||||
proc el737thresh {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {el737error $reply} err]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $err
|
|
||||||
sct print "ERROR: $err"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
stscan $reply "%f" val
|
|
||||||
sct update $val
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#----------------------------------------------
|
|
||||||
proc el737func {controller path} {
|
|
||||||
$controller queue $path write
|
|
||||||
}
|
|
||||||
#============================================
|
|
||||||
proc MakeSecEL737 {name netaddr} {
|
|
||||||
MakeSecCounter $name 8
|
|
||||||
set conname ${name}sct
|
|
||||||
makesctcontroller $conname std $netaddr "\r" 10
|
|
||||||
$conname send "RMT 1"
|
|
||||||
$conname send "RMT 1"
|
|
||||||
$conname send "ECHO 2"
|
|
||||||
|
|
||||||
set path /sics/${name}/values
|
|
||||||
hsetprop $path read el737readvalues
|
|
||||||
hsetprop $path el737val el737val
|
|
||||||
$conname poll $path 60
|
|
||||||
|
|
||||||
set path /sics/${name}/status
|
|
||||||
hsetprop $path read el737readstatus
|
|
||||||
hsetprop $path el737status el737status
|
|
||||||
hsetprop $path el737statval el737statval
|
|
||||||
hsetprop $path el737statread el737statread
|
|
||||||
hsetprop $path moncount 0
|
|
||||||
$conname poll $path 60
|
|
||||||
|
|
||||||
set path /sics/${name}/control
|
|
||||||
hsetprop $path write el737control
|
|
||||||
hsetprop $path el737cmdreply el737cmdreply
|
|
||||||
$conname write $path
|
|
||||||
|
|
||||||
hfactory /sics/${name}/thresholdcounter plain mugger int
|
|
||||||
hsetprop /sics/${name}/thresholdcounter __save true
|
|
||||||
set path /sics/${name}/threshold
|
|
||||||
hfactory $path plain mugger float
|
|
||||||
hsetprop $path write el737threshsend
|
|
||||||
hsetprop $path el737threshrcv el737threshrcv
|
|
||||||
hsetprop $path el737cmdreply el737cmdreply
|
|
||||||
$conname write $path
|
|
||||||
hsetprop $path read el737threshread
|
|
||||||
hsetprop $path el737thresh el737thresh
|
|
||||||
# $conname poll $path 60
|
|
||||||
|
|
||||||
hfactory /sics/${name}/RS plain internal int
|
|
||||||
hfactory /sics/${name}/RA plain internal intvarar 8
|
|
||||||
|
|
||||||
$conname debug -1
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
#-------------------------------------------------------------
|
|
||||||
# This is a scriptcontext driver for the PSI EL755 magnet
|
|
||||||
# controller.
|
|
||||||
#
|
|
||||||
# scriptchains:
|
|
||||||
# read - readreply
|
|
||||||
# write - writereply - writereadback
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, November 2009
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval el755 {}
|
|
||||||
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc el755::read {num} {
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc el755::readreply {num} {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first ? $reply] >= 0} {
|
|
||||||
if {[string first ?OV $reply] >= 0} {
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
# clientput "EL755 did an overflow...."
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
error $reply
|
|
||||||
}
|
|
||||||
set n [stscan $reply "%f %f" soll ist]
|
|
||||||
if {$n < 2} {
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
clientput "Invalid response $reply from EL755"
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
sct update $ist
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc el755::write {num} {
|
|
||||||
set cur [sct target]
|
|
||||||
sct send [format "I %d %f" $num $cur]
|
|
||||||
return writereply
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc el755::writereply {num} {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first ? $reply] >= 0} {
|
|
||||||
if {[string first ?OV $reply] >= 0} {
|
|
||||||
set cur [sct target]
|
|
||||||
sct send [format "I %d %f" $num $cur]
|
|
||||||
# clientput "EL755 did an overflow...."
|
|
||||||
return writereply
|
|
||||||
}
|
|
||||||
error $reply
|
|
||||||
}
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
return writereadback
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc el755::writereadback {num} {
|
|
||||||
set reply [sct result]
|
|
||||||
if {[string first ? $reply] >= 0} {
|
|
||||||
if {[string first ?OV $reply] >= 0} {
|
|
||||||
set cur [sct target]
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
# clientput "EL755 did an overflow...."
|
|
||||||
return writereadback
|
|
||||||
}
|
|
||||||
error $reply
|
|
||||||
}
|
|
||||||
set n [stscan $reply "%f %f" soll ist]
|
|
||||||
if {$n < 2} {
|
|
||||||
sct send [format "I %d" $num]
|
|
||||||
clientput "Invalid response $reply from EL755"
|
|
||||||
return writereadback
|
|
||||||
}
|
|
||||||
set cur [sct target]
|
|
||||||
if {abs($cur - $soll) < .1} {
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
return el755::write $num
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc el755::makeel755 {name num sct} {
|
|
||||||
stddrive::makestddrive $name EL755Magnet $sct
|
|
||||||
set path /sics/${name}
|
|
||||||
hsetprop $path read el755::read $num
|
|
||||||
hsetprop $path readreply el755::readreply $num
|
|
||||||
hsetprop $path write el755::write $num
|
|
||||||
hsetprop $path writereply el755::writereply $num
|
|
||||||
hsetprop $path writereadback el755::writereadback $num
|
|
||||||
$sct poll $path 60
|
|
||||||
$sct write $path
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,944 +0,0 @@
|
|||||||
#-----------------------------------------------------------------------
|
|
||||||
# This is a collection of utility procedures to help with Hipadaba and
|
|
||||||
# Gumtree Swiss Edition. This file is supposed to be sourced by any
|
|
||||||
# instrument using Hipadaba.
|
|
||||||
#
|
|
||||||
# Copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Collected from various files: Mark Koennecke, March 2008
|
|
||||||
#
|
|
||||||
# Requirements:
|
|
||||||
# * the internal scan command xxxscan
|
|
||||||
# * scan data to live /graphics/scan_data
|
|
||||||
#
|
|
||||||
# Many updates, till November 2008, Mark Koennecke
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
if { [info exists hdbinit] == 0 } {
|
|
||||||
set hdbinit 1
|
|
||||||
MakeStateMon
|
|
||||||
Publish getgumtreexml Spy
|
|
||||||
if {[string first tmp $home] < 0} {
|
|
||||||
set tmppath $home/tmp
|
|
||||||
} else {
|
|
||||||
set tmppath $home
|
|
||||||
}
|
|
||||||
Publish mgbatch Spy
|
|
||||||
Publish loadmgbatch Spy
|
|
||||||
Publish hsearchprop Spy
|
|
||||||
Publish hdbscan User
|
|
||||||
Publish hdbprepare User
|
|
||||||
Publish hdbcollect User
|
|
||||||
Publish listbatchfiles Spy
|
|
||||||
Publish makemumopos User
|
|
||||||
Publish dropmumo User
|
|
||||||
Publish hdbbatchpath User
|
|
||||||
Publish cscan User
|
|
||||||
Publish sscan User
|
|
||||||
Publish scan Spy
|
|
||||||
Publish hmake Mugger
|
|
||||||
Publish hmakescript Mugger
|
|
||||||
Publish hlink Mugger
|
|
||||||
Publish hcommand Mugger
|
|
||||||
Publish hdbstorenexus User
|
|
||||||
Publish scaninfo Spy
|
|
||||||
}
|
|
||||||
#===================================================================
|
|
||||||
# Configuration commands provided:
|
|
||||||
# hdbReadOnly
|
|
||||||
# makesampleenv path
|
|
||||||
# makestdscan path
|
|
||||||
# makestdscangraphics path
|
|
||||||
# makestdbatch
|
|
||||||
# makeQuickPar name path
|
|
||||||
# makeslit path left right upper lower
|
|
||||||
# configures a slit. Missing motors can be indicated with NONE
|
|
||||||
# makestdadmin
|
|
||||||
# makecount path
|
|
||||||
# makerepeat path
|
|
||||||
# makekillfile path
|
|
||||||
# makesuccess path
|
|
||||||
# makestdgui
|
|
||||||
# makewait path
|
|
||||||
# makeevproxy rootpath hdbname devicename
|
|
||||||
# makemumo rootpath mumoname
|
|
||||||
# makeexe
|
|
||||||
# confnxhdb path alias pass
|
|
||||||
# makestddrive path
|
|
||||||
#===================== hfactory adapters ==========================
|
|
||||||
proc hmake {path priv type {len 1}} {
|
|
||||||
hfactory $path plain $priv $type $len
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc hmakescript {path readscript writescript type {len 1}} {
|
|
||||||
hfactory $path script $readscript $writescript $type $len
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc hlink {path obj {treename NONE} } {
|
|
||||||
if {[string equal $treename NONE]} {
|
|
||||||
set treename $ob
|
|
||||||
}
|
|
||||||
append realpath $path / $treename
|
|
||||||
hfactory $realpath link $obj
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc hcommand {path script} {
|
|
||||||
hfactory $path command $script
|
|
||||||
}
|
|
||||||
#================ make XML tree =====================================
|
|
||||||
proc getdataType {path} {
|
|
||||||
return [lindex [split [hinfo $path] ,] 0]
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc makeInitValue {path type prefix} {
|
|
||||||
append result ""
|
|
||||||
if {[string compare $type none] != 0 && [string compare $type func] != 0} {
|
|
||||||
set test [catch {hgetprop $path transfer} msg]
|
|
||||||
set tst [catch {hval $path} val]
|
|
||||||
if {$test != 0 && $tst == 0} {
|
|
||||||
append result "$prefix <initValue>\n"
|
|
||||||
append result "$prefix $val\n"
|
|
||||||
append result "$prefix </initValue>\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc make_nodes {path result indent} {
|
|
||||||
set nodename [file tail $path];
|
|
||||||
set type [getdataType $path]
|
|
||||||
set prefix [string repeat " " $indent]
|
|
||||||
set newIndent [expr $indent + 2]
|
|
||||||
#array set prop_list [ string trim [join [split [hlistprop $path] =]] ]
|
|
||||||
set prop_list(control) true
|
|
||||||
set we_have_control [info exists prop_list(control)]
|
|
||||||
if {$we_have_control == 0 || $we_have_control && $prop_list(control) == "true"} {
|
|
||||||
append result "$prefix<component id=\"$nodename\" dataType=\"$type\">\n"
|
|
||||||
foreach p [property_elements $path $newIndent] {
|
|
||||||
append result $p
|
|
||||||
}
|
|
||||||
foreach x [hlist $path] {
|
|
||||||
set result [make_nodes [string map {// /} "$path/$x"] $result $newIndent]
|
|
||||||
}
|
|
||||||
# append result [makeInitValue $path $type $prefix]
|
|
||||||
append result "$prefix</component>\n"
|
|
||||||
}
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc property_elements_old {path indent} {
|
|
||||||
set prefix [string repeat " " $indent]
|
|
||||||
foreach {key value} [string map {= " "} [hlistprop $path]] {
|
|
||||||
if {[string compare -nocase $key "control"] == 0} {continue}
|
|
||||||
lappend proplist "$prefix<property id=\"$key\">\n"
|
|
||||||
# foreach v [split $value ,] {
|
|
||||||
# lappend proplist "$prefix$prefix<value>$v</value>\n"
|
|
||||||
# }
|
|
||||||
lappend proplist "$prefix$prefix<value>$value</value>\n"
|
|
||||||
lappend proplist "$prefix</property>\n"
|
|
||||||
}
|
|
||||||
if [info exists proplist] {return $proplist}
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc property_elements {path indent} {
|
|
||||||
set prefix [string repeat " " $indent]
|
|
||||||
set data [hlistprop $path]
|
|
||||||
set propList [split $data \n]
|
|
||||||
foreach prop $propList {
|
|
||||||
set pl [split $prop =]
|
|
||||||
set key [string trim [lindex $pl 0]]
|
|
||||||
set value [string trim [lindex $pl 1]]
|
|
||||||
if {[string length $key] < 1} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
lappend proplist "$prefix<property id=\"$key\">\n"
|
|
||||||
lappend proplist "$prefix$prefix<value>$value</value>\n"
|
|
||||||
lappend proplist "$prefix</property>\n"
|
|
||||||
}
|
|
||||||
if [info exists proplist] {return $proplist}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
proc getgumtreexml {path} {
|
|
||||||
append result "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
|
|
||||||
append result "<hipadaba:SICS xmlns:hipadaba=\"http://www.psi.ch/sics/hipadaba\" >\n"
|
|
||||||
|
|
||||||
if {[string compare $path "/" ] == 0} {
|
|
||||||
foreach n [hlist $path] {
|
|
||||||
set result [make_nodes /$n $result 2]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach n [hlist $path] {
|
|
||||||
set result [make_nodes $path/$n $result 2]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
append result "</hipadaba:SICS>\n"
|
|
||||||
}
|
|
||||||
#==================== Gumtree batch =========================================
|
|
||||||
proc searchPathForDrivable {name} {
|
|
||||||
set path [string trim [hmatchprop / sicsdev $name]]
|
|
||||||
if {[string compare $path NONE] != 0} {
|
|
||||||
return $path
|
|
||||||
}
|
|
||||||
set txt [findalias $name]
|
|
||||||
if {[string compare $txt NONE] == 0} {
|
|
||||||
return NONE
|
|
||||||
}
|
|
||||||
set l1 [split $txt =]
|
|
||||||
set l [split [lindex $l1 1] ,]
|
|
||||||
foreach alias $l {
|
|
||||||
set alias [string trim $alias]
|
|
||||||
set path [string trim [hmatchprop / sicsdev $alias]]
|
|
||||||
if {[string compare $path NONE] != 0} {
|
|
||||||
return $path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NONE
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc searchForCommand {name} {
|
|
||||||
return [string trim [hmatchprop / sicscommand $name]]
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc treatsscan {scanpath command out} {
|
|
||||||
set l [split $command]
|
|
||||||
set len [llength $l]
|
|
||||||
set noVar [expr ($len-2)/3]
|
|
||||||
set np [lindex $l [expr $len -2]]
|
|
||||||
set preset [lindex $l [expr $len -1]]
|
|
||||||
for {set i 0} {$i < $noVar} {incr i} {
|
|
||||||
set start [expr $i * 3]
|
|
||||||
set scanVar [lindex $l [expr 1 + $start]]
|
|
||||||
set scanStart [lindex $l [expr 2 + $start]]
|
|
||||||
set scanEnd [lindex $l [expr 3 + $start]]
|
|
||||||
set scanStep [expr ($scanEnd*1. - $scanStart*1.)/$np*1.]
|
|
||||||
append hdbVar $scanVar ,
|
|
||||||
append hdbStart $scanStart ,
|
|
||||||
append hdbStep $scanStep ,
|
|
||||||
}
|
|
||||||
set hdbVar [string trim $hdbVar ,]
|
|
||||||
set hdbStart [string trim $hdbStart ,]
|
|
||||||
set hdbStep [string trim $hdbStep ,]
|
|
||||||
puts $out "\#NODE: $scanpath"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
puts $out "hdbscan $hdbVar $hdbStart $hdbStep $np monitor $preset"
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc treatcscan {scanpath command out} {
|
|
||||||
set l [split $command]
|
|
||||||
set scanVar [lindex $l 1]
|
|
||||||
set scanCenter [lindex $l 2]
|
|
||||||
set scanStep [lindex $l 3]
|
|
||||||
set np [lindex $l 4]
|
|
||||||
set preset [lindex $l 5]
|
|
||||||
set hdbStart [expr $scanCenter - ($np*1.0)/2. * $scanStep*1.0]
|
|
||||||
puts $out "\#NODE: $scanpath"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
puts $out "hdbscan $scanVar $hdbStart $scanStep $np monitor $preset"
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc translateCommand {command out} {
|
|
||||||
set drivelist [list drive dr run]
|
|
||||||
set textList [list for while source if]
|
|
||||||
# clientput "Translating: $command"
|
|
||||||
set command [string trim $command]
|
|
||||||
if {[string length $command] < 2} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set l [split $command]
|
|
||||||
set obj [string trim [lindex $l 0]]
|
|
||||||
#------- check for drive commands
|
|
||||||
set idx [lsearch $drivelist $obj]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set dev [lindex $l 1]
|
|
||||||
set path [searchPathForDrivable $dev]
|
|
||||||
if {[string compare $path NONE] != 0} {
|
|
||||||
set realTxt [hgetprop $path sicsdev]
|
|
||||||
set realL [split $realTxt =]
|
|
||||||
set realDev [lindex $realL 1]
|
|
||||||
set mapList [list $dev $realDev]
|
|
||||||
set newCom [string map $mapList $command]
|
|
||||||
puts $out "\#NODE: $path"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
puts $out $newCom
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------ check for well known broken commands
|
|
||||||
set idx [lsearch $textList $obj]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
puts $out "\#NODE: /batch/commandtext"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
set buffer [string map {\n @nl@} $command]
|
|
||||||
puts $out "hset /batch/commandtext $buffer"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
#--------- check for simple commands
|
|
||||||
set path [searchForCommand $command]
|
|
||||||
if {[string compare $path NONE] != 0} {
|
|
||||||
puts $out "\#NODE: $path"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
puts $out $command
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set scancom [searchForCommand hdbscan]
|
|
||||||
#---------- deal with scans
|
|
||||||
if {[string first sscan $obj] >= 0} {
|
|
||||||
if {[catch {treatsscan $scancom $command $out}] == 0} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {[string first cscan $obj] >= 0} {
|
|
||||||
if {[catch {treatsscan $scancom $command $out}] == 0} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------- give up: output as a text node
|
|
||||||
puts $out "\#NODE: /batch/commandtext"
|
|
||||||
puts $out "clientput BatchPos = 1"
|
|
||||||
set buffer [string map {\n @nl@} $command]
|
|
||||||
puts $out "hset /batch/commandtext $buffer"
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc mgbatch {filename} {
|
|
||||||
global tmppath
|
|
||||||
set f [open $filename r]
|
|
||||||
gets $f line
|
|
||||||
close $f
|
|
||||||
if {[string first MOUNTAINBATCH $line] > 0} {
|
|
||||||
#--------- This is a mountaingum batch file which does not need
|
|
||||||
# to be massaged
|
|
||||||
return $filename
|
|
||||||
}
|
|
||||||
set f [open $filename r]
|
|
||||||
set realfilename [file tail $filename]
|
|
||||||
set out [open $tmppath/$realfilename w]
|
|
||||||
puts $out \#MOUNTAINBATCH
|
|
||||||
while {[gets $f line] >= 0} {
|
|
||||||
append buffer $line
|
|
||||||
if {[info complete $buffer] == 1} {
|
|
||||||
translateCommand $buffer $out
|
|
||||||
unset buffer
|
|
||||||
} else {
|
|
||||||
append buffer \n
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close $out
|
|
||||||
return $tmppath/$realfilename
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc loadmgbatch {filename} {
|
|
||||||
set txt [exe fullpath $filename]
|
|
||||||
set l [split $txt =]
|
|
||||||
set realf [lindex $l 1]
|
|
||||||
set realf [mgbatch $realf]
|
|
||||||
return [exe print $realf]
|
|
||||||
}
|
|
||||||
#============== hdbscan =========================================
|
|
||||||
proc hdbscan {scanvars scanstart scanincr np mode preset} {
|
|
||||||
global stdscangraph hdbscanactive
|
|
||||||
xxxscan clear
|
|
||||||
xxxscan configure script
|
|
||||||
xxxscan function prepare hdbprepare
|
|
||||||
xxxscan function collect hdbcollect
|
|
||||||
set varlist [split $scanvars ,]
|
|
||||||
set startlist [split $scanstart ,]
|
|
||||||
set incrlist [split $scanincr ,]
|
|
||||||
catch {hset $stdscangraph/scan_variable/name [lindex $varlist 0]}
|
|
||||||
set count 0
|
|
||||||
foreach var $varlist {
|
|
||||||
if {[string first / $var] >= 0} {
|
|
||||||
set var [string trim [SplitReply [hgetprop $var sicsdev]]]
|
|
||||||
}
|
|
||||||
xxxscan add $var [lindex $startlist $count] [lindex $incrlist $count]
|
|
||||||
incr count
|
|
||||||
}
|
|
||||||
set hdbscanactive 1
|
|
||||||
set status [catch {xxxscan run $np $mode $preset} msg]
|
|
||||||
set hdbscanactive 0
|
|
||||||
if {$status == 0} {
|
|
||||||
return $msg
|
|
||||||
} else {
|
|
||||||
error $msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
proc hdbprepare {obj userdata } {
|
|
||||||
global stdscangraph
|
|
||||||
stdscan prepare $obj userdata
|
|
||||||
catch {hupdate $stdscangraph/dim}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
proc hdbcollect {obj userobj np} {
|
|
||||||
global stdscangraph
|
|
||||||
stdscan collect $obj $userobj $np
|
|
||||||
catch {hupdate $stdscangraph/scan_variable}
|
|
||||||
catch {hupdate $stdscangraph/counts}
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
proc gethdbscanvardata {no} {
|
|
||||||
set np [string trim [SplitReply [xxxscan np]]]
|
|
||||||
if {$np == 0} {
|
|
||||||
return ".0 .0 .0"
|
|
||||||
}
|
|
||||||
set status [catch {SplitReply [xxxscan getvardata $no]} txt]
|
|
||||||
if {$status == 0} {
|
|
||||||
return [join $txt]
|
|
||||||
} else {
|
|
||||||
return ".0 .0 .0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
proc gethdbscancounts {} {
|
|
||||||
set np [string trim [SplitReply [xxxscan np]]]
|
|
||||||
if {$np == 0} {
|
|
||||||
return "0 0 0"
|
|
||||||
}
|
|
||||||
set status [catch {SplitReply [xxxscan getcounts]} txt]
|
|
||||||
if {$status == 0} {
|
|
||||||
return [join $txt]
|
|
||||||
} else {
|
|
||||||
return "0 0 0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#================= helper to get the list of batch files =================
|
|
||||||
proc listbatchfiles {} {
|
|
||||||
set ext [list *.tcl *.job *.run]
|
|
||||||
set txt [SplitReply [exe batchpath]]
|
|
||||||
set dirlist [split $txt :]
|
|
||||||
set txt [SplitReply [exe syspath]]
|
|
||||||
set dirlist [concat $dirlist [split $txt :]]
|
|
||||||
# clientput $dirlist
|
|
||||||
set result [list ""]
|
|
||||||
foreach dir $dirlist {
|
|
||||||
foreach e $ext {
|
|
||||||
set status [catch {glob [string trim $dir]/$e} filetxt]
|
|
||||||
if {$status == 0} {
|
|
||||||
set filelist [split $filetxt]
|
|
||||||
foreach f $filelist {
|
|
||||||
# clientput "Working at $f"
|
|
||||||
set nam [file tail $f]
|
|
||||||
if { [lsearch $result $nam] < 0} {
|
|
||||||
# clientput "Adding $nam"
|
|
||||||
lappend result $nam
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
# clientput "ERROR: $filetxt"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach bf $result {
|
|
||||||
append resulttxt $bf ,
|
|
||||||
}
|
|
||||||
return [string trim $resulttxt ,]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc hsearchprop {root prop val} {
|
|
||||||
set children [hlist $root]
|
|
||||||
set childlist [split $children \n]
|
|
||||||
if {[llength $childlist] <= 0} {
|
|
||||||
error "No children"
|
|
||||||
}
|
|
||||||
foreach child $childlist {
|
|
||||||
if {[string length $child] < 1} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
catch {hgetprop $root/$child $prop} msg
|
|
||||||
if { [string first ERROR $msg] < 0} {
|
|
||||||
set value [string trim [SplitReply $msg]]
|
|
||||||
if { [string equal -nocase $value $val] == 1} {
|
|
||||||
return $root/$child
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set status [catch {hsearchprop $root/$child $prop $val} node]
|
|
||||||
if {$status == 0} {
|
|
||||||
return $node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
error "Not found"
|
|
||||||
}
|
|
||||||
#============ various utility routines =====================================
|
|
||||||
proc hdbReadOnly args {
|
|
||||||
error "Parameter is READ ONLY"
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc makesampleenv {path} {
|
|
||||||
hfactory $path plain spy none
|
|
||||||
hsetprop $path type graphdata
|
|
||||||
hsetprop $path viewer mountaingumui.TimeSeries
|
|
||||||
hfactory $path/vars plain user text
|
|
||||||
hset $path/vars tomato
|
|
||||||
hfactory $path/rank plain user int
|
|
||||||
hset $path/rank 1
|
|
||||||
hfactory $path/dim plain user intar 1
|
|
||||||
hset $path/dim 300
|
|
||||||
hfactory $path/getdata plain user text
|
|
||||||
hsetprop $path/getdata type logcommand
|
|
||||||
hfactory $path/getdata/2010ttime plain spy text
|
|
||||||
hfactory $path/getdata/2010ime plain spy text
|
|
||||||
}
|
|
||||||
#--------------------------------------------------
|
|
||||||
proc makestdscan {path} {
|
|
||||||
hfactory $path command hdbscan
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path viewer mountaingumui.ScanEditor
|
|
||||||
hsetprop $path priv user
|
|
||||||
hfactory $path/scan_variables plain user text
|
|
||||||
hsetprop $path/scan_variables argtype drivable
|
|
||||||
hfactory $path/scan_start plain user text
|
|
||||||
hfactory $path/scan_increments plain user text
|
|
||||||
hfactory $path/NP plain user int
|
|
||||||
hfactory $path/mode plain user text
|
|
||||||
hsetprop $path/mode values "monitor,timer"
|
|
||||||
hfactory $path/preset plain user float
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc makestdscangraphics {path} {
|
|
||||||
global stdscangraph
|
|
||||||
|
|
||||||
set stdscangraph $path
|
|
||||||
|
|
||||||
hfactory $path plain spy none
|
|
||||||
hsetprop $path type graphdata
|
|
||||||
hsetprop $path viewer default
|
|
||||||
hattach $path title title
|
|
||||||
hfactory $path/rank plain mugger int
|
|
||||||
hset $path/rank 1
|
|
||||||
hsetprop $path/rank priv internal
|
|
||||||
hfactory $path/dim script "xxxscan np" hdbReadOnly intar 1
|
|
||||||
hsetprop $path/dim priv internal
|
|
||||||
hfactory $path/scan_variable script "gethdbscanvardata 0" hdbReadOnly floatvarar 1
|
|
||||||
hsetprop $path/scan_variable type axis
|
|
||||||
hsetprop $path/scan_variable dim 0
|
|
||||||
hsetprop $path/scan_variable transfer zip
|
|
||||||
hsetprop $path/scan_variable priv internal
|
|
||||||
hfactory $path/scan_variable/name plain user text
|
|
||||||
hfactory $path/counts script "gethdbscancounts" hdbReadOnly intvarar 1
|
|
||||||
hsetprop $path/counts type data
|
|
||||||
hsetprop $path/counts transfer zip
|
|
||||||
hsetprop $path/counts priv internal
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc makeQuickPar {name path} {
|
|
||||||
hfactory /quickview/$name plain mugger text
|
|
||||||
hset /quickview/$name $path
|
|
||||||
}
|
|
||||||
#---------------------------------------------------
|
|
||||||
proc makestdbatch {} {
|
|
||||||
hfactory /batch plain spy none
|
|
||||||
hfactory /batch/bufferlist script listbatchfiles hdbReadOnly text
|
|
||||||
sicspoll add /batch/bufferlist hdb 30
|
|
||||||
hfactory /batch/commandtext plain spy text
|
|
||||||
hsetprop /batch/commandtext viewer mountaingumui.TextEdit
|
|
||||||
hsetprop /batch/commandtext commandtext true
|
|
||||||
hfactory /batch/currentline plain user int
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc makeslit {path left right upper bottom} {
|
|
||||||
hfactory $path plain spy none
|
|
||||||
hsetprop $path type part
|
|
||||||
if {![string equal $left NONE]} {
|
|
||||||
hattach $path $left left
|
|
||||||
}
|
|
||||||
if {![string equal $right NONE]} {
|
|
||||||
hattach $path $right right
|
|
||||||
}
|
|
||||||
if {![string equal $upper NONE]} {
|
|
||||||
hattach $path $upper upper
|
|
||||||
}
|
|
||||||
if {![string equal $bottom NONE]} {
|
|
||||||
hattach $path $bottom bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc makestdadmin {} {
|
|
||||||
hfactory /instrument/experiment plain spy none
|
|
||||||
hattach /instrument/experiment title title
|
|
||||||
hattach /instrument/experiment user user
|
|
||||||
set status [catch {hattach /instrument/experiment/user adress address} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
set status [catch {hattach /instrument/experiment/user address address} msg]
|
|
||||||
}
|
|
||||||
hattach /instrument/experiment/user phone phone
|
|
||||||
hattach /instrument/experiment/user email email
|
|
||||||
hfactory /instrument/experiment/datafilenumber script sicsdatanumber \
|
|
||||||
hdbReadOnly int
|
|
||||||
hsetprop /instrument/experiment/datafilenumber priv internal
|
|
||||||
hfactory /instrument/experiment/batchpath script "exe batchpath" \
|
|
||||||
hdbbatchpath text
|
|
||||||
hsetprop /instrument/experiment/batchpath priv user
|
|
||||||
sicspoll add /instrument/experiment/batchpath hdb 60
|
|
||||||
sicspoll add /instrument/experiment/datafilenumber hdb 60
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------
|
|
||||||
proc makecount {path} {
|
|
||||||
hfactory $path command count
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path priv user
|
|
||||||
hfactory $path/mode plain user text
|
|
||||||
hsetprop $path/mode values "monitor,timer"
|
|
||||||
hfactory $path/preset plain user float
|
|
||||||
hset $path/preset 60000
|
|
||||||
hset $path/mode monitor
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------
|
|
||||||
proc makerepeat {path} {
|
|
||||||
hfactory $path command repeat
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path priv user
|
|
||||||
hfactory $path/num plain user int
|
|
||||||
hfactory $path/mode plain user text
|
|
||||||
hsetprop $path/mode values "monitor,timer"
|
|
||||||
hfactory $path/preset plain user float
|
|
||||||
hset $path/preset 60000
|
|
||||||
hset $path/mode monitor
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------
|
|
||||||
proc makekillfile {path} {
|
|
||||||
hcommand $path killfile
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path priv manager
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------
|
|
||||||
proc makesuccess {path} {
|
|
||||||
hcommand $path success
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path priv user
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
proc makestdgui {} {
|
|
||||||
hfactory /gui plain spy none
|
|
||||||
hfactory /gui/status plain internal text
|
|
||||||
status hdbinterest /gui/status
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------
|
|
||||||
proc makewait {path} {
|
|
||||||
hfactory $path command wait
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path priv user
|
|
||||||
hfactory $path/time plain user int
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------
|
|
||||||
proc makeevproxy {rootpath hdbname devicename} {
|
|
||||||
MakeProxy p${devicename} $devicename float
|
|
||||||
p${devicename} map upperlimit upperlimit float user
|
|
||||||
p${devicename} map lowerlimit lowerlimit float user
|
|
||||||
hlink $rootpath p${devicename} $hdbname
|
|
||||||
hsetprop $rootpath/$hdbname sicsdev $devicename
|
|
||||||
hsetprop $rootpath/$hdbname type drivable
|
|
||||||
sicspoll add $rootpath/$hdbname hdb 30
|
|
||||||
}
|
|
||||||
#================== multi motor stuff =======================
|
|
||||||
proc getNamposList {mumo} {
|
|
||||||
set txt [$mumo list]
|
|
||||||
set l [split $txt "\n"]
|
|
||||||
set lala [llength $l]
|
|
||||||
for {set i 1} {$i < [llength $l]} {incr i} {
|
|
||||||
set pos [lindex $l $i]
|
|
||||||
if {[string length $pos] > 1} {
|
|
||||||
append result [lindex $l $i] ","
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if { ![info exists result] } {
|
|
||||||
# clientput "nampos = $txt"
|
|
||||||
append result UNKNOWN
|
|
||||||
}
|
|
||||||
return [string trimright $result ","]
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------
|
|
||||||
proc getNamPos {mumo} {
|
|
||||||
set txt [$mumo find]
|
|
||||||
set l [split $txt =]
|
|
||||||
return [string trim [lindex $l 1]]
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
proc updateNamePosValues {rootpath} {
|
|
||||||
hupdate $rootpath/namedposition/values
|
|
||||||
hupdate $rootpath/dropnamedposition/name/values
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------
|
|
||||||
proc makemumopos {mumo rootpath name} {
|
|
||||||
$mumo pos $name
|
|
||||||
updateNamePosValues $rootpath
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------
|
|
||||||
proc dropmumo {mumo rootpath name} {
|
|
||||||
$mumo drop $name
|
|
||||||
updateNamePosValues $rootpath
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------
|
|
||||||
proc getDropList {mumo} {
|
|
||||||
set txt [getNamposList $mumo]
|
|
||||||
append txt ",all"
|
|
||||||
return $txt
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc makemumo {rootpath mumoname} {
|
|
||||||
hfactory $rootpath/namedposition script "getNamPos $mumoname" \
|
|
||||||
$mumoname text
|
|
||||||
hsetprop $rootpath/namedposition priv user
|
|
||||||
hfactory $rootpath/namedposition/values script \
|
|
||||||
"getNamposList $mumoname" hdbReadOnly text
|
|
||||||
hsetprop $rootpath/namedposition/values visible false
|
|
||||||
hupdate $rootpath/namedposition/values
|
|
||||||
hfactory $rootpath/assignname2current command \
|
|
||||||
"makemumopos $mumoname $rootpath"
|
|
||||||
hsetprop $rootpath/assignname2current priv user
|
|
||||||
hsetprop $rootpath/assignname2current type command
|
|
||||||
hfactory $rootpath/assignname2current/name plain user text
|
|
||||||
hset $rootpath/assignname2current/name "Undefined"
|
|
||||||
hfactory $rootpath/dropnamedposition command \
|
|
||||||
"dropmumo $mumoname $rootpath"
|
|
||||||
hsetprop $rootpath/dropnamedposition priv user
|
|
||||||
hsetprop $rootpath/dropnamedposition type command
|
|
||||||
hfactory $rootpath/dropnamedposition/name plain user text
|
|
||||||
hfactory $rootpath/dropnamedposition/name/values script \
|
|
||||||
"getDropList $mumoname" hdbReadOnly text
|
|
||||||
hsetprop $rootpath/dropnamedposition/name/values visible false
|
|
||||||
hupdate $rootpath/dropnamedposition/name/values
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------
|
|
||||||
proc hdbbatchpath {pathstring} {
|
|
||||||
exe batchpath $pathstring
|
|
||||||
catch {batchroot $pathstring}
|
|
||||||
catch {hupdate /instrument/commands/batch/execute/file/values}
|
|
||||||
catch {hupdate /instrument/commands/batch/batchpath}
|
|
||||||
catch {hupdate /instrument/experiment/batchpath}
|
|
||||||
catch {hupdate /batch/bufferlist}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc makeexe {} {
|
|
||||||
set path /instrument/commands/batch
|
|
||||||
hfactory $path plain spy none
|
|
||||||
hfactory $path/batchpath script "exe batchpath" hdbbatchpath text
|
|
||||||
hsetprop $path/batchpath priv user
|
|
||||||
hfactory $path/execute command exe
|
|
||||||
hsetprop $path/execute type command
|
|
||||||
hsetprop $path/execute priv user
|
|
||||||
hfactory $path/execute/file plain user text
|
|
||||||
hfactory $path/execute/file/values script listbatchfiles hdbReadOnly text
|
|
||||||
sicspoll add $path/execute/file/values hdb 60
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc confnxhdb {path alias pass} {
|
|
||||||
hsetprop $path nxalias $alias
|
|
||||||
hsetprop $path nxpass $pass
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc hdbstorenexus args {
|
|
||||||
if {[llength $args] < 2} {
|
|
||||||
error "hdbstorenexus called with insufficient number of arguments"
|
|
||||||
}
|
|
||||||
set path [lindex $args 0]
|
|
||||||
set pass [lindex $args 1]
|
|
||||||
set childlist [split [hlist $path] \n]
|
|
||||||
foreach child $childlist {
|
|
||||||
if {[string length $child] < 1} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
set status [catch {hgetpropval $path/$child nxpass} passval]
|
|
||||||
if {$status == 0} {
|
|
||||||
set status [catch {hgetpropval $path/$child nxslab} slabval]
|
|
||||||
# ------- slabbed writing
|
|
||||||
if {$status == 0 && [string first $pass $passval] >= 0} {
|
|
||||||
set slabsizes [eval $slabval [lrange $args 2 end]]
|
|
||||||
nxscript puthdbslab $path/$child [lindex $slabsizes 0] [lindex $slabsizes 1]
|
|
||||||
}
|
|
||||||
#--------- normal writing
|
|
||||||
if {[string first $pass $passval] >= 0} {
|
|
||||||
nxscript puthdb $path/$child
|
|
||||||
}
|
|
||||||
}
|
|
||||||
eval hdbstorenexus $path/$child $pass [lrange $args 2 end]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#===================== Syntactical sugar around hdbscan ===================
|
|
||||||
# center scan. A convenience scan for the one and only Daniel Clemens
|
|
||||||
# at TOPSI. Scans around a given center point. Requires the scan command
|
|
||||||
# for TOPSI to work.
|
|
||||||
#
|
|
||||||
# another convenience scan:
|
|
||||||
# sscan var1 start end var1 start end .... np preset
|
|
||||||
# scans var1, var2 from start to end with np steps and a preset of preset
|
|
||||||
#
|
|
||||||
# Mark Koennecke, August 1997
|
|
||||||
#
|
|
||||||
# Reworked for hdbscan, Mark Koennecke, November 2008
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
proc cscan { var center delta np preset } {
|
|
||||||
#------ start with some argument checking
|
|
||||||
set t [SICSType $var]
|
|
||||||
if { [string compare $t DRIV] != 0 } {
|
|
||||||
ClientPut [format "ERROR: %s is NOT drivable!" $var]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set t [SICSType $center]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: %s is no number!" $center]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set t [SICSType $delta]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: %s is no number!" $delta]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set t [SICSType $np]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: %s is no number!" $np]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set t [SICSType $preset]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: %s is no number!" $preset]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set mode [string trim [SplitReply [scan mode]]]
|
|
||||||
#-------- store command in lastscancommand
|
|
||||||
set txt [format "cscan %s %s %s %s %s" $var $center \
|
|
||||||
$delta $np $preset]
|
|
||||||
catch {lastscancommand $txt}
|
|
||||||
#--------- calculate start and do scan
|
|
||||||
set start [expr $center - $np * $delta]
|
|
||||||
set ret [catch {hdbscan $var $start $delta [expr ($np * 2) + 1] $mode $preset} msg]
|
|
||||||
if { $ret != 0} {
|
|
||||||
error $msg
|
|
||||||
} else {
|
|
||||||
return $msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc sscan args {
|
|
||||||
scan clear
|
|
||||||
#------- check arguments: the last two must be preset and np!
|
|
||||||
set l [llength $args]
|
|
||||||
if { $l < 5} {
|
|
||||||
ClientPut "ERROR: Insufficient number of arguments to sscan"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set preset [lindex $args [expr $l - 1]]
|
|
||||||
set np [lindex $args [expr $l - 2]]
|
|
||||||
set t [SICSType $preset]
|
|
||||||
ClientPut $t
|
|
||||||
ClientPut [string first $t "NUM"]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: expected number for preset, got %s" \
|
|
||||||
$preset]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set t [SICSType $np]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: expected number for np, got %s" \
|
|
||||||
$np]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
#--------- do variables
|
|
||||||
set nvar [expr ($l - 2) / 3]
|
|
||||||
for { set i 0 } { $i < $nvar} { incr i } {
|
|
||||||
set var [lindex $args [expr $i * 3]]
|
|
||||||
set t [SICSType $var]
|
|
||||||
if {[string compare $t DRIV] != 0} {
|
|
||||||
ClientPut [format "ERROR: %s is not drivable" $var]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set start [lindex $args [expr ($i * 3) + 1]]
|
|
||||||
set t [SICSType $start]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: expected number for start, got %s" \
|
|
||||||
$start]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set end [lindex $args [expr ($i * 3) + 2]]
|
|
||||||
set t [SICSType $end]
|
|
||||||
if { [string compare $t NUM] != 0 } {
|
|
||||||
ClientPut [format "ERROR: expected number for end, got %s" \
|
|
||||||
$end]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
#--------- do scan parameters
|
|
||||||
append scanvars $var ","
|
|
||||||
append scanstarts $start ","
|
|
||||||
set step [expr double($end - $start)/double($np-1)]
|
|
||||||
append scansteps $step ","
|
|
||||||
}
|
|
||||||
#------------- set lastcommand text
|
|
||||||
set txt [format "sscan %s" [join $args]]
|
|
||||||
catch {lastscancommand $txt}
|
|
||||||
#------------- start scan
|
|
||||||
set scanvars [string trim $scanvars ,]
|
|
||||||
set scanstarts [string trim $scanstarts ,]
|
|
||||||
set scansteps [string trim $scansteps ,]
|
|
||||||
set mode [string trim [SplitReply [scan mode]]]
|
|
||||||
set ret [catch {hdbscan $scanvars $scanstarts $scansteps $np $mode $preset} msg]
|
|
||||||
if {$ret != 0} {
|
|
||||||
error $msg
|
|
||||||
} else {
|
|
||||||
return $msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
proc splitScanVar {txt} {
|
|
||||||
set l1 [split $txt =]
|
|
||||||
set var [lindex $l1 0]
|
|
||||||
set vl [split $var .]
|
|
||||||
lappend result [lindex $vl 1]
|
|
||||||
lappend result [string trim [lindex $l1 1]]
|
|
||||||
lappend result [string trim [lindex $l1 2]]
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
proc scaninfo {} {
|
|
||||||
set novar [string trim [SplitReply [xxxscan noscanvar]]]
|
|
||||||
if {$novar == 0} {
|
|
||||||
return "0,1,NONE,0.,0.,default.dat"
|
|
||||||
}
|
|
||||||
append result "scaninfo = "
|
|
||||||
append result [string trim [SplitReply [xxxscan np]]] "," $novar
|
|
||||||
for {set i 0} {$i < $novar} {incr i} {
|
|
||||||
set vl [splitScanVar [xxxscan getvarpar $i]]
|
|
||||||
append result ", " [lindex $vl 0]
|
|
||||||
}
|
|
||||||
set vl [splitScanVar [xxxscan getvarpar 0]]
|
|
||||||
append result "," [lindex $vl 1]
|
|
||||||
append result "," [lindex $vl 2]
|
|
||||||
append result "," [SplitReply [xxxscan getfile]]
|
|
||||||
append result "," [SplitReply [sample]]
|
|
||||||
append result "," [sicstime]
|
|
||||||
append result "," [SplitReply [lastscancommand]]
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc scan args {
|
|
||||||
if {[llength $args] < 1} {
|
|
||||||
error "Need keyword for scan"
|
|
||||||
}
|
|
||||||
set key [string trim [lindex $args 0]]
|
|
||||||
switch $key {
|
|
||||||
uuinterest { return [xxxscan uuinterest] }
|
|
||||||
pinterest {}
|
|
||||||
getcounts { set cts [SplitReply [xxxscan getcounts]]
|
|
||||||
return "scan.Counts = $cts"
|
|
||||||
}
|
|
||||||
mode {
|
|
||||||
if {[llength $args] > 1} {
|
|
||||||
return [counter mode [lindex $args 1]]
|
|
||||||
} else {
|
|
||||||
return [counter mode]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clear {
|
|
||||||
return [xxxscan clear]
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
error "scan does not support keyword $key"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc makestddrive {path} {
|
|
||||||
hfactory $path command drive
|
|
||||||
hsetprop $path type command
|
|
||||||
hsetprop $path viewer mountaingumui.DriveEditor
|
|
||||||
hsetprop $path priv user
|
|
||||||
hfactory $path/motor plain user text
|
|
||||||
hsetprop $path/motor argtype drivable
|
|
||||||
hfactory $path/value plain user float
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -1,82 +0,0 @@
|
|||||||
#---------------------------------------------------------------------------
|
|
||||||
# These scripts save and load motor positions for EL734 motors connected
|
|
||||||
# directly to SICS through the terminal server. For all others, use
|
|
||||||
# David Madens el734_motor program
|
|
||||||
#
|
|
||||||
# Mark Koennecke, April 2004
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
if { ![info exists motorhpscript] } {
|
|
||||||
set motorhpscript 1
|
|
||||||
Publish motorinternsave Mugger
|
|
||||||
Publish motorsave Mugger
|
|
||||||
Publish motorload Mugger
|
|
||||||
Publish loadmotordir Mugger
|
|
||||||
Publish savemotorarray Mugger
|
|
||||||
}
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
# save motor parameters from controller, number to file described by
|
|
||||||
# file descriptor fd
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc motorinternsave {controller number fd} {
|
|
||||||
lappend parlist mn ec ep a fd fm d e f g h j k l m q t v w z mem
|
|
||||||
puts $fd [format "%s send ec %d 0 0" $controller $number]
|
|
||||||
foreach e $parlist {
|
|
||||||
set data [$controller send $e $number]
|
|
||||||
puts $fd [format "%s send %s %d %s" $controller $e $number $data]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
# save a motor parameter set to a directory. The filename is automatically
|
|
||||||
# created in order to help motorload
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc motorsave {controller number dirname} {
|
|
||||||
set filename [format "%s/%s%2.2d.par" $dirname $controller $number]
|
|
||||||
set f [open $filename w]
|
|
||||||
motorinternsave $controller $number $f
|
|
||||||
close $f
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------
|
|
||||||
# Loading motor parameters. Because some of the commands change the position
|
|
||||||
# of the motor, the position is saved first and redefined after processing
|
|
||||||
# the data. It is assumed that the filename is in the format as made
|
|
||||||
# by motorsave.
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc motorload {filename} {
|
|
||||||
set fil [file tail $filename]
|
|
||||||
set ind [string last . $fil]
|
|
||||||
set number [string range $fil [expr $ind - 2] [expr $ind - 1]]
|
|
||||||
set controller [string range $fil 0 [expr $ind - 3]]
|
|
||||||
set pos [$controller send u $number]
|
|
||||||
fileeval $filename
|
|
||||||
$controller send uu $number $pos
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# load a motor directory
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc loadmotordir {dirname} {
|
|
||||||
set l [glob $dirname/*.par]
|
|
||||||
foreach e $l {
|
|
||||||
set ret [catch {motorload $e} msg]
|
|
||||||
if { $ret != 0} {
|
|
||||||
clientput "ERROR: failed to load $e with $msg"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# save a whole array of motors. The array must have the following form:
|
|
||||||
# An entry: controllerlist conatins a list of all controllers
|
|
||||||
# There exists an entry with the controller name in the array which contains
|
|
||||||
# a list of motor number
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc savemotorarray {motar dir} {
|
|
||||||
upvar $motar motorarray
|
|
||||||
set controllerList $motorarray(controllerlist)
|
|
||||||
foreach controller $controllerList {
|
|
||||||
set motlist $motorarray($controller)
|
|
||||||
foreach mot $motlist {
|
|
||||||
motorsave $controller $mot $dir
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
#===========================================================================
|
|
||||||
# Support routines for scripting NeXus files with nxscript.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, February 2003
|
|
||||||
# Mark Koennecke, January 2004
|
|
||||||
#==========================================================================
|
|
||||||
proc makeFileName args {
|
|
||||||
sicsdatanumber incr
|
|
||||||
set num [SplitReply [sicsdatanumber]]
|
|
||||||
set p [string trim [SplitReply [sicsdatapath]]]
|
|
||||||
set pre [string trim [SplitReply [sicsdataprefix]]]
|
|
||||||
set po [string trim [SplitReply [sicsdatapostfix]]]
|
|
||||||
return [format "%s%s%5.5d2003%s" $p $pre $num $po]
|
|
||||||
}
|
|
||||||
#==========================================================================
|
|
||||||
# new version, attending to the new 1000 grouping logic
|
|
||||||
proc newFileName args {
|
|
||||||
set ret [catch {nxscript makefilename} msg]
|
|
||||||
if {$ret != 0} {
|
|
||||||
clientput "ERROR: Misconfiguration of file writing variables"
|
|
||||||
clientput "Defaulting filename to emergency.hdf"
|
|
||||||
set fil emergency.hdf
|
|
||||||
} else {
|
|
||||||
set fil $msg
|
|
||||||
}
|
|
||||||
return $fil
|
|
||||||
}
|
|
||||||
#==========================================================================
|
|
||||||
proc writeFloatVar {alias var} {
|
|
||||||
set ret [catch {set val [SplitReply [$var]]} val]
|
|
||||||
if { $ret != 0} {
|
|
||||||
clientput [format "ERROR: failed to read %s, %s" $var $val]
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
set val [string trim $val]
|
|
||||||
set ret [catch {expr $val * 1.0} val]
|
|
||||||
if { $ret == 0} {
|
|
||||||
nxscript putfloat $alias [expr $val * 1.0 ]
|
|
||||||
} else {
|
|
||||||
clientput "ERROR: bad value $val when reading $var"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#==========================================================================
|
|
||||||
proc writeIntVar {alias var} {
|
|
||||||
set ret [catch {set val [SplitReply [$var]]} val]
|
|
||||||
if { $ret != 0} {
|
|
||||||
clientput [format "ERROR: failed to read %s, %s" $var $val]
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
set val [string trim $val]
|
|
||||||
set ret [catch {expr $val * 1.0} val]
|
|
||||||
if { $ret == 0} {
|
|
||||||
nxscript putint $alias [expr int($val * 1.0) ]
|
|
||||||
} else {
|
|
||||||
clientput "ERROR: bad value $val when reading $var"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#=========================================================================
|
|
||||||
proc writeTextVar {alias var} {
|
|
||||||
set ret [catch {$var} val]
|
|
||||||
if { $ret != 0} {
|
|
||||||
clientput [format "ERROR: failed to read %s" $var]
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
set index [string first = $val]
|
|
||||||
if {$index >= 0} {
|
|
||||||
set txt [string trim [string range $val [expr $index + 1] end]]
|
|
||||||
nxscript puttext $alias $txt
|
|
||||||
} else {
|
|
||||||
clientput [format "ERROR: failed to read %s" $var]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#========================================================================
|
|
||||||
proc writeTextAttribute {attName var} {
|
|
||||||
set ret [catch {set val [SplitReply [$var]]} val]
|
|
||||||
if { $ret != 0} {
|
|
||||||
clientput [format "ERROR: failed to read %s" $var]
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
nxscript putglobal $attName [string trim $val]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#=======================================================================
|
|
||||||
proc writeStandardAttributes {fileName} {
|
|
||||||
nxscript putglobal file_name $fileName
|
|
||||||
nxscript putglobal file_time [sicstime]
|
|
||||||
writeTextAttribute instrument instrument
|
|
||||||
writeTextAttribute owner user
|
|
||||||
writeTextAttribute owner_telephone_number phone
|
|
||||||
writeTextAttribute owner_fax_number fax
|
|
||||||
writeTextAttribute owner_email email
|
|
||||||
writeTextAttribute owner_address address
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc appendMotor {np motor alias} {
|
|
||||||
set val [SplitReply [$motor]]
|
|
||||||
__transfer putfloat 0 $val
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc appendFloat {np alias val} {
|
|
||||||
__transfer putfloat 0 $val
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc appendCount {np value alias} {
|
|
||||||
__transfer putint 0 $value
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc appendSampleEnv {np device alias} {
|
|
||||||
#--------- test for presence
|
|
||||||
set status [catch {SplitReply [$device]} val]
|
|
||||||
if {$status != 0} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
#--------- test for validity
|
|
||||||
set status [catch {expr $val * 1.0} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
appendFloat $np $alias $val
|
|
||||||
}
|
|
||||||
@@ -1,311 +0,0 @@
|
|||||||
#------------------------------------------------------------------
|
|
||||||
# This is driver for the combination Phytron MCC-2 Motor Controller
|
|
||||||
# and SICS using the scriptcontext asynchronous I/O system. The
|
|
||||||
# MCC-2 has a funny protocl as that messages are enclosed into
|
|
||||||
# <STX> data <ETX> sequences. This protocol is handled by the
|
|
||||||
# C-language phytron protocol handler. Per default, the MCC-2 is
|
|
||||||
# configured to use 57600 baud. I have configured it to use 9600
|
|
||||||
# baud and it ought to remember this. The command to change this
|
|
||||||
# 0IC1S9600, the command to read this is 0IC1R.
|
|
||||||
#
|
|
||||||
# So, if this thing does not work on a serial port then the solution is
|
|
||||||
# to set the terminal server to 57600 and try again. And set the baud rate
|
|
||||||
# or leave it.
|
|
||||||
#
|
|
||||||
# There are surely many ways to use the MCC-2. It supports two axes, X and Y.
|
|
||||||
# All examples below are given for X only. This driver uses it in
|
|
||||||
# this way:
|
|
||||||
#
|
|
||||||
# Nothing works properly without a reference run. The reference run is done
|
|
||||||
# in the following way:
|
|
||||||
# 1) Send it into the negative limit switch with 0X0-
|
|
||||||
# 2) Set the mechanical position with 0XP20Swert to the negative limit
|
|
||||||
# 3) Set the encoder position with 0XP22Swert to the negative limit
|
|
||||||
#
|
|
||||||
# Position ever afterwards with 0XAwert, read encoder with 0XP22R
|
|
||||||
#
|
|
||||||
# While driving 0X=H return ACKN, else ACKE
|
|
||||||
#
|
|
||||||
# Stopping goes via 0XSN
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Script chains:
|
|
||||||
#
|
|
||||||
# - reading position:
|
|
||||||
# readpos - posrcv
|
|
||||||
#
|
|
||||||
# - writing postion:
|
|
||||||
# setpos - setrcv
|
|
||||||
#
|
|
||||||
# - reading status:
|
|
||||||
# sendstatus - rcvstatus - statpos
|
|
||||||
#
|
|
||||||
# - reading speed:
|
|
||||||
# readspeed - rcvspeed
|
|
||||||
#
|
|
||||||
# - setting speed:
|
|
||||||
# writespeed - rcvwspeed - rcvspeed
|
|
||||||
#
|
|
||||||
# Mark Koennecke, June 2009
|
|
||||||
#
|
|
||||||
# Added code to switch a brake on for schneider_m2
|
|
||||||
#
|
|
||||||
# Mark Koennecke, September 2009
|
|
||||||
#
|
|
||||||
# Added code to support the speed parameter
|
|
||||||
#
|
|
||||||
# Mark Koennecke, December 2009
|
|
||||||
#
|
|
||||||
# Added more code to configure non encoder phytron motors which need to
|
|
||||||
# read another parameter for position
|
|
||||||
#
|
|
||||||
# Mark Koennecke, January 2011
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval phytron {}
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
proc phytron::check {} {
|
|
||||||
set data [sct result]
|
|
||||||
if {[string first AscErr $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
return $data
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::readpos {axis enc} {
|
|
||||||
# the following command must be P20R without encoder, P22R with encoder
|
|
||||||
if {$enc == 1} {
|
|
||||||
sct send "0${axis}P22R"
|
|
||||||
} else {
|
|
||||||
sct send "0${axis}P20R"
|
|
||||||
}
|
|
||||||
return posrcv
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::posrcv {} {
|
|
||||||
set data [phytron::check]
|
|
||||||
set pos [string range $data 3 end]
|
|
||||||
sct update $pos
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::setpos {axis name} {
|
|
||||||
set val [sct target]
|
|
||||||
sct send "0${axis}A$val"
|
|
||||||
hupdate /sics/${name}/status run
|
|
||||||
return setrcv
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::setrcv {controller name} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first NACK $data] >= 0} {
|
|
||||||
error "Invalid command"
|
|
||||||
}
|
|
||||||
$controller queue /sics/${name}/status progress read
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc phytron::sendstatus {axis} {
|
|
||||||
sct send "0${axis}=H"
|
|
||||||
return rcvstatus
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc phytron::rcvstatus {axis controller enc} {
|
|
||||||
set status [catch {phytron::check} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct update error
|
|
||||||
clientput $error
|
|
||||||
}
|
|
||||||
if {[string first ACKN $data] >= 0} {
|
|
||||||
sct update run
|
|
||||||
$controller queue [sct] progress read
|
|
||||||
}
|
|
||||||
if {[string first ACKE $data] >= 0} {
|
|
||||||
phytron::readpos $axis $enc
|
|
||||||
return posrcv
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc phytron::statpos {axis name} {
|
|
||||||
set data [phytron::check]
|
|
||||||
set pos [string range $data 3 end]
|
|
||||||
hupdate /sics/${name}/hardposition $pos
|
|
||||||
sct send "0${axis}=I+"
|
|
||||||
return statposlim
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::statposlim {axis} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first ACKE $data] >= 0} {
|
|
||||||
sct update error
|
|
||||||
clientput "Hit positive limit switch"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
sct send "0${axis}=I-"
|
|
||||||
return statneglim
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::statneglim {axis} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first ACKE $data] >= 0} {
|
|
||||||
sct update error
|
|
||||||
clientput "Hit negative limit switch"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
sct send "0${axis}=E"
|
|
||||||
return statend
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::statend {axis} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first ACKE $data] >= 0} {
|
|
||||||
sct update error
|
|
||||||
clientput "Electronics error"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::readspeed {axis} {
|
|
||||||
sct send "0${axis}P14R"
|
|
||||||
return rcvspeed
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::rcvspeed {} {
|
|
||||||
set data [phytron::check]
|
|
||||||
set speed [string range $data 3 end]
|
|
||||||
sct update $speed
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::writespeed {axis} {
|
|
||||||
set val [sct target]
|
|
||||||
sct send "0${axis}P14S$val"
|
|
||||||
return rcvwspeed
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc phytron::rcvwspeed {axis} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first NACK $data] >= 0} {
|
|
||||||
error "Invalid command"
|
|
||||||
}
|
|
||||||
return [phytron::readspeed $axis]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc phytron::halt {controller axis} {
|
|
||||||
$controller send "0${axis}SN"
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
proc phytron::refrun {name controller axis lowlim} {
|
|
||||||
set path /sics/${name}/status
|
|
||||||
$controller send "0${axis}0-"
|
|
||||||
hupdate $path run
|
|
||||||
set motstat run
|
|
||||||
wait 3
|
|
||||||
while {[string compare $motstat run] == 0} {
|
|
||||||
$controller queue $path progress read
|
|
||||||
wait 1
|
|
||||||
set motstat [string trim [hval $path]]
|
|
||||||
}
|
|
||||||
$controller transact "0${axis}P20S$lowlim"
|
|
||||||
$controller transact "0${axis}P22S$lowlim"
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
proc phytron::defpos {controller axis value} {
|
|
||||||
$controller transact "0${axis}P20S$value"
|
|
||||||
$controller transact "0${axis}P22S$value"
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
proc phytron::make {name axis controller lowlim upperlim {enc 1}} {
|
|
||||||
MakeSecMotor $name
|
|
||||||
|
|
||||||
hdel /sics/${name}/hardupperlim
|
|
||||||
hdel /sics/${name}/hardlowerlim
|
|
||||||
hfactory /sics/${name}/hardupperlim plain internal float
|
|
||||||
hfactory /sics/${name}/hardlowerlim plain internal float
|
|
||||||
$name hardlowerlim $lowlim
|
|
||||||
$name softlowerlim $lowlim
|
|
||||||
$name hardupperlim $upperlim
|
|
||||||
$name softupperlim $upperlim
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition read phytron::readpos $axis $enc
|
|
||||||
hsetprop /sics/${name}/hardposition posrcv phytron::posrcv
|
|
||||||
$controller poll /sics/${name}/hardposition 60
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition write phytron::setpos $axis $name
|
|
||||||
hsetprop /sics/${name}/hardposition setrcv phytron::setrcv $controller $name
|
|
||||||
$controller write /sics/${name}/hardposition
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/status read phytron::sendstatus $axis
|
|
||||||
hsetprop /sics/${name}/status rcvstatus phytron::rcvstatus $axis $controller $enc
|
|
||||||
hsetprop /sics/${name}/status posrcv phytron::statpos $axis $name
|
|
||||||
hsetprop /sics/${name}/status statposlim phytron::statposlim $axis
|
|
||||||
hsetprop /sics/${name}/status statneglim phytron::statneglim $axis
|
|
||||||
hsetprop /sics/${name}/status statend phytron::statend $axis
|
|
||||||
$controller poll /sics/${name}/status 60
|
|
||||||
|
|
||||||
hfactory /sics/${name}/speed plain user float
|
|
||||||
hsetprop /sics/${name}/speed read "phytron::readspeed $axis"
|
|
||||||
hsetprop /sics/${name}/speed rcvspeed "phytron::rcvspeed"
|
|
||||||
hsetprop /sics/${name}/speed write "phytron::writespeed $axis"
|
|
||||||
hsetprop /sics/${name}/speed rcvwspeed "phytron::rcvwspeed $axis"
|
|
||||||
$controller poll /sics/${name}/speed 60
|
|
||||||
$controller write /sics/${name}/speed
|
|
||||||
|
|
||||||
$name makescriptfunc halt "phytron::halt $controller $axis" user
|
|
||||||
|
|
||||||
$name makescriptfunc refrun "phytron::refrun $name $controller $axis $lowlim" user
|
|
||||||
|
|
||||||
$name makescriptfunc sethardpos "phytron::defpos $controller $axis" user
|
|
||||||
hfactory /sics/${name}/sethardpos/value plain user float
|
|
||||||
|
|
||||||
hupdate /sics/${name}/status idle
|
|
||||||
$controller queue /sics/${name}/hardposition progress read
|
|
||||||
$controller queue /sics/${name}/speed progress read
|
|
||||||
}
|
|
||||||
#===============================================================================================
|
|
||||||
# At MORPHEUS there is a special table where one motor needs a brake. This requires a digital I/O
|
|
||||||
# to be disabled before driving and enabled after driving. The code below adds this feature to
|
|
||||||
# a phytron motor
|
|
||||||
#-----------------------------------------------------------------------------------------------
|
|
||||||
proc phytron::openset {out} {
|
|
||||||
sct send [format "0A%dS" $out]
|
|
||||||
return openans
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------------------------
|
|
||||||
proc phytron::openans {axis name} {
|
|
||||||
after 100
|
|
||||||
return [phytron::setpos $axis $name]
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------------------------
|
|
||||||
proc phytron::outsend {axis out} {
|
|
||||||
set data [phytron::check]
|
|
||||||
if {[string first ACKE $data] >= 0} {
|
|
||||||
sct update error
|
|
||||||
clientput "Electronics error"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
sct send [format "0A%dR" $out]
|
|
||||||
return outend
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------------------------
|
|
||||||
proc phytron::outend {} {
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------------------------------
|
|
||||||
proc phytron::configureM2 {motor axis out} {
|
|
||||||
set path /sics/${motor}
|
|
||||||
hsetprop $path/hardposition write phytron::openset $out
|
|
||||||
hsetprop $path/hardposition openans phytron::openans $axis $motor
|
|
||||||
|
|
||||||
hsetprop $path/status statend phytron::outsend $axis $out
|
|
||||||
hsetprop $path/status outend phytron::outend
|
|
||||||
}
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
#----------------------------------------------------
|
|
||||||
# This is a scriptcontext motor driver for the
|
|
||||||
# prehistoric Physik Instrumente DC-406, C-804 DC
|
|
||||||
# motor controller.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Scriptchains:
|
|
||||||
# - read - readreply
|
|
||||||
# - write - writerepy
|
|
||||||
# - sendstatus - statusreply - statuspos
|
|
||||||
# - speedread - readreply
|
|
||||||
# - writespeed - speedreply
|
|
||||||
# - writenull - speedreply
|
|
||||||
#
|
|
||||||
# Mark Koennecke, November 2009, after the
|
|
||||||
# C original from 1998
|
|
||||||
# Made to work, Mark Koennecke, January 2011
|
|
||||||
#-----------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval pimotor {}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc pimotor::read {num} {
|
|
||||||
sct send [format "%1.1dTP" $num]
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc pimotor::readreply {} {
|
|
||||||
set result [sct result]
|
|
||||||
if {[string first ? $result] >= 0} {
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
if {[string first ERR $result] >= 0} {
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
set val [string range $result 3 end]
|
|
||||||
sct update $val
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc pimotor::write {num name} {
|
|
||||||
set ival [expr int([sct target])]
|
|
||||||
# After a stop, the motor is switched off. In order to fix this
|
|
||||||
# we switch the motor on for each drive command
|
|
||||||
sct send [format "%1.1dMN,%1.1dMA%10.10d{0}" $num $num $ival]
|
|
||||||
hupdate /sics/${name}/status run
|
|
||||||
return writereply
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc pimotor::writereply {name} {
|
|
||||||
# the DC-406 does not reply on this, so we have for sure a
|
|
||||||
# timeout here which we ignore. We do nothing else, as we
|
|
||||||
# need a little wait anyway to get the motor to start
|
|
||||||
# before starting to check status.
|
|
||||||
#----------------------------------------------------
|
|
||||||
wait 1
|
|
||||||
set con [sct controller]
|
|
||||||
hset /sics/${name}/status run
|
|
||||||
$con queue /sics/${name}/status progress read
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc pimotor::sendstatus {num} {
|
|
||||||
sct send [format "%1.1dTV" $num]
|
|
||||||
return statusreply
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc pimotor::statusreply {num} {
|
|
||||||
set result [sct result]
|
|
||||||
if {[string first ? $result] >= 0} {
|
|
||||||
sct update error
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
if {[string first ERR $result] >= 0} {
|
|
||||||
sct update error
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
set val [string trimleft [string range $result 3 13] "0-"]
|
|
||||||
set val [string trim $val]
|
|
||||||
if {[string length $val] > 1} {
|
|
||||||
set len [string length $val]
|
|
||||||
clientput "Value = $val, length = $len"
|
|
||||||
if {abs($val) > 0} {
|
|
||||||
sct update run
|
|
||||||
[sct controller] queue [sct] progress read
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pimotor::read $num
|
|
||||||
return statuspos
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc pimotor::statuspos {name} {
|
|
||||||
set result [sct result]
|
|
||||||
if {[string first ? $result] >= 0} {
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
if {[string first ERR $result] >= 0} {
|
|
||||||
error $result
|
|
||||||
}
|
|
||||||
set val [string range $result 3 end]
|
|
||||||
hupdate /sics/${name}/hardposition $val
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc pimotor::readspeed {num} {
|
|
||||||
sct send [format "%1.1dTY" $num]
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc pimotor::writespeed {num} {
|
|
||||||
sct send [format "%1.1dSV%7.7d" $num [sct target]]
|
|
||||||
return speedreply
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc pimotor::speedreply {num} {
|
|
||||||
pimotor::readspeed $num
|
|
||||||
return readreply
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc pimotor::writenull {controller num} {
|
|
||||||
$controller send [format "%1.1dDH{0}" $num]
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc pimotor::writeon {controller num} {
|
|
||||||
$controller send [format "%1.1dMN{0}" $num]
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc pimotor::halt {controller num} {
|
|
||||||
$controller send [format "%1.1dAB{0}" $num]
|
|
||||||
return Done
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc pimotor::makepimotor {name num sct lowlim upperlim} {
|
|
||||||
MakeSecMotor $name
|
|
||||||
|
|
||||||
hdel /sics/${name}/hardupperlim
|
|
||||||
hdel /sics/${name}/hardlowerlim
|
|
||||||
hfactory /sics/${name}/hardupperlim plain internal float
|
|
||||||
hfactory /sics/${name}/hardlowerlim plain internal float
|
|
||||||
$name hardlowerlim $lowlim
|
|
||||||
$name softlowerlim $lowlim
|
|
||||||
$name hardupperlim $upperlim
|
|
||||||
$name softupperlim $upperlim
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition read pimotor::read $num
|
|
||||||
hsetprop /sics/${name}/hardposition readreply pimotor::readreply
|
|
||||||
$sct poll /sics/${name}/hardposition 60
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/hardposition write pimotor::write $num $name
|
|
||||||
hsetprop /sics/${name}/hardposition writereply pimotor::writereply $name
|
|
||||||
$sct write /sics/${name}/hardposition
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/status read pimotor::sendstatus $num
|
|
||||||
hsetprop /sics/${name}/status statusreply pimotor::statusreply $num
|
|
||||||
hsetprop /sics/${name}/status statuspos pimotor::statuspos $name
|
|
||||||
$sct poll /sics/${name}/status 60
|
|
||||||
|
|
||||||
hfactory /sics/${name}/speed plain user int
|
|
||||||
hsetprop /sics/${name}/speed read pimotor::readspeed $num
|
|
||||||
hsetprop /sics/${name}/speed readreply pimotor::readreply
|
|
||||||
$sct poll /sics/${name}/speed 120
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/speed write pimotor::writespeed $num
|
|
||||||
hsetprop /sics/${name}/speed speedreply pimotor::speedreply $num
|
|
||||||
$sct write /sics/${name}/speed
|
|
||||||
|
|
||||||
$name makescriptfunc halt "pimotor::halt $sct $num" user
|
|
||||||
$name makescriptfunc on "pimotor::writeon $sct $num" user
|
|
||||||
$name makescriptfunc home "pimotor::writenull $sct $num" user
|
|
||||||
|
|
||||||
hupdate /sics/${name}/status idle
|
|
||||||
$sct queue /sics/${name}/hardposition progress read
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#---------------------------------------------------------------
|
|
||||||
# This is a second generation simulation motor.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, December 2008
|
|
||||||
#----------------------------------------------------------------
|
|
||||||
proc simhardset {motname newval} {
|
|
||||||
hset /sics/$motname/starttime [clock sec]
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc simhardget {motname} {
|
|
||||||
set stat [hval /sics/$motname/status]
|
|
||||||
set val [hval /sics/$motname/targetposition]
|
|
||||||
if {[string first run $stat] >= 0 \
|
|
||||||
|| [string first error $stat] >= 0 } {
|
|
||||||
return [expr $val -.777]
|
|
||||||
} else {
|
|
||||||
return $val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc simhardfaultget {motname} {
|
|
||||||
set val [hval /sics/$motname/targetposition]
|
|
||||||
return [expr $val - .5]
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc simstatusget {motname} {
|
|
||||||
set start [hval /sics/$motname/starttime]
|
|
||||||
if {$start < 0} {
|
|
||||||
return error
|
|
||||||
}
|
|
||||||
set delay [hval /sics/$motname/delay]
|
|
||||||
if {[clock sec] > $start + $delay} {
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
return run
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------
|
|
||||||
proc simstatusfault {motname } {
|
|
||||||
clientput "ERROR: I am feeling faulty!"
|
|
||||||
return error
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------
|
|
||||||
proc simhalt {motname} {
|
|
||||||
hset /sics/$motname/starttime -100
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------
|
|
||||||
proc MakeSecSim {name lower upper delay} {
|
|
||||||
MakeSecMotor $name
|
|
||||||
hfactory /sics/$name/delay plain user text
|
|
||||||
hfactory /sics/$name/starttime plain user int
|
|
||||||
hset /sics/$name/delay $delay
|
|
||||||
hdel /sics/$name/hardposition
|
|
||||||
hfactory /sics/$name/hardposition script "simhardget $name" "simhardset $name" float
|
|
||||||
# hfactory /sics/$name/hardposition script "simhardfaultget $name" "simhardset $name" float
|
|
||||||
hdel /sics/$name/status
|
|
||||||
hfactory /sics/$name/status script "simstatusget $name" "hdbReadOnly b" text
|
|
||||||
# hfactory /sics/$name/status script "simstatusfault $name" "hdbReadOnly b" text
|
|
||||||
$name makescriptfunc halt "simhalt $name" user
|
|
||||||
hupdate /sics/$name/hardupperlim $upper
|
|
||||||
hupdate /sics/$name/softupperlim $upper
|
|
||||||
hupdate /sics/$name/hardlowerlim $lower
|
|
||||||
hupdate /sics/$name/softlowerlim $lower
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
#-----------------------------------------------------
|
|
||||||
# This is a simulation driver for the second
|
|
||||||
# generation histogram memory. It provides
|
|
||||||
# for a fill value which is used to initialize
|
|
||||||
# data.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, January 2010
|
|
||||||
#-----------------------------------------------------
|
|
||||||
namespace eval simhm {}
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc simhm::getcontrol {name} {
|
|
||||||
return -9999.99
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc simhm::setcontrol {name val} {
|
|
||||||
switch $val {
|
|
||||||
1000 {
|
|
||||||
hset /sics/${name}/internalstatus run
|
|
||||||
set pp [hval /sics/${name}/preset]
|
|
||||||
hset /sics/${name}/finishtime [expr $pp + [clock seconds]]
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
1001 {
|
|
||||||
hset /sics/${name}/internalstatus error
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
1002 {
|
|
||||||
hset /sics/${name}/internalstatus pause
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
1003 {
|
|
||||||
hset /sics/${name}/internalstatus run
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
1005 {
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
clientput "ERROR: bad start target $target given to control"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------------------------------------------------
|
|
||||||
proc simhm::getstatus {name} {
|
|
||||||
set status [string trim [hval /sics/${name}/internalstatus]]
|
|
||||||
if {[string first run $status] >= 0} {
|
|
||||||
set fin [string trim [hval /sics/${name}/finishtime]]
|
|
||||||
if {[clock seconds] > $fin} {
|
|
||||||
hset /sics/${name}/internalstatus idle
|
|
||||||
set val [string trim [hval /sics/${name}/initval]]
|
|
||||||
$name set $val
|
|
||||||
set second [string trim [hval /sics/${name}/secondbank]]
|
|
||||||
if {[string compare $second NULL] != 0} {
|
|
||||||
harray /sics/${name}/${second} init $val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $status
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------
|
|
||||||
proc simhm::MakeSimHM {name rank {tof NULL} } {
|
|
||||||
MakeSecHM $name $rank $tof
|
|
||||||
hfactory /sics/${name}/initval plain user int
|
|
||||||
hset /sics/${name}/initval 0
|
|
||||||
|
|
||||||
hfactory /sics/${name}/finishtime plain user int
|
|
||||||
hfactory /sics/${name}/internalstatus plain user text
|
|
||||||
hupdate /sics/${name}/internalstatus idle
|
|
||||||
|
|
||||||
hdel /sics/${name}/control
|
|
||||||
hfactory /sics/${name}/control script \
|
|
||||||
"simhm::getcontrol $name" "simhm::setcontrol $name" float
|
|
||||||
hsetprop /sics/${name}/control priv user
|
|
||||||
|
|
||||||
hdel /sics/${name}/status
|
|
||||||
hfactory /sics/${name}/status script \
|
|
||||||
"simhm::getstatus $name" hdbReadOnly text
|
|
||||||
hsetprop /sics/${name}/control priv user
|
|
||||||
hupdate /sics/${name}/status idle
|
|
||||||
|
|
||||||
hfactory /sics/${name}/secondbank plain user text
|
|
||||||
hupdate /sics/${name}/secondbank NULL
|
|
||||||
}
|
|
||||||
#------------------------------------------------------
|
|
||||||
proc simhm::makeSecond {name bankname length} {
|
|
||||||
hfactory /sics/${name}/${bankname} plain user intvarar $length
|
|
||||||
hupdate /sics/${name}/secondbank $bankname
|
|
||||||
}
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
#--------------------------------------------------------
|
|
||||||
# This is an asynchronous scriptcontext driven driver for
|
|
||||||
# the SINQ style http based histogram memory.
|
|
||||||
#
|
|
||||||
# script chains:
|
|
||||||
# -- control
|
|
||||||
# hmhttpcontrol - hmhttpreply
|
|
||||||
# -- data
|
|
||||||
# hmhttpdata - hmhttpreply
|
|
||||||
# -- status
|
|
||||||
# hmhttpstatus - hmhttpevalstatus -- hmhttpstatusdata
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, May 2009
|
|
||||||
#
|
|
||||||
# You will need to override hmhttpevalstatus to implement
|
|
||||||
# an update of the detector data
|
|
||||||
#
|
|
||||||
# Mark Koennecke, April 2010
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc hmhttpsend {url} {
|
|
||||||
sct send $url
|
|
||||||
return hmhttpreply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc hmhttptest {data} {
|
|
||||||
if {[string first ASCERR $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
if {[string first ERROR $data] >= 0} {
|
|
||||||
error $data
|
|
||||||
}
|
|
||||||
return $data
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc hmhttpreply {} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {hmhttptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
} else {
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc hmhttpcontrol {} {
|
|
||||||
set target [sct target]
|
|
||||||
switch $target {
|
|
||||||
1000 {
|
|
||||||
set ret [hmhttpsend "/admin/startdaq.egi"]
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
[sct controller] queue $path/status progress read
|
|
||||||
return $ret
|
|
||||||
}
|
|
||||||
1001 {return [hmhttpsend "/admin/stopdaq.egi"] }
|
|
||||||
1002 {return [hmhttpsend "/admin/pausedaq.egi"] }
|
|
||||||
1003 {return [hmhttpsend "/admin/continuedaq.egi"]}
|
|
||||||
1005 {
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
set script [hval $path/initscript]
|
|
||||||
set confdata [eval $script]
|
|
||||||
return [hmhttpsend "post:/admin/configure.egi:$confdata"]
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
sct print "ERROR: bad start target $target given to control"
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc hmhttpdata {name} {
|
|
||||||
set len [hval /sics/${name}/datalength]
|
|
||||||
set path "/sics/${name}/data"
|
|
||||||
set com [format "node:%s:/admin/readhmdata.egi?bank=0&start=0&end=%d" $path $len]
|
|
||||||
sct send $com
|
|
||||||
return hmhttpdatareply
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc hmhttpdatareply {} {
|
|
||||||
set status [catch {hmhttpreply} txt]
|
|
||||||
if {$status == 0} {
|
|
||||||
set path [file dirname [sct]]
|
|
||||||
hdelprop $path/data geterror
|
|
||||||
}
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc hmhttpstatus {} {
|
|
||||||
sct send /admin/textstatus.egi
|
|
||||||
return hmhttpevalstatus
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc hmhttpstatusdata {} {
|
|
||||||
catch {hmhttpdatareply}
|
|
||||||
sct update idle
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc hmhttpevalstatus {name} {
|
|
||||||
set reply [sct result]
|
|
||||||
set status [catch {hmhttptest $reply} data]
|
|
||||||
if {$status != 0} {
|
|
||||||
sct geterror $data
|
|
||||||
clientput $data
|
|
||||||
sct update error
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
hdelprop [sct] geterror
|
|
||||||
set lines [split $data \n]
|
|
||||||
foreach line $lines {
|
|
||||||
set ld [split $line :]
|
|
||||||
sct [string trim [lindex $ld 0]] [string trim [lindex $ld 1]]
|
|
||||||
}
|
|
||||||
set daq [sct DAQ]
|
|
||||||
set old [hval [sct]]
|
|
||||||
if {$daq == 1} {
|
|
||||||
sct update run
|
|
||||||
[sct controller] queue [sct] progress read
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
if {[string compare $old idle] != 0} {
|
|
||||||
hmhttpdata $name
|
|
||||||
return hmhttpstatusdata
|
|
||||||
} else {
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------
|
|
||||||
proc MakeHTTPHM {name rank host initscript {tof NULL} } {
|
|
||||||
sicsdatafactory new ${name}transfer
|
|
||||||
makesctcontroller ${name}sct sinqhttp $host ${name}transfer 600 spy 007
|
|
||||||
MakeSecHM $name $rank $tof
|
|
||||||
hsetprop /sics/${name}/control write hmhttpcontrol
|
|
||||||
hsetprop /sics/${name}/control hmhttpreply hmhttpreply
|
|
||||||
${name}sct write /sics/${name}/control
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/data read hmhttpdata $name
|
|
||||||
hsetprop /sics/${name}/data hmhttpdatareply hmhttpdatareply
|
|
||||||
${name}sct poll /sics/${name}/data 120
|
|
||||||
|
|
||||||
hsetprop /sics/${name}/status read hmhttpstatus
|
|
||||||
hsetprop /sics/${name}/status hmhttpevalstatus hmhttpevalstatus $name
|
|
||||||
hsetprop /sics/${name}/status hmhttpstatusdata hmhttpstatusdata
|
|
||||||
${name}sct poll /sics/${name}/status 60
|
|
||||||
|
|
||||||
hfactory /sics/${name}/initscript plain mugger text
|
|
||||||
hset /sics/${name}/initscript $initscript
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
#------------------------------------------------------
|
|
||||||
# This is some code for a standard drivable object in
|
|
||||||
# the scriptcontext system. It implements an empty
|
|
||||||
# object which throws errors when accessed. Users
|
|
||||||
# of such an object can override it to do
|
|
||||||
# something more acceptable. This object also
|
|
||||||
# provides for basic limit checking and status
|
|
||||||
# checking. It can serve as a basis for creating
|
|
||||||
# new drivable objects, for instance environment
|
|
||||||
# control devices. A possible user has as the
|
|
||||||
# first thing in a write script to set the target
|
|
||||||
# node to the desired value.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, November 2009
|
|
||||||
#--------------------------------------------------------
|
|
||||||
|
|
||||||
namespace eval stddrive {}
|
|
||||||
|
|
||||||
proc stddrive::stdcheck {name} {
|
|
||||||
set val [sct target]
|
|
||||||
set upper [hval /sics/${name}/upperlimit]
|
|
||||||
set lower [hval /sics/${name}/lowerlimit]
|
|
||||||
if {$val < $lower || $val > $upper} {
|
|
||||||
error "$val is out of range $lower - $upper for $name"
|
|
||||||
}
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc stddrive::stdstatus {name} {
|
|
||||||
set test [catch {sct geterror} errortxt]
|
|
||||||
if {$test == 0} {
|
|
||||||
return fault
|
|
||||||
}
|
|
||||||
set stop [hval /sics/${name}/stop]
|
|
||||||
if {$stop == 1} {
|
|
||||||
return fault
|
|
||||||
}
|
|
||||||
set target [sct target]
|
|
||||||
set tol [hval /sics/${name}/tolerance]
|
|
||||||
set is [hval /sics/${name}]
|
|
||||||
if {abs($target - $is) < $tol} {
|
|
||||||
return idle
|
|
||||||
} else {
|
|
||||||
[sct controller] queue /sics/${name} progress read
|
|
||||||
return busy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc stddrive::stop {name} {
|
|
||||||
hset /sics/${name}/stop 1
|
|
||||||
return OK
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------
|
|
||||||
proc stddrive::deread {} {
|
|
||||||
sct update -9999.99
|
|
||||||
return idle
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc stddrive::dewrite {name} {
|
|
||||||
# hset /sics/${name}/stop 1
|
|
||||||
error "$name is not configured, cannot drive"
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc stddrive::deconfigure {name} {
|
|
||||||
set allowed [list upperlimit lowerlimit tolerance stop]
|
|
||||||
set nodelist [split [hlist /sics/${name}] \n]
|
|
||||||
foreach node $nodelist {
|
|
||||||
if {[string length $node] < 1} {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if {[lsearch -exact $allowed [string trim $node]] < 0} {
|
|
||||||
clientput "Deleting $node"
|
|
||||||
hdel /sics/${name}/${node}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hsetprop /sics/${name} read stddrive::deread
|
|
||||||
hsetprop /sics/${name} write stddrive::dewrite $name
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------
|
|
||||||
proc stddrive::makestddrive {name sicsclass sct} {
|
|
||||||
makesctdriveobj $name float user $sicsclass $sct
|
|
||||||
hfactory /sics/${name}/tolerance plain user float
|
|
||||||
hset /sics/${name}/tolerance 2.0
|
|
||||||
hfactory /sics/${name}/upperlimit plain user float
|
|
||||||
hset /sics/${name}/upperlimit 300
|
|
||||||
hfactory /sics/${name}/lowerlimit plain user float
|
|
||||||
hset /sics/${name}/lowerlimit 10
|
|
||||||
hfactory /sics/${name}/stop plain user int
|
|
||||||
hset /sics/${name}/stop 0
|
|
||||||
|
|
||||||
hsetprop /sics/${name} checklimits stddrive::stdcheck $name
|
|
||||||
hsetprop /sics/${name} checkstatus stddrive::stdstatus $name
|
|
||||||
hsetprop /sics/${name} halt stddrive::stop $name
|
|
||||||
deconfigure $name
|
|
||||||
$sct write /sics/${name}
|
|
||||||
$sct poll /sics/${name} 60
|
|
||||||
hupdate /sics/${name} -9999.99
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/usr/bin/pagsh.openafs
|
|
||||||
dir=$1
|
|
||||||
export KRB5CCNAME=`/bin/mktemp /tmp/sinqbckXXXXXX`
|
|
||||||
/usr/kerberos/bin/kinit -k -t $dir/kt.sinqbck sinqbck@PSI.CH
|
|
||||||
/usr/bin/aklog -c psi.ch -k PSI.CH
|
|
||||||
$dir/$2
|
|
||||||
/usr/bin/unlog
|
|
||||||
/usr/kerberos/bin/kdestroy
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
#----------------------------------------------------------------------
|
|
||||||
# Support functions for table processing in SICS
|
|
||||||
#
|
|
||||||
# This includes a CSV processing module from someone else. See below.
|
|
||||||
#
|
|
||||||
# copyright: see file COPYRIGHT
|
|
||||||
#
|
|
||||||
# Mark Koennecke, November 2008
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
if { [info exists __tableheader] == 0 } {
|
|
||||||
set __tableheader NULL
|
|
||||||
Publish tableexe User
|
|
||||||
Publish loop User
|
|
||||||
}
|
|
||||||
#=====================================================================
|
|
||||||
# Csv tcl package version 2.0
|
|
||||||
# A tcl library to deal with CSV (comma separated value)
|
|
||||||
# files, generated and readable by some DOS/Windows programs
|
|
||||||
# Contain two functions:
|
|
||||||
# csv2list string ?separator?
|
|
||||||
# and
|
|
||||||
# list2csv list ?separator?
|
|
||||||
# which converts line from CSV file to list and vice versa.
|
|
||||||
#
|
|
||||||
# Both functions have optional "separator argument" becouse some silly
|
|
||||||
# Windows
|
|
||||||
# program might use semicomon as delimiter in COMMA separated values
|
|
||||||
# file.
|
|
||||||
#
|
|
||||||
# Copyright (c) SoftWeyr, 1997-99
|
|
||||||
# Many thanks to Robert Seeger <rseeger1@nycap.rr.com>
|
|
||||||
# for beta-testing and fixing my misprints
|
|
||||||
# This file is distributed under GNU Library Public License. Visit
|
|
||||||
# http://www.gnu.org/copyleft/gpl.html
|
|
||||||
# for details.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Convert line, read from CSV file into proper TCL list
|
|
||||||
# Commas inside quoted strings are not considered list delimiters,
|
|
||||||
# Double quotes inside quoted strings are converted to single quotes
|
|
||||||
# Double quotes are stripped out and replaced with correct Tcl quoting
|
|
||||||
#
|
|
||||||
|
|
||||||
proc csv2list {str {separator ","}} {
|
|
||||||
#build a regexp>
|
|
||||||
set regexp [subst -nocommands \
|
|
||||||
{^[ \t\r\n]*("(([^"]|"")*)"|[^"$separator \t\r]*)}]
|
|
||||||
set regexp1 [subst -nocommands {$regexp[ \t\r\n]*$separator\(.*)$}]
|
|
||||||
set regexp2 [subst -nocommands {$regexp[ \t\r\n]*\$}]
|
|
||||||
set list {}
|
|
||||||
while {[regexp $regexp1 $str junk1 unquoted quoted\
|
|
||||||
junk2 str]} {
|
|
||||||
if {[string length $quoted]||$unquoted=="\"\""} {
|
|
||||||
regsub -all {""} $quoted \" unquoted
|
|
||||||
}
|
|
||||||
lappend list $unquoted
|
|
||||||
}
|
|
||||||
if {[regexp $regexp2 $str junk unquoted quoted]} {
|
|
||||||
if {[string length $quoted]||$unquoted=="\"\""} {
|
|
||||||
regsub -all {""} $quoted \" unquoted
|
|
||||||
}
|
|
||||||
lappend list $unquoted
|
|
||||||
if {[uplevel info exist csvtail]} {
|
|
||||||
uplevel set csvtail {""}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if {[uplevel info exist csvtail]} {
|
|
||||||
uplevel [list set csvtail $str]
|
|
||||||
} else {
|
|
||||||
return -code error -errorcode {CSV 1 "CSV parse error"}\
|
|
||||||
"CSV parse error: unparsed tail \"$str\""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $list
|
|
||||||
}
|
|
||||||
|
|
||||||
proc list2csv {list {separator ","}} {
|
|
||||||
set l {}
|
|
||||||
foreach elem $list {
|
|
||||||
if {[string match {} $elem]||
|
|
||||||
[regexp {^[+-]?([0-9]+|([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?)$}\
|
|
||||||
$elem]} {
|
|
||||||
lappend l $elem
|
|
||||||
} else {
|
|
||||||
regsub -all {"} $elem {""} selem
|
|
||||||
lappend l "\"$selem\""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [join $l $separator]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc csvfile {f {separator ","}} {
|
|
||||||
set csvtail ""
|
|
||||||
set list {}
|
|
||||||
set buffer {}
|
|
||||||
while {[gets $f line]>=0} {
|
|
||||||
if {[string length $csvtail]} {
|
|
||||||
set line "$csvtail\n$line"
|
|
||||||
} elseif {![string length $line]} {
|
|
||||||
lappend list {}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
set rec [csv2list $line $separator]
|
|
||||||
set buffer [concat $buffer $rec]
|
|
||||||
if {![ string length $csvtail]} {
|
|
||||||
lappend list $buffer
|
|
||||||
set buffer {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {[string length $csvtail]} {
|
|
||||||
return -code error -errorcode {CSV 2 "Multiline parse error"}\
|
|
||||||
"CSV file parse error"
|
|
||||||
}
|
|
||||||
return $list
|
|
||||||
}
|
|
||||||
|
|
||||||
proc csvstring {str {separator ","}} {
|
|
||||||
set csvtail ""
|
|
||||||
set list {}
|
|
||||||
set buffer {}
|
|
||||||
foreach line [split $str "\n"] {
|
|
||||||
if {[string length $csvtail]} {
|
|
||||||
set line "$csvtail\n$line"
|
|
||||||
} elseif {![string length $line]} {
|
|
||||||
lappend list {}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
set rec [csv2list $line $separator]
|
|
||||||
set buffer [concat $buffer $rec]
|
|
||||||
if {![ string length $csvtail]} {
|
|
||||||
lappend list $buffer
|
|
||||||
set buffer {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {[string length $cvstail]} {
|
|
||||||
return -code error -errorcode {CSV 2 "Multiline parse error"}\
|
|
||||||
"CSV string parse error"
|
|
||||||
}
|
|
||||||
return $list
|
|
||||||
}
|
|
||||||
|
|
||||||
package provide Csv 2.1
|
|
||||||
#========================================================================
|
|
||||||
# The plan here is such: operations which happen fast or immediatly are
|
|
||||||
# done at once. Count commands or anything given as command is appended
|
|
||||||
# to a list for later execution. The idea is that this contains the
|
|
||||||
# actual measuring payload of the row.
|
|
||||||
# Drivables are immediatly started.
|
|
||||||
# After processing the rows, there is a success to wait for motors to arrive
|
|
||||||
# Then the commands for later execution are run. This frees the user of the
|
|
||||||
# the necessity to have the count or whatever command as the last thing in the row
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
proc testinterrupt {} {
|
|
||||||
set int [getint]
|
|
||||||
if {[string first continue $int] < 0} {
|
|
||||||
error "Interrupted"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
proc processtablerow {line} {
|
|
||||||
global __tableheader
|
|
||||||
set parlist [csv2list $line]
|
|
||||||
for {set i 0} {$i < [llength $__tableheader]} {incr i} {
|
|
||||||
set type [lindex $__tableheader $i]
|
|
||||||
set data [lindex $parlist $i]
|
|
||||||
#--------- first process special types
|
|
||||||
switch $type {
|
|
||||||
monitor {
|
|
||||||
lappend laterExe "count monitor $data"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
timer {
|
|
||||||
lappend laterExe "count timer $data"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
compar {
|
|
||||||
append command [join [lrange $parlist $i end]]
|
|
||||||
lappend laterExe $command
|
|
||||||
break
|
|
||||||
}
|
|
||||||
command {
|
|
||||||
lappend laterExe $data
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
batch {
|
|
||||||
lappend laterExe "exe $data"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#----------- now look for drivables
|
|
||||||
set test [sicstype $type]
|
|
||||||
if {[string compare $test DRIV] == 0} {
|
|
||||||
set status [catch {run $type $data} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $msg for $type with $data"
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
#------------- now look for special objects
|
|
||||||
set objtype [sicsdescriptor $type]
|
|
||||||
switch $objtype {
|
|
||||||
SicsVariable -
|
|
||||||
MulMot -
|
|
||||||
Macro {
|
|
||||||
set status [catch {eval $type $data} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $msg for $type with $data"
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
clientput "Skipping non recognized column $type with data $data"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set status [catch {success} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $msg while waiting for motors to arrive"
|
|
||||||
}
|
|
||||||
testinterrupt
|
|
||||||
foreach command $laterExe {
|
|
||||||
eval $command
|
|
||||||
testinterrupt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc tableexe {tablefile} {
|
|
||||||
global __tableheader
|
|
||||||
if {[string first NULL $__tableheader] < 0} {
|
|
||||||
error "Tableexe already running, terminated"
|
|
||||||
}
|
|
||||||
set fullfile [SplitReply [exe fullpath $tablefile]]
|
|
||||||
set in [open $fullfile r]
|
|
||||||
gets $in header
|
|
||||||
set __tableheader [csv2list $header]
|
|
||||||
while {[gets $in line] > 0} {
|
|
||||||
set status [catch {processtablerow $line} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
set int [getint]
|
|
||||||
if {[string first continue $int] < 0} {
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
clientput "ERROR: $msg while processing row"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close $in
|
|
||||||
set __tableheader NULL
|
|
||||||
return "Done processing table"
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
proc loop args {
|
|
||||||
clientput $args
|
|
||||||
if {[llength $args] < 2} {
|
|
||||||
error \
|
|
||||||
"Usage: loop <no> <sicscommand>\n\t<no> number of repetions\n\t<sicscommand> any SICS command"
|
|
||||||
}
|
|
||||||
set len [lindex $args 0]
|
|
||||||
set command [lrange $args 1 end]
|
|
||||||
for {set i 1} {$i <= $len} {incr i} {
|
|
||||||
clientput "Repetition $i of $len"
|
|
||||||
set status [catch {eval [join $command]} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
clientput "ERROR: $msg while processing loop command"
|
|
||||||
}
|
|
||||||
testinterrupt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#==============================================================================
|
|
||||||
# This is an old attempt
|
|
||||||
#=============================================================================
|
|
||||||
proc __tablescan__ args {
|
|
||||||
global __tableheader
|
|
||||||
|
|
||||||
set idx [lsearch $__tableheader monitor]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set preset [lindex $args $idx]
|
|
||||||
set mode monitor
|
|
||||||
}
|
|
||||||
set idx [lsearch $__tableheader timer]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set preset [lindex $args $idx]
|
|
||||||
set mode timer
|
|
||||||
}
|
|
||||||
|
|
||||||
set idx [lsearch $__tableheader scanvar]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set var [lindex $args $idx]
|
|
||||||
} else {
|
|
||||||
error "ERROR: No scan variable in table"
|
|
||||||
}
|
|
||||||
|
|
||||||
set idx [lsearch $__tableheader scanstart]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set start [lindex $args $idx]
|
|
||||||
} else {
|
|
||||||
error "ERROR: No scan start in table"
|
|
||||||
}
|
|
||||||
|
|
||||||
set idx [lsearch $__tableheader scanend]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set end [lindex $args $idx]
|
|
||||||
} else {
|
|
||||||
error "ERROR: No scan end in table"
|
|
||||||
}
|
|
||||||
|
|
||||||
set idx [lsearch $__tableheader scanstep]
|
|
||||||
if {$idx >= 0} {
|
|
||||||
set step [lindex $args $idx]
|
|
||||||
} else {
|
|
||||||
error "ERROR: No scan step in table"
|
|
||||||
}
|
|
||||||
|
|
||||||
set np [expr abs($end - $start)/$step]
|
|
||||||
xxxscan var $var $start $step
|
|
||||||
xxxscan run $np $mode $preset
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#------------------------------------------------------------------------
|
|
||||||
# tecs: a script to turn on and off temperature
|
|
||||||
#
|
|
||||||
# M. Zolliker, Jun 00
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#--------- some code to do proper initialization if necessary
|
|
||||||
set ret [catch {tecs} msg]
|
|
||||||
if {$ret != 0} {
|
|
||||||
Publish tecs User
|
|
||||||
}
|
|
||||||
|
|
||||||
proc tecs { { arg1 "on"} { arg2 ""} { arg3 ""} } {
|
|
||||||
if {[string compare $arg1 "off"]==0 } {
|
|
||||||
evfactory del temperature
|
|
||||||
return "removed temperature"
|
|
||||||
} elseif {[string compare $arg1 "on"]==0 } {
|
|
||||||
evfactory new temperature tecs
|
|
||||||
return "installed temperature via TECS"
|
|
||||||
} else {
|
|
||||||
temperature $arg1 $arg2 $arg3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,348 +0,0 @@
|
|||||||
#-------------------------------------------------------------------------
|
|
||||||
# Functions for writing NeXus files for a triple axis spectrometer and
|
|
||||||
# configuration of the internal scan object to support this.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, May 2005
|
|
||||||
# reworked to new NeXus standards, Mark Koennecke, February 2007
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
catch {sicsdatafactory new __transfer}
|
|
||||||
set __tasdata(out) ""
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc appendMotor {np motor alias} {
|
|
||||||
set val [tasSplit [$motor]]
|
|
||||||
if { [string length $val] > 0} {
|
|
||||||
__transfer putfloat 0 $val
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
} else {
|
|
||||||
clientput "WARNING: failed to read $motor"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc appendIfPresent {np obj alias} {
|
|
||||||
# sea_get is defined in ~/sea/tcl/remob.tcl
|
|
||||||
set status [catch {sea_get val $obj} msg]
|
|
||||||
if {$status != 0} {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if {$msg} {
|
|
||||||
__transfer putfloat 0 $val
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc appendFloat {np alias val} {
|
|
||||||
if {[string length $val] > 0} {
|
|
||||||
__transfer putfloat 0 $val
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
} else {
|
|
||||||
clientput "WARNING: failed to read $alias"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc appendCount {np value alias} {
|
|
||||||
__transfer putint 0 $value
|
|
||||||
nxscript putslab $alias [list $np] [list 1] __transfer
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc donothing {obj userobj} {
|
|
||||||
}
|
|
||||||
#---------------------------------------------------------------------
|
|
||||||
proc xmlprepare {obj userobj} {
|
|
||||||
global __tasdata
|
|
||||||
#------- normal prepare
|
|
||||||
tasscan prepare $obj $userobj
|
|
||||||
|
|
||||||
#--------- parse out variable
|
|
||||||
set out [tasSplit [output]]
|
|
||||||
if {[string compare [string toupper $out] "UNKNOWN"]==0} {
|
|
||||||
set out ""
|
|
||||||
}
|
|
||||||
set out [string map { "=" " " "," " "} $out]
|
|
||||||
set outlist [split $out]
|
|
||||||
foreach var $outlist {
|
|
||||||
if { [string length $var] > 1} {
|
|
||||||
set ret [catch {tasSplit [$var]} msg]
|
|
||||||
if {$ret == 0} {
|
|
||||||
lappend __tasdata(out) $var
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#------- build Header
|
|
||||||
append head " PNT "
|
|
||||||
set scanvars [split [tasSplit [iscan getscanvars]]]
|
|
||||||
foreach var $scanvars {
|
|
||||||
if { [string length $var] > 1} {
|
|
||||||
append head [format "%9s " [string toupper $var]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach var $__tasdata(out) {
|
|
||||||
append head [format "%9s " [string toupper $var]]
|
|
||||||
}
|
|
||||||
append head [format "%8s " M1]
|
|
||||||
append head [format "%8s " M2]
|
|
||||||
append head [format "%8s " TIME]
|
|
||||||
append head [format "%8s " CNTS]
|
|
||||||
append head [format "%8s " CTOT]
|
|
||||||
clientput $head
|
|
||||||
|
|
||||||
set __tasdata(starttime) [sicstime]
|
|
||||||
|
|
||||||
xmltaswrite $obj $userobj
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc xmlwritepoint {obj userobj np} {
|
|
||||||
global __tasdata scripthome
|
|
||||||
|
|
||||||
nxscript reopen $__tasdata(file) $scripthome/tasub.dic
|
|
||||||
|
|
||||||
append line [format " %3d" $np]
|
|
||||||
set scanvars [split [tasSplit [iscan getscanvars]]]
|
|
||||||
foreach var $scanvars {
|
|
||||||
if { [string length $var] > 1} {
|
|
||||||
set val [tasSplit [eval $var]]
|
|
||||||
append line [format "%9.4f " [tasSplit [$var]]]
|
|
||||||
appendMotor $np $var sc_$var
|
|
||||||
lappend storedvars $var
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach var $__tasdata(out) {
|
|
||||||
append line [format "%9.4f " [tasSplit [eval $var]]]
|
|
||||||
appendMotor $np $var sc_$var
|
|
||||||
lappend storedvars $var
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
append line [format "%8d " [tasSplit [counter getmonitor 1]]]
|
|
||||||
append line [format "%8d " [tasSplit [counter getmonitor 2]]]
|
|
||||||
append line [format "%8.2f " [tasSplit [counter gettime]]]
|
|
||||||
append line [format "%8d " [tasSplit [counter getcounts]]]
|
|
||||||
clientput $line
|
|
||||||
|
|
||||||
appendCount $np [tasSplit [counter getcounts]] counts
|
|
||||||
appendCount $np [tasSplit [counter getmonitor 1]] cter_01
|
|
||||||
appendCount $np [tasSplit [counter getcounts]] cter_02
|
|
||||||
appendFloat $np motime [tasSplit [counter gettime]]
|
|
||||||
|
|
||||||
set varlist [list qh qk ql qm en ei ef a1 a2 a3 a4 a5 a6 sgu sgl]
|
|
||||||
|
|
||||||
foreach var $varlist {
|
|
||||||
if {[lsearch $storedvars $var] < 0} {
|
|
||||||
appendMotor $np $var sc_${var}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if {$np == 0} {
|
|
||||||
makeTASLinks
|
|
||||||
}
|
|
||||||
|
|
||||||
nxscript close
|
|
||||||
}
|
|
||||||
#====================== actual XML stuff ============================
|
|
||||||
proc writeUserData {} {
|
|
||||||
writeTextVar usnam user
|
|
||||||
writeTextVar usaff affiliation
|
|
||||||
writeTextVar usadd address
|
|
||||||
writeTextVar usmail email
|
|
||||||
writeTextVar lonam local
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc writeMonochromator {} {
|
|
||||||
global __tasdata
|
|
||||||
nxscript puttext mono_type "Pyrolytic Graphite"
|
|
||||||
appendMotor 0 mcv sc_mcv
|
|
||||||
nxscript putfloat mono_dd [tasSplit [tasub mono dd]]
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc writeAnalyzer {} {
|
|
||||||
global __tasdata
|
|
||||||
nxscript puttext ana_type "Pyrolytic Graphite"
|
|
||||||
nxscript putfloat ana_dd [tasSplit [tasub ana dd]]
|
|
||||||
set sa [tasSplit [tasub ss]]
|
|
||||||
if {$sa == 1} {
|
|
||||||
set az 0.
|
|
||||||
} else {
|
|
||||||
set az 180.
|
|
||||||
}
|
|
||||||
nxscript putfloat ana_az $az
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc writeDetector {} {
|
|
||||||
global __tasdata
|
|
||||||
set sa [tasSplit [tasub ana ss]]
|
|
||||||
if {$sa == 1} {
|
|
||||||
set az 0.
|
|
||||||
} else {
|
|
||||||
set az 180.
|
|
||||||
}
|
|
||||||
nxscript putfloat det_az $az
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc writeMonitor {} {
|
|
||||||
nxscript putcounter cter counter
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------
|
|
||||||
proc writeSample {} {
|
|
||||||
global __tasdata
|
|
||||||
tasscan nxdump nxscript sa
|
|
||||||
writeTextVar sanam sample
|
|
||||||
set sa [tasSplit [tasub mono ss]]
|
|
||||||
if {$sa == 1} {
|
|
||||||
set az 0.
|
|
||||||
} else {
|
|
||||||
set az 180.
|
|
||||||
}
|
|
||||||
nxscript putfloat saaz $az
|
|
||||||
}
|
|
||||||
#-----------------------------------------------------------------
|
|
||||||
proc writePowderSample {} {
|
|
||||||
global __tasdata
|
|
||||||
tasscan nxdump nxscript sa
|
|
||||||
writeTextVar sanam sample
|
|
||||||
set sa [tasSplit [tasub mono ss]]
|
|
||||||
if {$sa == 1} {
|
|
||||||
set az 0.
|
|
||||||
} else {
|
|
||||||
set az 180.
|
|
||||||
}
|
|
||||||
nxscript putfloat saaz $az
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc makeTASLinks {} {
|
|
||||||
nxscript makelink dana sc_ei
|
|
||||||
nxscript makelink dana sc_ef
|
|
||||||
nxscript makelink dana sc_qh
|
|
||||||
nxscript makelink dana sc_qk
|
|
||||||
nxscript makelink dana sc_ql
|
|
||||||
nxscript makelink dana sc_en
|
|
||||||
nxscript makelink dana counts
|
|
||||||
}
|
|
||||||
#------------------------------------------------------------------
|
|
||||||
proc makePowderLinks {} {
|
|
||||||
nxscript makelink dana sc_ei
|
|
||||||
nxscript makelink dana sc_ef
|
|
||||||
nxscript makelink dana sc_qm
|
|
||||||
nxscript makelink dana sc_en
|
|
||||||
nxscript makelink dana counts
|
|
||||||
}
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
proc makeScanLinks {} {
|
|
||||||
set alreadyLinked [list sc_ei sc_ef sc_qh sc_qf sc_qk sc_en sc_qm]
|
|
||||||
set nscan [tasSplit [iscan noscanvar]]
|
|
||||||
set axis 0
|
|
||||||
for {set i 0} {$i < $nscan} {incr i } {
|
|
||||||
set varpar [iscan getvarpar $i]
|
|
||||||
set l [split $varpar =]
|
|
||||||
set var [lindex $l 0]
|
|
||||||
set idx [string first . $var]
|
|
||||||
set var [string range $var [expr $idx + 1] end]
|
|
||||||
set alias [format "sc_%s" [string trim $var]]
|
|
||||||
set testalias [string trim [tasSplit [nxscript isalias $alias]]]
|
|
||||||
if {[lsearch $alreadyLinked $alias] < 0} {
|
|
||||||
if {$testalias == 1} {
|
|
||||||
nxscript makelink dana $alias
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$axis == 0} {
|
|
||||||
set step [string trim [lindex $l 2]]
|
|
||||||
if {abs($step) > .001} {
|
|
||||||
if {$testalias == 1} {
|
|
||||||
nxscript putattribute $alias axis 1
|
|
||||||
set axis 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# if axis = 0 there is no alias; so we create something in here from the
|
|
||||||
# scan data in iscan
|
|
||||||
if {$axis == 0} {
|
|
||||||
set data [tasSplit [iscan getvardata 0]]
|
|
||||||
set count 0
|
|
||||||
foreach e $data {
|
|
||||||
set ar($count) [string trim $e]
|
|
||||||
incr count
|
|
||||||
}
|
|
||||||
nxscript putarray danascanvar ar [llength $data]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc xmltaswrite {obj userobj} {
|
|
||||||
global home __tasdata
|
|
||||||
|
|
||||||
set fil [string trim [tasSplit [iscan getfile]]]
|
|
||||||
nxscript createxml $fil $home/tasub.dic
|
|
||||||
set __tasdata(file) $fil
|
|
||||||
|
|
||||||
writeTextVar etitle title
|
|
||||||
nxscript puttext estart $__tasdata(starttime)
|
|
||||||
nxscript puttext eend [sicstime]
|
|
||||||
nxscript puttext edef NXmonotas
|
|
||||||
nxscript putglobal file_name $fil
|
|
||||||
nxscript putglobal file_time [sicstime]
|
|
||||||
|
|
||||||
nxscript updatedictvar NP [tasSplit [iscan np]]
|
|
||||||
nxscript updatedictvar INSTRUMENT [tasSplit [instrument]]
|
|
||||||
|
|
||||||
writeUserData
|
|
||||||
|
|
||||||
writeMonochromator
|
|
||||||
|
|
||||||
writeMonitor
|
|
||||||
|
|
||||||
writeSample
|
|
||||||
|
|
||||||
writeAnalyzer
|
|
||||||
|
|
||||||
writeDetector
|
|
||||||
|
|
||||||
|
|
||||||
nxscript close
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc xmlpowderwrite {obj userobj} {
|
|
||||||
global home __tasdata
|
|
||||||
|
|
||||||
set fil [string trim [tasSplit [iscan getfile]]]
|
|
||||||
nxscript createxml $fil $home/tasub.dic
|
|
||||||
set __tasData(file) $fil
|
|
||||||
|
|
||||||
writeTextVar etitle title
|
|
||||||
nxscript puttext estart $__tasdata(starttime)
|
|
||||||
nxscript puttext eend [sicstime]
|
|
||||||
nxscript puttext edef NXmonotas
|
|
||||||
nxscript putglobal file_name $fil
|
|
||||||
nxscript putglobal file_time [sicstime]
|
|
||||||
|
|
||||||
nxscript updatedictvar NP [tasSplit [iscan np]]
|
|
||||||
nxscript updatedictvar INSTRUMENT [tasSplit [instrument]]
|
|
||||||
|
|
||||||
writeUserData
|
|
||||||
|
|
||||||
writeMonochromator
|
|
||||||
|
|
||||||
writeMonitor
|
|
||||||
|
|
||||||
writePowderSample
|
|
||||||
|
|
||||||
writeAnalyzer
|
|
||||||
|
|
||||||
writeDetector
|
|
||||||
|
|
||||||
makePowderLinks
|
|
||||||
|
|
||||||
nxscript close
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
proc xmlfinish {obj userobj} {
|
|
||||||
}
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
proc initxmlscan {} {
|
|
||||||
iscan configure script
|
|
||||||
iscan function writeheader donothing
|
|
||||||
iscan function prepare xmlprepare
|
|
||||||
iscan function drive tasscan drive
|
|
||||||
iscan function count tasscan count
|
|
||||||
iscan function collect tasscan collect
|
|
||||||
iscan function writepoint xmlwritepoint
|
|
||||||
iscan function finish xmlfinish
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
##NXDICT-1.0
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# NeXus dictionary file for a triple axis spectrometer following
|
|
||||||
# the instrument definition as of May 2005
|
|
||||||
#
|
|
||||||
# Do not modify this file if you do not knwo what you are doing,
|
|
||||||
# you may corrupt your data files!
|
|
||||||
#
|
|
||||||
# Mark Koennecke, May 2005
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
NP=1
|
|
||||||
INSTRUMENT=TASUB
|
|
||||||
#--------- entry level
|
|
||||||
etitle=/entry1,NXentry/SDS title -type NX_CHAR -rank 1
|
|
||||||
estart=/entry1,NXentry/SDS start_time -type DFNT_CHAR -rank 1
|
|
||||||
eend=/entry1,NXentry/SDS end_time -type DFNT_CHAR -rank 1
|
|
||||||
edef=/entry1,NXentry/SDS definition -type DFNT_CHAR -rank 1 \
|
|
||||||
-attr {URL,http://www.nexus.anl.gov/instruments/xml/NXmonotas.xml} \
|
|
||||||
-attr {version,1.0}
|
|
||||||
#---------- looser
|
|
||||||
usnam=/entry1,NXentry/user,NXuser/SDS name -type NX_CHAR -rank 1
|
|
||||||
usaff=/entry1,NXentry/user,NXuser/SDS affiliation -type NX_CHAR -rank 1
|
|
||||||
usadd=/entry1,NXentry/user,NXuser/SDS address -type NX_CHAR -rank 1
|
|
||||||
usmail=/entry1,NXentry/user,NXuser/SDS email -type NX_CHAR -rank 1
|
|
||||||
#---------- local contact
|
|
||||||
lonam=/entry1,NXentry/local_contact,NXuser/SDS name -type NX_CHAR -rank 1
|
|
||||||
#------------- sample
|
|
||||||
sanam=/entry1,NXentry/sample,NXsample/SDS name -type NX_CHAR -rank 1
|
|
||||||
sa_cell=/entry1,NXentry/sample,NXsample/SDS unit_cell -rank 1 -dim {6}
|
|
||||||
sa_norm=/entry1,NXentry/sample,NXsample/SDS plane_normal -rank 1 -dim {3}
|
|
||||||
sa_vec1=/entry1,NXentry/sample,NXsample/SDS plane_vector_1 -rank 1 -dim {3}
|
|
||||||
sa_vec2=/entry1,NXentry/sample,NXsample/SDS plane_vector_2 -rank 1 -dim {3}
|
|
||||||
sa_ub=/entry1,NXentry/sample,NXsample/SDS orientation_matrix -rank 2 \
|
|
||||||
-dim {3,3}
|
|
||||||
sapol=/entry1,NXentry/sample,NXsample/SDS polar_angle \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
saa3=/entry1,NXentry/sample,NXsample/SDS rotation_angle \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
sasgl=/entry1,NXentry/sample,NXsample/SDS sgl \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
sasgu=/entry1,NXentry/sample,NXsample/SDS sgu \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
saqh=/entry1,NXentry/sample,NXsample/SDS Qh -rank 1
|
|
||||||
saqk=/entry1,NXentry/sample,NXsample/SDS Qk -rank 1
|
|
||||||
saql=/entry1,NXentry/sample,NXsample/SDS Ql -rank 1
|
|
||||||
saqm=/entry1,NXentry/sample,NXsample/SDS Qm -rank 1
|
|
||||||
saen=/entry1,NXentry/sample,NXsample/SDS energy_transfer -rank 1 \
|
|
||||||
-attr {units,mev}
|
|
||||||
saaz=/entry1,NXentry/sample,NXsample/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
#----------- monochromator
|
|
||||||
mono_type=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS type -type NX_CHAR -rank 1
|
|
||||||
mono_e=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS energy -rank 1 -dim {$(NP)} \
|
|
||||||
-attr {units,mev}
|
|
||||||
mono_theta=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS rotation_angle \
|
|
||||||
-rank 1 -dim {$(NP)} -attr {units,degree}
|
|
||||||
mono_dd=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS d_spacing -attr {units,Angstroem}
|
|
||||||
#----------- analyzer
|
|
||||||
ana_type=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS type -type NX_CHAR -rank 1
|
|
||||||
ana_e=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS energy -rank 1 -dim {$(NP)} \
|
|
||||||
-attr {units,mev}
|
|
||||||
ana_theta=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS rotation_angle \
|
|
||||||
-rank 1 -dim {$(NP)} -attr {units\,degree}
|
|
||||||
ana_pol=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS polar_angle -rank 1 -dim {$(NP)} \
|
|
||||||
-attr {units,degree}
|
|
||||||
ana_dd=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS d_spacing -attr {units,Angstroem}
|
|
||||||
ana_az=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
#--------- detector
|
|
||||||
det_pol=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS polar_angle -rank 1 -dim {$(NP)} \
|
|
||||||
-attr {units,degree}
|
|
||||||
counts=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS counts -type NX_INT32 -rank 1 -dim {$(NP)} \
|
|
||||||
-attr {units,degree} -attr {signal,1}
|
|
||||||
det_az=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
#------- monitors
|
|
||||||
cter_mode=/entry1,NXentry/control,NXmonitor/SDS mode -type NX_CHAR -rank 1 -dim {30}
|
|
||||||
cter_preset=/entry1,NXentry/control,NXmonitor/SDS preset
|
|
||||||
motime=/entry1,NXentry/control,NXmonitor/SDS time -attr {units,seconds} -rank 1 -dim {$(NP)}
|
|
||||||
mo01=/entry1,NXentry/control,NXmonitor/SDS data -type NX_INT32 -rank 1 -dim {$(NP)}
|
|
||||||
mo02=/entry1,NXentry/sample_stage,NXmonitor/SDS data -type NX_INT32 -rank 1 -dim {$(NP)}
|
|
||||||
#------- NXdata
|
|
||||||
dana=/entry1,NXentry/data,NXdata/NXVGROUP
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
*************************** TOPSI Data File ********************************
|
|
||||||
Title = !!VAR(Title)!!
|
|
||||||
User = !!VAR(User)!!
|
|
||||||
File Creation Stardate: !!DATE!!
|
|
||||||
****************************************************************************
|
|
||||||
Monochromator Lamda = !!DRIV(lambda)!!
|
|
||||||
Monochromator A1 = !!DRIV(A1)!!
|
|
||||||
Monochromator A2 = !!DRIV(A2)!!
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
Sample STL = !!DRIV(STL)!!
|
|
||||||
Sample STU = !!DRIV(STU)!!
|
|
||||||
Sample SGL = !!DRIV(SGL)!!
|
|
||||||
Sample SGU = !!DRIV(SGU)!!
|
|
||||||
Zero STL = !!ZERO(STL)!!
|
|
||||||
Zero STU = !!ZERO(STU)!!
|
|
||||||
Zero SGL = !!ZERO(SGL)!!
|
|
||||||
Zero SGU = !!ZERO(SGU)!!
|
|
||||||
!!SCANZERO!!
|
|
||||||
**************************** DATA ******************************************
|
|
||||||
@@ -1,286 +0,0 @@
|
|||||||
# --------------------------------------------------------------------------
|
|
||||||
# Initialization script for Triple Axis Instruments using the
|
|
||||||
# Mark Lumsden UB matrix calculus
|
|
||||||
#
|
|
||||||
# Dr. Mark Koennecke, May 2005
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# O P T I O N S
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# simMode
|
|
||||||
# - 0 real instrument
|
|
||||||
# - 1 development simulation
|
|
||||||
# - 2 simserver at instrument
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
set simMode 1
|
|
||||||
|
|
||||||
set ts psts230.psi.ch
|
|
||||||
set mupad 0
|
|
||||||
|
|
||||||
#---------- Enable this for more startup debugging
|
|
||||||
protocol set all
|
|
||||||
|
|
||||||
#--------------- define home
|
|
||||||
if {$simMode == 1} {
|
|
||||||
set home $env(HOME)/src/workspace/sics/sim/taspub_sics
|
|
||||||
set scripthome $home
|
|
||||||
set loghome $env(HOME)/src/workspace/sics/sim/tmp
|
|
||||||
set datahome $loghome
|
|
||||||
ServerOption LoggerDir $env(HOME)/src/workspace/sics/test/samenv
|
|
||||||
} else {
|
|
||||||
set home /home/taspub
|
|
||||||
set scripthome $home/taspub_sics
|
|
||||||
set loghome $home/log
|
|
||||||
set datahome $home/data/2010
|
|
||||||
ServerOption LoggerDir $home/sea/logger
|
|
||||||
}
|
|
||||||
|
|
||||||
#ServerOption RedirectFile $loghome/stdtas
|
|
||||||
|
|
||||||
ServerOption ReadTimeOut 10
|
|
||||||
|
|
||||||
ServerOption AcceptTimeOut 10
|
|
||||||
|
|
||||||
ServerOption ReadUserPasswdTimeout 500000
|
|
||||||
|
|
||||||
ServerOption LogFileBaseName $loghome/tasplog
|
|
||||||
|
|
||||||
ServerOption ServerPort 2911
|
|
||||||
|
|
||||||
ServerOption InterruptPort 2917
|
|
||||||
|
|
||||||
ServerOption LogFileDir $loghome
|
|
||||||
|
|
||||||
ServerOption QuieckPort 2108
|
|
||||||
|
|
||||||
ServerOption statusfile $datahome/taspubstat.tcl
|
|
||||||
|
|
||||||
# Telnet Options
|
|
||||||
ServerOption TelnetPort 1301
|
|
||||||
ServerOption TelWord sicslogin
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# U S E R S
|
|
||||||
|
|
||||||
# Here the SICS users are specified
|
|
||||||
# Syntax: SicsUser name password userRightsCode
|
|
||||||
#SicsUser Spy 007 3
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
SicsUser Spy 007 1
|
|
||||||
SicsUser Manager Manager 1
|
|
||||||
SicsUser lnsmanager lnsSICSlns 1
|
|
||||||
SicsUser user 10lns1 2
|
|
||||||
SicsUser taspuser 10lns1 2
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# M O T O R S
|
|
||||||
|
|
||||||
if {$simMode == 0} {
|
|
||||||
|
|
||||||
MakeRS232Controller mota $ts 3002
|
|
||||||
mota replyterminator 0xd
|
|
||||||
mota timeout 1000
|
|
||||||
mota send "RMT 1"
|
|
||||||
mota send "ECHO 0"
|
|
||||||
mota send "RMT 1"
|
|
||||||
mota send "ECHO 0"
|
|
||||||
#mota debug 1
|
|
||||||
|
|
||||||
Motor A1 el734hp mota 1 # Monochromator Theta
|
|
||||||
a1 interruptmode 1
|
|
||||||
Motor A2 el734hp mota 9 # Monochromator Two-Theta
|
|
||||||
a2 interruptmode 1
|
|
||||||
Motor A3 el734hp mota 10 # Sample theta or omega
|
|
||||||
a3 interruptmode 1
|
|
||||||
Motor A4 el734hp mota 11 # Sample Two-Theta
|
|
||||||
a4 interruptmode 1
|
|
||||||
Motor MCV el734hp mota 3 # Monochromator curvature vertical
|
|
||||||
Motor SRO el734hp mota 12 # Sample table second ring
|
|
||||||
Motor MTL el734hp mota 4 # Monochromator translation lower
|
|
||||||
Motor MTU el734hp mota 5 # Monochromator Translation upper
|
|
||||||
Motor MGL el734hp mota 7 # Monochromator lower goniometer
|
|
||||||
|
|
||||||
|
|
||||||
MakeRS232Controller motb $ts 3003
|
|
||||||
motb replyterminator 0xd
|
|
||||||
motb timeout 1000
|
|
||||||
motb send "RMT 1"
|
|
||||||
motb send "ECHO 0"
|
|
||||||
motb send "RMT 1"
|
|
||||||
motb send "ECHO 0"
|
|
||||||
|
|
||||||
Motor A5 el734hp motb 5 # Analyzer Theta
|
|
||||||
a5 interruptmode 1
|
|
||||||
Motor A6 el734hp motb 9 # Analyzer Two-Theta
|
|
||||||
a6 interruptmode 1
|
|
||||||
Motor ACH el734hp motb 6 # Analyzer curvature horizontal
|
|
||||||
Motor STL el734hp motb 1 # Sample lower translation
|
|
||||||
Motor STU el734hp motb 2 # Sample upper translation
|
|
||||||
Motor ATL el734hp motb 7 # Analyzer lower translation
|
|
||||||
Motor ATU el734hp motb 8 # Analyzer upper translation
|
|
||||||
#Motor SGL SIM -17 17 -1 .0 # Monochromator upper goniometer
|
|
||||||
#Motor SGU SIM -17 17 -1 .0 # Monochromator upper goniometer
|
|
||||||
Motor SGL el734hp motb 3 # Sample lower goniometer
|
|
||||||
Motor SGU el734hp motb 4 # Sample upper goniometer
|
|
||||||
Motor AGL el734hp motb 11 # Analyzer lower goniometer
|
|
||||||
#Motor AGU SIM -30. 30. -.1 2. # Analyzer upper goniometer
|
|
||||||
#Motor MSC SIM -30. 30. -.1 2. # Monochromator changer
|
|
||||||
#Motor ASC SIM -30. 30. -.1 2. # Analyzer changer
|
|
||||||
#Motor CSC SIM -30. 30. -.1 2. # Collimator changer
|
|
||||||
mcv precision .1
|
|
||||||
} else {
|
|
||||||
Motor A1 sim -86.7 6.1 -.1 .1 # Monochromator Theta
|
|
||||||
Motor A2 sim -128.5 -21.65 -.1 .1 # Monochromator Two-Theta
|
|
||||||
Motor A3 sim -179 170 -.1 .1 # Sample theta or omega
|
|
||||||
Motor A4 sim -135 137.9 -.1 .1 # Sample Two-Theta
|
|
||||||
Motor A5 sim -103 103 -.1 .1 # Analyzer Theta
|
|
||||||
Motor A6 sim -138 118 -.1 .1 # Analyzer Two-Theta
|
|
||||||
Motor MCV sim -9 124 -.1 .1 # Monochromator curvature vertical
|
|
||||||
Motor SRO sim -180 351 -.1 .1 # Sample table second ring
|
|
||||||
Motor ACH sim -.5 11 -.1 .1 # Analyzer curvature horizontal
|
|
||||||
Motor MTL sim -17 17 -.1 .1 # Monochromator translation lower
|
|
||||||
Motor MTU sim -17 17 -.1 .1 # Monochromator Translation upper
|
|
||||||
Motor SGL sim -19 19 -1. 0 # Sample lower translation
|
|
||||||
Motor SGU SIM -30. 30. -.1 2. # Sample upper translation
|
|
||||||
Motor ATL sim -17 17 -.1 .1 # Analyzer lower translation
|
|
||||||
Motor ATU sim -17 17 -.1 .1 # Analyzer upper translation
|
|
||||||
Motor MGL sim -10 10 -.1 .1 # Monochromator lower goniometer
|
|
||||||
Motor SGL sim -16 16 -.1 .1 # Sample lower goniometer
|
|
||||||
Motor SGU sim -16 16 -.1 .1 # Sample upper goniometer
|
|
||||||
Motor AGL sim -10 10 -.1 .1 # Analyzer lower goniometer
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# C U R R E N T S
|
|
||||||
Motor I1 sim -2 2 -0.1 0.1
|
|
||||||
Motor I2 sim -2 2 -0.1 0.1
|
|
||||||
Motor I3 sim -2 2 -0.1 0.1
|
|
||||||
Motor I4 sim -2 2 -0.1 0.1
|
|
||||||
Motor I5 sim -2 2 -0.1 0.1
|
|
||||||
Motor I6 sim -2 2 -0.1 0.1
|
|
||||||
Motor I7 sim -2 2 -0.1 0.1
|
|
||||||
Motor I8 sim -2 2 -0.1 0.1
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#--------- script for saving motor parameters
|
|
||||||
Publish savemotorpar Mugger
|
|
||||||
proc savemotorpar {dir} {
|
|
||||||
set mot(controllerlist) [list mota motb]
|
|
||||||
set mot(mota) [list 1 9 10 11 3 12 4 5 7]
|
|
||||||
set mot(motb) [list 5 9 6 1 2 7 8 3 4 11]
|
|
||||||
savemotorarray mot $dir
|
|
||||||
clientput "Done saving motor parameters"
|
|
||||||
}
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# C O U N T E R
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
if {$simMode == 0} {
|
|
||||||
MakeCounter counter el737hp $ts 3004
|
|
||||||
} else {
|
|
||||||
MakeCounter counter sim -1.
|
|
||||||
}
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
VarMake instrument Text Mugger
|
|
||||||
instrument TASPUB
|
|
||||||
instrument lock
|
|
||||||
|
|
||||||
VarMake title Text User
|
|
||||||
VarMake user Text User
|
|
||||||
VarMake affiliation Text User
|
|
||||||
VarMake address Text User
|
|
||||||
VarMake email Text User
|
|
||||||
VarMake lastscancommand Text User
|
|
||||||
VarMake output Text User
|
|
||||||
VarMake local Text User
|
|
||||||
VarMake sample Text User
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# I N S T A L L M U P A D
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
if {$mupad == 1} {
|
|
||||||
source $scripthome/mupad.tcl
|
|
||||||
# new mupad commands by M.Z.
|
|
||||||
set mudata(sim) 0
|
|
||||||
source $scripthome/muco.tcl
|
|
||||||
source $scripthome/stddrive.tcl
|
|
||||||
source $scripthome/slsecho.tcl
|
|
||||||
if {$simMode == 0} {
|
|
||||||
makesctcontroller slssct slsecho taspmagnet:5001
|
|
||||||
slsecho::makeslsecho i1 0 slssct
|
|
||||||
slsecho::makeslsecho i2 1 slssct
|
|
||||||
slsecho::makeslsecho i3 2 slssct
|
|
||||||
slsecho::makeslsecho i4 3 slssct
|
|
||||||
slsecho::makeslsecho i5 4 slssct
|
|
||||||
slsecho::makeslsecho i6 5 slssct
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
# Polarisation file
|
|
||||||
VarMake polfile Text User
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
# Datafile generation variables
|
|
||||||
VarMake SicsDataPath Text Mugger
|
|
||||||
SicsDataPath "$datahome/"
|
|
||||||
sicsdatapath lock
|
|
||||||
VarMake SicsDataPrefix Text Mugger
|
|
||||||
SicsDataPrefix taspub
|
|
||||||
SicsDataPrefix lock
|
|
||||||
VarMake SicsDataPostFix Text Mugger
|
|
||||||
SicsDataPostFix ".xml"
|
|
||||||
#SicsDataPostFix ".scn"
|
|
||||||
SicsDataPostFix lock
|
|
||||||
MakeDataNumber SicsDataNumber "$datahome/DataNumber"
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
# Collimation etc. parameters
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
VarMake alf1 Float User
|
|
||||||
VarMake alf2 Float User
|
|
||||||
VarMake alf3 Float User
|
|
||||||
VarMake alf4 Float User
|
|
||||||
VarMake bet1 Float User
|
|
||||||
VarMake bet2 Float User
|
|
||||||
VarMake bet3 Float User
|
|
||||||
VarMake bet4 Float User
|
|
||||||
VarMake ETAM Float User
|
|
||||||
VarMake ETAS Float User
|
|
||||||
VarMake ETAA Float User
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# A helper variable for the status display
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
VarMake scaninfo text Internal
|
|
||||||
scaninfo "0,Unknown,1.0,.1"
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
# I N S T A L L S P E C I A L T A S C O M M A N D S
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
MakeTasUB tasub
|
|
||||||
#--------------------------- TAS scan command
|
|
||||||
MakeScanCommand iscan counter tas.hdd recover.bin
|
|
||||||
MakePeakCenter iscan
|
|
||||||
MakeTasScan iscan tasub
|
|
||||||
#-------------------------- new exe manager
|
|
||||||
definealias do exe
|
|
||||||
alias batchroot exe batchpath
|
|
||||||
#-------------------------- normal drive command
|
|
||||||
MakeDrive
|
|
||||||
#-------------------------- for NeXus
|
|
||||||
MakeNXScript
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
# I N S T A L L T A S U B S C R I P T E D C O M M A N D S
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
source $scripthome/taspubcom.tcl
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
# stuff for sea
|
|
||||||
|
|
||||||
if {$simMode == 0} {
|
|
||||||
definealias tem temperature
|
|
||||||
source $home/sea/tcl/remob.tcl
|
|
||||||
connect_sea
|
|
||||||
#-------------------------------------------------------------------------
|
|
||||||
# SPS to look at guide field
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
MakeSPS sps $ts 3006 10
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
restore
|
|
||||||
|
|
||||||
sicscron 10 backupCron $datahome/statusHistory
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#---------------------------------------------------------------------------
|
|
||||||
# The triple axis people love to have the command set emulate the command
|
|
||||||
# set of TASMAD as closely as possible. This is implemented through
|
|
||||||
# some scripting. This version is for the new syntax to be used with the
|
|
||||||
# new UB matrix calculaus for triple axis.
|
|
||||||
#
|
|
||||||
# Mark Koennecke, May 2005
|
|
||||||
#--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
proc SplitReply { text } {
|
|
||||||
set l [split $text =]
|
|
||||||
return [string trim [lindex $l 1]]
|
|
||||||
}
|
|
||||||
|
|
||||||
source $scripthome/nxtas.tcl
|
|
||||||
source $scripthome/nxsupport.tcl
|
|
||||||
source $scripthome/tasscript.tcl
|
|
||||||
|
|
||||||
initxmlscan
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
|
||||||
proc wwwsics {} {
|
|
||||||
append result "<table BORDER=2>\n"
|
|
||||||
append result "<tr><th>User</th> <td>" [tasSplit [user]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>Title</th> <td>"
|
|
||||||
append result [tasSplit [title]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>Status</th> <td>"
|
|
||||||
append result [tasSplit [status]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>Last Scan Command</th> <td>"
|
|
||||||
append result [tasSplit [lastcommand]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>A1</td><td>"
|
|
||||||
append result [tasSplit [a1]] "</td><th>A2</th><td>"
|
|
||||||
append result [tasSplit [a2]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>A3</td><td>"
|
|
||||||
append result [tasSplit [a3]] "</td><th>A4</th><td>"
|
|
||||||
append result [tasSplit [a4]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>A5</td><td>"
|
|
||||||
append result [tasSplit [a5]] "</td><th>A6</th><td>"
|
|
||||||
append result [tasSplit [a6]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>Ki</th><td>" [tasSplit [ki]] "</td>"
|
|
||||||
append result "<th>Kf</th><td>" [tasSplit [kf]] "</td>"
|
|
||||||
append result "<th>En</th><td>" [tasSplit [en]] "</td></tr>\n"
|
|
||||||
append result "<tr><th>Qh</th><td>" [tasSplit [qh]] "</td>"
|
|
||||||
append result "<th>Qk</th><td>" [tasSplit [qk]] "</td>"
|
|
||||||
append result "<th>Ql</th><td>" [tasSplit [ql]] "</td></tr>\n"
|
|
||||||
append result "</table>\n"
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,138 +0,0 @@
|
|||||||
##NXDICT-1.0
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
# NeXus dictionary file for a triple axis spectrometer following
|
|
||||||
# the instrument definition as of May 2005
|
|
||||||
#
|
|
||||||
# Do not modify this file if you do not knwo what you are doing,
|
|
||||||
# you may corrupt your data files!
|
|
||||||
#
|
|
||||||
# Mark Koennecke, May 2005
|
|
||||||
# Mark Koennecke, August 2006
|
|
||||||
# Change to new NeXus standards, Mark Koennecke, February 2007
|
|
||||||
#----------------------------------------------------------------------
|
|
||||||
NP=1
|
|
||||||
INSTRUMENT=TASPUB
|
|
||||||
#--------- entry level
|
|
||||||
etitle=/entry1,NXentry/SDS title -type NX_CHAR -rank 1
|
|
||||||
instrument=/entry1,NXentry/SDS instrument -type NX_CHAR -rank 1
|
|
||||||
escancommand=/entry1,NXentry/SDS scancommand -type NX_CHAR -rank 1
|
|
||||||
escanvars=/entry1,NXentry/SDS scanvars -type NX_CHAR -rank 1
|
|
||||||
estart=/entry1,NXentry/SDS start_time -type DFNT_CHAR -rank 1
|
|
||||||
eend=/entry1,NXentry/SDS end_time -type DFNT_CHAR -rank 1
|
|
||||||
edef=/entry1,NXentry/SDS definition -type DFNT_CHAR -rank 1 \
|
|
||||||
-attr {URL,http://www.nexus.anl.gov/instruments/xml/NXmonotas.xml} \
|
|
||||||
-attr {version,1.0}
|
|
||||||
#---------- looser
|
|
||||||
usnam=/entry1,NXentry/user,NXuser/SDS name -type NX_CHAR -rank 1
|
|
||||||
usaff=/entry1,NXentry/user,NXuser/SDS affiliation -type NX_CHAR -rank 1
|
|
||||||
usadd=/entry1,NXentry/user,NXuser/SDS address -type NX_CHAR -rank 1
|
|
||||||
usmail=/entry1,NXentry/user,NXuser/SDS email -type NX_CHAR -rank 1
|
|
||||||
#---------- local contact
|
|
||||||
lonam=/entry1,NXentry/local_contact,NXuser/SDS name -type NX_CHAR -rank 1
|
|
||||||
#------------- sample
|
|
||||||
sa_temperature=/entry1,NXentry/sample,NXsample/SDS temperature \
|
|
||||||
-attr {units,K} -rank 1 -dim {-1}
|
|
||||||
sc_tt=/entry1,NXentry/sample,NXsample/SDS temperature \
|
|
||||||
-attr {units,K} -rank 1 -dim {-1}
|
|
||||||
sa_field=/entry1,NXentry/sample,NXsample/SDS magnetic_field \
|
|
||||||
-attr {units,Tesla} -rank 1 -dim {-1}
|
|
||||||
sc_temperature=/entry1,NXentry/sample,NXsample/SDS temperature \
|
|
||||||
-attr {units,K} -rank 1 -dim {-1}
|
|
||||||
sc_te=/entry1,NXentry/sample,NXsample/SDS temperature \
|
|
||||||
-attr {units,K} -rank 1 -dim {-1}
|
|
||||||
sc_field=/entry1,NXentry/sample,NXsample/SDS magnetic_field \
|
|
||||||
-attr {units,Tesla} -rank 1 -dim {-1}
|
|
||||||
sc_mf=/entry1,NXentry/sample,NXsample/SDS magnetic_field \
|
|
||||||
-attr {units,Tesla} -rank 1 -dim {-1}
|
|
||||||
sanam=/entry1,NXentry/sample,NXsample/SDS name -type NX_CHAR -rank 1
|
|
||||||
sa_cell=/entry1,NXentry/sample,NXsample/SDS unit_cell -rank 1 -dim {6}
|
|
||||||
sa_norm=/entry1,NXentry/sample,NXsample/SDS plane_normal -rank 1 -dim {3}
|
|
||||||
sa_vec1=/entry1,NXentry/sample,NXsample/SDS plane_vector_1 -rank 1 -dim {9}
|
|
||||||
sa_vec2=/entry1,NXentry/sample,NXsample/SDS plane_vector_2 -rank 1 -dim {9}
|
|
||||||
sa_ub=/entry1,NXentry/sample,NXsample/SDS orientation_matrix -rank 2 \
|
|
||||||
-dim {3,3}
|
|
||||||
sc_a2=/entry1,NXentry/sample,NXsample/SDS polar_angle \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
sc_a3=/entry1,NXentry/sample,NXsample/SDS rotation_angle \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
sc_sgl=/entry1,NXentry/sample,NXsample/SDS sgl \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
sc_sgu=/entry1,NXentry/sample,NXsample/SDS sgu \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
2tm_zero=/entry1,NXentry/sample,NXsample/SDS polar_angle_zero \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
om_zero=/entry1,NXentry/sample,NXsample/SDS rotation_angle_zero \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
sgl_zero=/entry1,NXentry/sample,NXsample/SDS sgl_zero \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
sgu_zero=/entry1,NXentry/sample,NXsample/SDS sgu_zero \
|
|
||||||
-rank 1 -attr {units,degree}
|
|
||||||
sc_qh=/entry1,NXentry/sample,NXsample/SDS Qh -rank 1 -dim {-1}
|
|
||||||
sc_qk=/entry1,NXentry/sample,NXsample/SDS Qk -rank 1 -dim {-1}
|
|
||||||
sc_ql=/entry1,NXentry/sample,NXsample/SDS Ql -rank 1 -dim {-1}
|
|
||||||
sc_qm=/entry1,NXentry/sample,NXsample/SDS Qm -rank 1 -dim {-1}
|
|
||||||
sc_en=/entry1,NXentry/sample,NXsample/SDS energy_transfer -rank 1 \
|
|
||||||
-attr {units,mev} -dim {-1}
|
|
||||||
saaz=/entry1,NXentry/sample,NXsample/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
sc_tu=/entry1,NXentry/sample,NXsample/SDS x \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
sc_tl=/entry1,NXentry/sample,NXsample/SDS y \
|
|
||||||
-rank 1 -attr {units,degree} -dim {-1}
|
|
||||||
#----------- monochromator
|
|
||||||
mono_type=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS type -type NX_CHAR -rank 1
|
|
||||||
sc_ei=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS energy -rank 1 -dim {-1} \
|
|
||||||
-attr {units,mev} -dim {-1}
|
|
||||||
sc_a1=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS rotation_angle \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree} -dim {-1}
|
|
||||||
omm_zero=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS rotation_angle_zero \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
mono_dd=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS d_spacing -attr {units,Angstroem}
|
|
||||||
sc_mcv=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS curvature \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
sc_cum=/entry1,NXentry/$(INSTRUMENT),NXinstrument/monochromator,NXcrystal/SDS curvature \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree} -dim {-1}
|
|
||||||
#----------- analyzer
|
|
||||||
ana_type=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS type -type NX_CHAR -rank 1
|
|
||||||
sc_ef=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS energy -rank 1 -dim {-1} \
|
|
||||||
-attr {units,mev}
|
|
||||||
sc_a5=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS rotation_angle \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
a5_zero=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS rotation_angle_zero \
|
|
||||||
-attr {units,degree}
|
|
||||||
sc_a4=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS polar_angle -rank 1 -dim {-1} \
|
|
||||||
-attr {units,degree}
|
|
||||||
2t_zero=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS polar_angle_zero -attr {units,degree}
|
|
||||||
ana_dd=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS d_spacing -attr {units,Angstroem}
|
|
||||||
ana_az=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
sdistance=/entry1,NXentry/$(INSTRUMENT),NXinstrument/analyzer,NXcrystal/SDS distance -attr {units,mm}
|
|
||||||
#--------- detector
|
|
||||||
set winno 1
|
|
||||||
sc_a6=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS polar_angle -rank 1 -dim {-1} \
|
|
||||||
-attr {units,degree}
|
|
||||||
2ta_zero=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS polar_angle_zero -attr {units,degree}
|
|
||||||
counts=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS data -type NX_INT32 \
|
|
||||||
-rank 1 -dim {-1} -attr {signal,1}
|
|
||||||
det_az=/entry1,NXentry/$(INSTRUMENT),NXinstrument/detector,NXdetector/SDS azimuthal_angle -attr {units,degree}
|
|
||||||
adistance=/entry1,NXentry/$(INSTRUMENT),NXinstrument/adetector,NXcrystal/SDS distance -attr {units,mm}
|
|
||||||
#------- monitors
|
|
||||||
cter_mode=/entry1,NXentry/control,NXmonitor/SDS mode -type NX_CHAR -rank 1 -dim {30}
|
|
||||||
cter_preset=/entry1,NXentry/control,NXmonitor/SDS preset
|
|
||||||
motime=/entry1,NXentry/control,NXmonitor/SDS time -attr {units,seconds} -rank 1 -dim {-1}
|
|
||||||
cter_01=/entry1,NXentry/control,NXmonitor/SDS data -type NX_INT32 -rank 1 -dim {-1}
|
|
||||||
cter_02=/entry1,NXentry/aux_detector,NXmonitor/SDS data -type NX_INT32 -rank 1 -dim {-1}
|
|
||||||
#------- NXdata
|
|
||||||
dana=/entry1,NXentry/data,NXdata/NXVGROUP
|
|
||||||
emotor_a1=/entry1,NXentry/data,NXdata/SDS a1 \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
emotor_a2=/entry1,NXentry/data,NXdata/SDS a2 \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
emotor_a3=/entry1,NXentry/data,NXdata/SDS a3 \
|
|
||||||
-rank 1 -dim {-1} -attr {units,degree}
|
|
||||||
emotor_a4=/entry1,NXentry/data,NXdata/SDS a4 -rank 1 -dim {-1} \
|
|
||||||
-attr {units,degree}
|
|
||||||
emotor_a5=/entry1,NXentry/data,NXdata/SDS a5 -rank 1 -dim {-1} \
|
|
||||||
-attr {units,degree}
|
|
||||||
emotor_a6=/entry1,NXentry/data,NXdata/SDS a6 -rank 1 -dim {-1} \
|
|
||||||
-attr {units,degree}
|
|
||||||
danascanvar=/entry1,NXentry/data,NXdata/SDS scanvar \
|
|
||||||
-type NX_FLOAT32 -attr {axis,1} -rank 1 -dim {-1}
|
|
||||||
Reference in New Issue
Block a user