Files
sics/site_ansto/instrument/config/environment/magneticField/sct_green_magnet.tcl
Jing Chen 5ceb583d26 update the driver
r3743 | jgn | 2012-09-24 09:56:27 +1000 (Mon, 24 Sep 2012) | 1 line
2012-11-15 17:38:39 +11:00

201 lines
6.3 KiB
Tcl

##
# @file Green Magnetic Controller
#
# This is a driver for SICS to make following communication with the Labview Green Magnet device
#
# 1. read some system parameters from the device
# 2. set the magnet value
# 3. abort the magnet value setting during its processing
#
# Author: Jing Chen (jgn@ansto.gov.au) July 2011
#
###
# @record data in the log files
proc debug_log {args} {
set d1 [clock format [clock seconds] -format %d%h%Y]
set fd [open "../log/green_magnet$d1.log" a]
puts $fd "[clock format [clock seconds] -format "%D %T"] $args"
close $fd
}
namespace eval ::scobj::green {
}
# @brief Request a state report from the Oxford Device by sending a Magnetic Field request command
proc ::scobj::green::queryGreenMagnetFunc {} {
set comm "getAll\r\n"
sct send $comm
return rdState
}
##
# @brief Read and record the greeni Magnet values from the Device
proc ::scobj::green::rqGreenMagnetFunc {basePath} {
set replyStr [sct result]
debug_log $replyStr
#broadcast "getT reply:$replyStr\n"
set pollNode 999
if {[string first "Error" $replyStr] != -1} {
broadcast "Error: cannot get the Magnetific Temperature value from the Oxford Labview server, check again!"
} elseif {[string first "failed" $replyStr] != -1} {
broadcast "Error: Connection to Oxford Labview server failed, check connection!"
} elseif {[string first "read timeout" $replyStr] != -1} {
broadcast "Error: read timeout on the connectiion to the Oxford Labview server"
} else {
set s1 [string trimright $replyStr "\n"]
set s2 [split $s1 "=;"]
array set paraArr $s2
hset $basePath/output $paraArr(Output)
hset $basePath/PSU_Vol $paraArr(PSU_Vol)
hset $basePath/ramping_rate $paraArr(Rate)
hset $basePath/insTarget $paraArr(Target)
hset $basePath/setPoint [hval $basePath/insTarget]
hset $basePath/status $paraArr(Status)
hset $basePath/Bmax $paraArr(Bmax)
hset $basePath/msg $paraArr(Msg)
set pollNode $paraArr(Output)
}
if {$pollNode != [sct oldval]} {
sct oldval $pollNode
sct update $pollNode
sct utime readtime
}
return idle
}
##
# @brief Make a Green Magnet Controller
#
# @param argList, {name "magnetic" IP localhost PORT 65123 tuning 1 interval 1}
#
# name: name of green magnet controller object
# IP: IP address of RF generator moxa box
# POT: Port number assigned to the generator on the moxa-box
# tuning: boolean, set tuning=1 to allow instrument scientists to set the axe positions
# interval: polling and ramping interval in seconds.
proc ::scobj::green::mkGreen {argList} {
# Generate parameter array from the argument list
foreach {k v} $argList {
set KEY [string toupper $k]
set pa($KEY) $v
}
MakeSICSObj $pa(NAME) SCT_OBJECT
sicslist setatt $pa(NAME) klass environment
sicslist setatt $pa(NAME) long_name $pa(NAME)
set scobj_hpath /sics/$pa(NAME)
hfactory $scobj_hpath/output plain user float
hfactory $scobj_hpath/PSU_Vol plain user float
hfactory $scobj_hpath/ramping_rate plain user text
hfactory $scobj_hpath/insTarget plain user float
hfactory $scobj_hpath/status plain user text
hfactory $scobj_hpath/Bmax plain user float
hfactory $scobj_hpath/msg plain user text
hfactory $scobj_hpath/pollNode plain user text
hsetprop $scobj_hpath/output units "V"
hsetprop $scobj_hpath/output uplimit 100
hsetprop $scobj_hpath/output lowlimit 0
hsetprop $scobj_hpath/status values idle,busy
hset $scobj_hpath/status idle
hsetprop $scobj_hpath tuning $pa(TUNING)
# Setting Green Magnet Voltage
hfactory $scobj_hpath/setPoint plain user float
# make data structure here
::scobj::set_required_props $scobj_hpath
hsetprop $scobj_hpath klass environment
hsetprop $scobj_hpath privilege spy
hsetprop $scobj_hpath type part
hsetprop $scobj_hpath control true
hsetprop $scobj_hpath data true
foreach {hpath klass control data nxsave mutable priv alias} {
output NXenvironment true true true true user green_output
PSU_Vol NXenvironment true true true true user green_PSU_Vol
setPoint NXenvironment true true true true user green_setPoint
} {
hsetprop $scobj_hpath/$hpath nxalias $alias
hsetprop $scobj_hpath/$hpath klass $klass
hsetprop $scobj_hpath/$hpath privilege $priv
hsetprop $scobj_hpath/$hpath control $control
hsetprop $scobj_hpath/$hpath data $data
hsetprop $scobj_hpath/$hpath nxsave $nxsave
hsetprop $scobj_hpath/$hpath mutable $mutable
hsetprop $scobj_hpath/$hpath sdsinfo ::nexus::scobj::sdsinfo
}
::scobj::hinitprops $pa(NAME)
makesctcontroller sct_green std $pa(IP):$pa(PORT)
hsetprop $scobj_hpath/pollNode read ::scobj::green::queryGreenMagnetFunc
hsetprop $scobj_hpath/pollNode rdState ::scobj::green::rqGreenMagnetFunc /sics/$pa(NAME)
hsetprop $scobj_hpath/pollNode oldval "UNKNOWN"
#if {[SplitReply [environment_simulation]]=="false"} {
sct_green poll $scobj_hpath/pollNode $pa(INTERVAL)
#}
}
# Set the magnetic voltage field
proc greenVol {{vol ""} args} {
set NAME "green_magnet"
if {$vol == ""} {
broadcast "Output = [hval /sample/$NAME/output]"
} else {
if {$vol<[SplitReply [hgetprop /sample/$NAME/output lowlimit]] || \
$vol>[SplitReply [hgetprop /sample/$NAME/output uplimit]]} {
return -code error "setpoint violates limits"
} else {
if {$vol > [hval /sample/$NAME/Bmax]} {
broadcast "Maximum field limit is [hval /sample/$NAME/Bmax], reset again!"
return
} else {
#hset /sample/$NAME/setPoint $vol
set comm "set $vol\r\n"
sct_green send $comm
#after 2000
#while {[hval /sample/$NAME/status] == "busy"} {
# broadcast "Magnet Ramping at [hval /sample/$NAME/output]"
# after 3000
#}
}
}
}
return
}
# abort a magnet voltage setting during its proceeding
proc greenAbortSetting {} {
set NAME "green"
set comm "abort\r\n"
sct_green send $comm
return
}
publish greenAbortSetting user
publish greenVol user
#IP 137.157.204.8
#PORT 22
::scobj::green::mkGreen {
name "green_magnet"
IP 137.157.204.57
PORT 22
tuning 1
interval 3
}