Merge branch 'RELEASE-3_1' into RELEASE-3_2
Conflicts: sics/site_ansto/instrument/hipd/wombat_configuration.tcl sics/site_ansto/instrument/hrpd/echidna_configuration.tcl sics/site_ansto/instrument/kookaburra/kookaburra_configuration.tcl sics/site_ansto/instrument/reflectometer/platypus_configuration.tcl sics/site_ansto/instrument/sans/config/environment/sct_antonparr_MCR500.tcl sics/site_ansto/instrument/tas/taipan_configuration.tcl
This commit is contained in:
@ -324,7 +324,7 @@ static int scaqaAsconInit(Ascon *a, SConnection *pCon, int argc, char *argv[])
|
||||
for (i = 0; i < argc; ++i) {
|
||||
SCPrintf(pCon, eStatus, "scaqaAsconInit: arg[%d] = %s\n", i, argv[i]);
|
||||
}
|
||||
if (argc < 1) {
|
||||
if (argc < 2) {
|
||||
SCPrintf(pCon, eError, "Insufficient arguments to scaqaAsconInit: %d\n", argc);
|
||||
return 0;
|
||||
}
|
||||
|
124
site_ansto/instrument/TEST_SICS/fakeOLV/FakeOLV.py
Executable file
124
site_ansto/instrument/TEST_SICS/fakeOLV/FakeOLV.py
Executable file
@ -0,0 +1,124 @@
|
||||
#!/usr/bin/python
|
||||
# vim: ft=python ts=8 sts=4 sw=4 et autoindent smartindent nocindent
|
||||
# author: Douglas Clowes (douglas.clowes@ansto.gov.au) 2015
|
||||
'''
|
||||
Fake Oxford LabView program for the 10/12 Tesla magnet driver
|
||||
'''
|
||||
|
||||
from twisted.internet import reactor, protocol
|
||||
from twisted.internet.task import LoopingCall
|
||||
|
||||
devices = []
|
||||
|
||||
class FakeOLV(protocol.Protocol):
|
||||
'''Fake Oxford Labview Protocol Object'''
|
||||
def __init__(self):
|
||||
self.setpoint = 0.0
|
||||
self.field = 0.0
|
||||
self.rate = 0.0
|
||||
self.hsw = 0
|
||||
self.t_1 = 120.0
|
||||
self.t_2 = 120.0
|
||||
self.t_3 = 120.0
|
||||
self.dsp = 0.0
|
||||
self.dpv = 0.0
|
||||
self.hsp = 0.0
|
||||
self.hpv = 0.0
|
||||
|
||||
def dataReceived(self, data):
|
||||
print "RECEIVED ", data
|
||||
reply = ""
|
||||
cmd_pars = data.split()
|
||||
if len(cmd_pars) < 1:
|
||||
return
|
||||
cmd = cmd_pars[0].lower()
|
||||
if cmd.startswith("set"):
|
||||
reply = self.set_command(cmd, cmd_pars)
|
||||
elif cmd.startswith("get"):
|
||||
reply = self.get_command(cmd)
|
||||
else:
|
||||
reply = "Error Command!"
|
||||
print "REPLY ", reply
|
||||
self.transport.write(reply + "\r\n")
|
||||
|
||||
def set_command(self, cmd, cmd_pars):
|
||||
'''Execute a setXX command'''
|
||||
reply = ""
|
||||
if len(cmd_pars) < 2:
|
||||
reply = "Error Command!"
|
||||
elif cmd == "setr":
|
||||
self.rate = float(cmd_pars[1])
|
||||
elif cmd == "seths":
|
||||
if cmd_pars[1].lower() == "on":
|
||||
self.hsw = 1
|
||||
if cmd_pars[1].lower() == "off":
|
||||
self.hsw = 0
|
||||
elif cmd == "sethelioxtemp":
|
||||
self.hsp = float(cmd_pars[1])
|
||||
elif cmd == "setdiluttemp":
|
||||
self.dsp = float(cmd_pars[1])
|
||||
elif cmd == "setf":
|
||||
self.setpoint = float(cmd_pars[1])
|
||||
else:
|
||||
reply = "Error Command!"
|
||||
return reply
|
||||
|
||||
def get_command(self, cmd):
|
||||
'''Execute a getXX command'''
|
||||
reply = ""
|
||||
if cmd == "getf":
|
||||
current = self.field * 10.0
|
||||
reply = "Field_Current=%.6f;" % current
|
||||
reply += "Field_Tesla=%.6f" % self.field
|
||||
elif cmd == "gett":
|
||||
reply = "T1=120.000000;T2=120.000000;T3=120.000000"
|
||||
elif cmd == "gethelioxtemp":
|
||||
reply = "Temp=0.000000;SetPoint=0.000000 Cdeg"
|
||||
elif cmd == "getdilutiontemp":
|
||||
reply = "Temp=0.000000;SetPoint=0.000000"
|
||||
else:
|
||||
reply = "Error Command!"
|
||||
return reply
|
||||
|
||||
def iterate(self):
|
||||
'''Iterate the setpoints'''
|
||||
if abs(self.field - self.setpoint) > 0.01:
|
||||
self.field += 0.1 * (self.setpoint - self.field)
|
||||
else:
|
||||
self.field = self.setpoint
|
||||
if abs(self.dsp - self.dpv) > 0.01:
|
||||
self.dpv += 0.1 * (self.dsp - self.dpv)
|
||||
else:
|
||||
self.dpv = self.dsp
|
||||
if abs(self.hsp - self.hpv) > 0.01:
|
||||
self.hpv += 0.1 * (self.hsp - self.hpv)
|
||||
else:
|
||||
self.hpv = self.hsp
|
||||
|
||||
def connectionMade(self):
|
||||
'''Add this new connection to the list of devices'''
|
||||
print "connectionMade"
|
||||
devices.append(self)
|
||||
|
||||
def connectionLost(self, reason):
|
||||
'''Drop this old connection from the list of devices'''
|
||||
print "connectionLost"
|
||||
devices.remove(self)
|
||||
|
||||
def device_iterator():
|
||||
'''Iterate over all connected devices and do them'''
|
||||
#print "device_iterator"
|
||||
for dev in devices:
|
||||
dev.iterate()
|
||||
|
||||
def main():
|
||||
'''Main program'''
|
||||
dev_iter = LoopingCall(device_iterator)
|
||||
dev_iter.start(1.0)
|
||||
factory = protocol.ServerFactory()
|
||||
factory.protocol = FakeOLV
|
||||
reactor.listenTCP(55001, factory)
|
||||
reactor.run()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@ -3,7 +3,7 @@ driver he3_polanal = {
|
||||
protocol = std;
|
||||
class = instrument;
|
||||
simulation_group = rfgen_simulation;
|
||||
make_args = '{has_pol true} {has_anal true}';
|
||||
make_args = '{has_pol true} {has_anal true} {has_coil false}';
|
||||
|
||||
group polariser = {
|
||||
conditional = '[string equal -nocase ${has_pol} "true"]';
|
||||
@ -11,7 +11,7 @@ driver he3_polanal = {
|
||||
var spin = {
|
||||
readable = 900;
|
||||
read_command = 'polariser';
|
||||
read_function = rdValue;
|
||||
read_function = read_spin;
|
||||
writeable = 1;
|
||||
write_command = 'polariser';
|
||||
check_function = chkWrite;
|
||||
@ -42,7 +42,7 @@ driver he3_polanal = {
|
||||
var spin = {
|
||||
readable = 900;
|
||||
read_command = 'analyser';
|
||||
read_function = rdValue;
|
||||
read_function = read_spin;
|
||||
writeable = 1;
|
||||
write_command = 'analyser';
|
||||
check_function = chkWrite;
|
||||
@ -67,12 +67,82 @@ driver he3_polanal = {
|
||||
var timestamp = { type = int; }
|
||||
}
|
||||
|
||||
group magnet = {
|
||||
conditional = '[string equal -nocase ${has_coil} "true"]';
|
||||
type = float;
|
||||
group sense = {
|
||||
var x_voltage = {}
|
||||
var x_current = {}
|
||||
var y_voltage = {}
|
||||
var y_current = {}
|
||||
var z_voltage = {}
|
||||
var z_current = {}
|
||||
var sense = {
|
||||
type = int; data = false; mutable = false; nxsave = false;
|
||||
readable = 30;
|
||||
read_command = 'magnet_xyz';
|
||||
read_function = read_magnet;
|
||||
writeable = 1;
|
||||
write_function = fetch_magnet;
|
||||
write_command = 'magnet_xyz';
|
||||
}
|
||||
}
|
||||
group setpoint = {
|
||||
var x_current_sp = {}
|
||||
var y_current_sp = {}
|
||||
var z_current_sp = {}
|
||||
var store = {
|
||||
type = int; data = false; mutable = false; nxsave = false;
|
||||
writeable = 1;
|
||||
write_function = write_magnet;
|
||||
write_command = 'magnet_xyz';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
code read_magnet = {
|
||||
@TCL
|
||||
set dlist [split [string trim ${data}]]
|
||||
if {[llength $dlist] != 7} {
|
||||
error "Syntax error: '${data}'"
|
||||
}
|
||||
set index 1
|
||||
set path [pathname [sct]]
|
||||
set ns [namespace current]
|
||||
foreach node {x_voltage x_current y_voltage y_current z_voltage z_current} {
|
||||
hsetprop ${path}/${node} result [lindex $dlist ${index}]
|
||||
sct with ${path}/${node} "${ns}::rdValue ${tc_root}"
|
||||
incr index
|
||||
}
|
||||
set data 0
|
||||
@END
|
||||
}
|
||||
|
||||
code fetch_magnet = {
|
||||
@TCL
|
||||
# Just do a fetch and go on to the read state
|
||||
set cmd "${cmd_str}"
|
||||
set nextState "read_magnet"
|
||||
@END
|
||||
}
|
||||
|
||||
code write_magnet = {
|
||||
@TCL
|
||||
# Just do a fetch and go on to the read state
|
||||
set path [pathname [sct]]
|
||||
set cmd "${cmd_str}"
|
||||
set cmd "${cmd} [hval ${path}/x_current_sp]"
|
||||
set cmd "${cmd} [hval ${path}/y_current_sp]"
|
||||
set cmd "${cmd} [hval ${path}/z_current_sp]"
|
||||
@END
|
||||
}
|
||||
|
||||
code chkWrite = {%%
|
||||
[namespace current]::rdValue ${tc_root}
|
||||
[namespace current]::read_spin ${tc_root}
|
||||
clientput [sct result]
|
||||
%%}
|
||||
|
||||
code rdValue = {%%
|
||||
code read_spin = {%%
|
||||
set dlist [split [string trim ${data}]]
|
||||
if {[llength ${dlist}] < 2} {
|
||||
sct geterror "Syntax Error: '${data}'"
|
||||
|
@ -72,7 +72,7 @@ proc ::scobj::he3_polanal::chkWrite {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "chkWrite tc_root=${tc_root} sct=[sct] resp=[sct result]"
|
||||
# chkWrite hook code starts
|
||||
[namespace current]::rdValue ${tc_root}
|
||||
[namespace current]::read_spin ${tc_root}
|
||||
clientput [sct result]
|
||||
# chkWrite hook code ends
|
||||
return "idle"
|
||||
@ -80,6 +80,38 @@ proc ::scobj::he3_polanal::chkWrite {tc_root} {
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::he3_polanal::fetch_magnet {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "fetch_magnet tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# fetch_magnet hook code starts
|
||||
# Just do a fetch and go on to the read state
|
||||
set cmd "${cmd_str}"
|
||||
set nextState "read_magnet"
|
||||
# fetch_magnet hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "fetch_magnet sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to request the read of a parameter on a device
|
||||
proc ::scobj::he3_polanal::getValue {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
@ -122,7 +154,77 @@ proc ::scobj::he3_polanal::rdValue {tc_root} {
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# rdValue hook code starts
|
||||
# rdValue hook code goes here
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::he3_polanal::read_magnet {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_magnet tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_magnet hook code starts
|
||||
set dlist [split [string trim ${data}]]
|
||||
if {[llength $dlist] != 7} {
|
||||
error "Syntax error: '${data}'"
|
||||
}
|
||||
set index 1
|
||||
set path [pathname [sct]]
|
||||
set ns [namespace current]
|
||||
foreach node {x_voltage x_current y_voltage y_current z_voltage z_current} {
|
||||
hsetprop ${path}/${node} result [lindex $dlist ${index}]
|
||||
sct with ${path}/${node} "${ns}::rdValue ${tc_root}"
|
||||
incr index
|
||||
}
|
||||
set data 0
|
||||
# read_magnet hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::he3_polanal::read_spin {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_spin tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_spin hook code starts
|
||||
set dlist [split [string trim ${data}]]
|
||||
if {[llength ${dlist}] < 2} {
|
||||
sct geterror "Syntax Error: '${data}'"
|
||||
@ -148,7 +250,7 @@ proc ::scobj::he3_polanal::rdValue {tc_root} {
|
||||
[namespace current]::do_update ${path}/time2 ${dlist} 5
|
||||
[namespace current]::do_update ${path}/field ${dlist} 6
|
||||
hupdateif ${path}/timestamp ${timestamp}
|
||||
# rdValue hook code ends
|
||||
# read_spin hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
@ -200,8 +302,43 @@ proc ::scobj::he3_polanal::setValue {tc_root nextState cmd_str} {
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port {has_pol true} {has_anal true} } {
|
||||
::scobj::he3_polanal::sics_log 9 "::scobj::he3_polanal::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal}"
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::he3_polanal::write_magnet {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "write_magnet tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# write_magnet hook code starts
|
||||
# Just do a fetch and go on to the read state
|
||||
set path [pathname [sct]]
|
||||
set cmd "${cmd_str}"
|
||||
set cmd "${cmd} [hval ${path}/x_current_sp]"
|
||||
set cmd "${cmd} [hval ${path}/y_current_sp]"
|
||||
set cmd "${cmd} [hval ${path}/z_current_sp]"
|
||||
# write_magnet hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "write_magnet sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port {has_pol true} {has_anal true} {has_coil false} } {
|
||||
::scobj::he3_polanal::sics_log 9 "::scobj::he3_polanal::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal} ${has_coil}"
|
||||
set ns "[namespace current]"
|
||||
set catch_status [ catch {
|
||||
|
||||
@ -264,8 +401,8 @@ proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulatio
|
||||
hsetprop ${scobj_hpath}/analyser/phase nxalias "${name}_analyser_phase"
|
||||
|
||||
hfactory ${scobj_hpath}/analyser/spin plain user float
|
||||
hsetprop ${scobj_hpath}/analyser/spin read ${ns}::getValue ${scobj_hpath} rdValue {analyser}
|
||||
hsetprop ${scobj_hpath}/analyser/spin rdValue ${ns}::rdValue ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/analyser/spin read ${ns}::getValue ${scobj_hpath} read_spin {analyser}
|
||||
hsetprop ${scobj_hpath}/analyser/spin read_spin ${ns}::read_spin ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/analyser/spin write ${ns}::setValue ${scobj_hpath} chkWrite {analyser}
|
||||
hsetprop ${scobj_hpath}/analyser/spin chkWrite ${ns}::chkWrite ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/analyser/spin check ${ns}::checkrange ${scobj_hpath}
|
||||
@ -404,6 +541,167 @@ proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulatio
|
||||
hsetprop ${scobj_hpath}/analyser_start type "part"
|
||||
}
|
||||
|
||||
if {[string equal -nocase ${has_coil} "true"]} {
|
||||
hfactory ${scobj_hpath}/magnet plain spy none
|
||||
hsetprop ${scobj_hpath}/magnet data "true"
|
||||
hsetprop ${scobj_hpath}/magnet klass "@none"
|
||||
hsetprop ${scobj_hpath}/magnet type "part"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense plain spy none
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/sense plain user int
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense read ${ns}::getValue ${scobj_hpath} read_magnet {magnet_xyz}
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense read_magnet ${ns}::read_magnet ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense write ${ns}::fetch_magnet ${scobj_hpath} noResponse {magnet_xyz}
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense check ${ns}::checkrange ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense data false
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense mutable false
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense nxsave false
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense oldval 0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense nxalias "${name}_magnet_sense_sense"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} poll ${scobj_hpath}/magnet/sense/sense 30
|
||||
${sct_controller} write ${scobj_hpath}/magnet/sense/sense
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense simulated false
|
||||
} else {
|
||||
::scobj::he3_polanal::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for he3_polanal"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/sense simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/x_current plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_current nxalias "${name}_magnet_sense_x_current"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/x_voltage plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/x_voltage nxalias "${name}_magnet_sense_x_voltage"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/y_current plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_current nxalias "${name}_magnet_sense_y_current"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/y_voltage plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/y_voltage nxalias "${name}_magnet_sense_y_voltage"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/z_current plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_current nxalias "${name}_magnet_sense_z_current"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/sense/z_voltage plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage control true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage data true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/sense/z_voltage nxalias "${name}_magnet_sense_z_voltage"
|
||||
hsetprop ${scobj_hpath}/magnet/sense data "true"
|
||||
hsetprop ${scobj_hpath}/magnet/sense klass "@none"
|
||||
hsetprop ${scobj_hpath}/magnet/sense type "part"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint plain spy none
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint/store plain user int
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store write ${ns}::write_magnet ${scobj_hpath} noResponse {magnet_xyz}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store check ${ns}::checkrange ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store control true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store data false
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store mutable false
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store nxsave false
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store oldval 0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store nxalias "${name}_magnet_setpoint_store"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} write ${scobj_hpath}/magnet/setpoint/store
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store simulated false
|
||||
} else {
|
||||
::scobj::he3_polanal::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for he3_polanal"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/store simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint/x_current_sp plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp control true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp data true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/x_current_sp nxalias "${name}_magnet_setpoint_x_current_sp"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint/y_current_sp plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp control true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp data true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/y_current_sp nxalias "${name}_magnet_setpoint_y_current_sp"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint/z_current_sp plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp control true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp data true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint/z_current_sp nxalias "${name}_magnet_setpoint_z_current_sp"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint data "true"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint klass "@none"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint type "part"
|
||||
}
|
||||
|
||||
if {[string equal -nocase ${has_pol} "true"]} {
|
||||
hfactory ${scobj_hpath}/polariser plain spy none
|
||||
|
||||
@ -455,8 +753,8 @@ proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulatio
|
||||
hsetprop ${scobj_hpath}/polariser/phase nxalias "${name}_polariser_phase"
|
||||
|
||||
hfactory ${scobj_hpath}/polariser/spin plain user float
|
||||
hsetprop ${scobj_hpath}/polariser/spin read ${ns}::getValue ${scobj_hpath} rdValue {polariser}
|
||||
hsetprop ${scobj_hpath}/polariser/spin rdValue ${ns}::rdValue ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/polariser/spin read ${ns}::getValue ${scobj_hpath} read_spin {polariser}
|
||||
hsetprop ${scobj_hpath}/polariser/spin read_spin ${ns}::read_spin ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/polariser/spin write ${ns}::setValue ${scobj_hpath} chkWrite {polariser}
|
||||
hsetprop ${scobj_hpath}/polariser/spin chkWrite ${ns}::chkWrite ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/polariser/spin check ${ns}::checkrange ${scobj_hpath}
|
||||
@ -605,7 +903,7 @@ proc ::scobj::he3_polanal::mkDriver { sct_controller name device_class simulatio
|
||||
|
||||
proc ::scobj::he3_polanal::add_driver {name device_class simulation_flag ip_address tcp_port} {
|
||||
set catch_status [ catch {
|
||||
::scobj::he3_polanal::sics_log 9 "::scobj::he3_polanal::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal}"
|
||||
::scobj::he3_polanal::sics_log 9 "::scobj::he3_polanal::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal} ${has_coil}"
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
if {[string equal -nocase "aqadapter" "${ip_address}"]} {
|
||||
::scobj::he3_polanal::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}"
|
||||
@ -619,8 +917,8 @@ proc ::scobj::he3_polanal::add_driver {name device_class simulation_flag ip_addr
|
||||
::scobj::he3_polanal::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"
|
||||
makesctcontroller sct_${name} aqadapter NULL
|
||||
}
|
||||
::scobj::he3_polanal::sics_log 1 "::scobj::he3_polanal::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal}"
|
||||
::scobj::he3_polanal::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal}
|
||||
::scobj::he3_polanal::sics_log 1 "::scobj::he3_polanal::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal} ${has_coil}"
|
||||
::scobj::he3_polanal::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${has_pol} ${has_anal} ${has_coil}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
@ -721,8 +1019,8 @@ proc ::scobj::he3_polanal::read_config {} {
|
||||
set arg_list [list]
|
||||
set missing_list [list]
|
||||
array unset default_map
|
||||
array set default_map [list has_pol true has_anal true]
|
||||
foreach arg {has_pol has_anal} {
|
||||
array set default_map [list has_pol true has_anal true has_coil false]
|
||||
foreach arg {has_pol has_anal has_coil} {
|
||||
if {[dict exists $u $arg]} {
|
||||
lappend arg_list "[dict get $u $arg]"
|
||||
} elseif {[dict exists $v $arg]} {
|
||||
|
@ -1,5 +1,9 @@
|
||||
|
||||
set scaleval 1000.0
|
||||
set scaleval 2000.0
|
||||
set rampstep 100
|
||||
set rampdelay 3
|
||||
set motdir 1
|
||||
set pulserstate 0
|
||||
|
||||
proc SetVoltScale {newscaleval} {
|
||||
global scaleval
|
||||
@ -11,17 +15,58 @@ proc VoltScale {involt} {
|
||||
return [expr {($involt*1.0)/$scaleval}]
|
||||
}
|
||||
|
||||
proc SetRampParms {_rampstep _rampdelay} {
|
||||
global rampstep rampdelay
|
||||
set rampstep $_rampstep
|
||||
set rampdelay $_rampdelay
|
||||
}
|
||||
|
||||
proc SetVolt {volt} {
|
||||
global pulserstate
|
||||
if {$volt== 0} {
|
||||
PulserOff
|
||||
set pulserstate 0
|
||||
} else {
|
||||
set pulservolt [VoltScale $volt]
|
||||
sct_pulser send "VOLT:OFFS $pulservolt; OFFS?"
|
||||
PulserDC $pulservolt
|
||||
PulserOn
|
||||
# sct_pulser send "VOLT:OFFS $pulservolt; OFFS?"
|
||||
# PulserDC $pulservolt
|
||||
if {$pulserstate==0} {
|
||||
PulserDC $pulservolt
|
||||
PulserOn
|
||||
set pulserstate 1
|
||||
} else {
|
||||
sct_pulser send "VOLT:OFFS $pulservolt; OFFS?"
|
||||
PulserOn
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proc VoltSetStep {start step fin delay} {
|
||||
set i [expr {$start*1.0}]
|
||||
set loopvar 1
|
||||
SetVolt $i
|
||||
if {($start == $fin) || ($step == 0)} {break}
|
||||
while {$loopvar} {
|
||||
wait $delay
|
||||
if {($start < $fin)} {
|
||||
set i [expr {$i + abs($step)}]
|
||||
if {$i >= $fin} {
|
||||
set i $fin
|
||||
set loopvar 0
|
||||
}
|
||||
}
|
||||
if {($start > $fin)} {
|
||||
set i [expr {$i - abs($step)}]
|
||||
if {$i <= $fin} {
|
||||
set i $fin
|
||||
set loopvar 0
|
||||
}
|
||||
}
|
||||
SetVolt $i
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
proc GetVolt {} {
|
||||
sct_pulser transact VOLT:OFFS?
|
||||
}
|
||||
@ -29,25 +74,18 @@ proc GetVolt {} {
|
||||
proc SingleVolt {volt oscno} {
|
||||
histmem mode unlimited
|
||||
newfile HISTOGRAM_XY
|
||||
if {$volt== 0} {
|
||||
PulserOff
|
||||
} else {
|
||||
set pulservolt [VoltScale $volt]
|
||||
sct_pulser send "VOLT:OFFS $pulservolt; OFFS?"
|
||||
pulserDC $pulservolt
|
||||
PulserOn
|
||||
}
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
SetVolt $volt
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save 0
|
||||
oscmd stop
|
||||
|
||||
}
|
||||
|
||||
proc SetDC {} {
|
||||
pulseroff
|
||||
#NOTE: Setting FUNC DC generates a remote ctrl error if the
|
||||
# burst mode happens to be on
|
||||
set resp [sct_pulser transact "BURS:STAT OFF;:FUNC DC;:VOLT:OFFS 0; OFFS?"]
|
||||
set resp [sct_pulser send "BURS:STAT OFF;:FUNC DC;:VOLT:OFFS 0; OFFS?"]
|
||||
pulseron
|
||||
}
|
||||
|
||||
@ -61,55 +99,58 @@ proc VoltRamp {start step fin oscno} {
|
||||
set j [expr {$i*$step+$start}]
|
||||
if {$j> $fin && $step > 0} {break}
|
||||
if {$j< $fin && $step < 0} {break}
|
||||
if {$j== 0} {
|
||||
PulserOff
|
||||
} else {
|
||||
set pulservolt [VoltScale $j]
|
||||
pulserDC $pulservolt
|
||||
PulserOn
|
||||
}
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
SetVolt $j
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc VoltTextureRamp {start step fin mot tstart tstep tfin oscno} {
|
||||
histmem mode unlimited
|
||||
|
||||
|
||||
set loopvar 1
|
||||
proc SingleVTexScan {mot tstart tstep tfin oscno} {
|
||||
global motdir
|
||||
broadcast in singlevtexscan
|
||||
set loopvar 1
|
||||
set i_bool 0
|
||||
histmem mode unlimited
|
||||
if {$motdir == 1} {
|
||||
set currentmot $tstart
|
||||
set i 0
|
||||
while {$loopvar} {
|
||||
set j [expr {$i*$step+$start}]
|
||||
if {$j> $fin && $step > 0} {break}
|
||||
if {$j< $fin && $step < 0} {break}
|
||||
if {$j== 0} {
|
||||
PulserOff
|
||||
} else {
|
||||
set pulservolt [VoltScale $j]
|
||||
pulserDC $pulservolt
|
||||
PulserOn
|
||||
}
|
||||
sampledescription voltage $j
|
||||
broadcast voltage $j
|
||||
newfile HISTOGRAM_XY
|
||||
set m 0
|
||||
while {1} {
|
||||
set n [expr {$m*$tstep+$tstart}]
|
||||
if {$n> $tfin && $tstep > 0} {break}
|
||||
if {$n< $tfin && $tstep < 0} {break}
|
||||
drive $mot $n
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
save $m
|
||||
incr m
|
||||
}
|
||||
oscmd stop
|
||||
incr i
|
||||
}
|
||||
} else {
|
||||
set currentmot $tfin
|
||||
set i [expr {int(($tfin-$tstart)/$tstep)}]
|
||||
}
|
||||
newfile HISTOGRAM_XY
|
||||
while {$i_bool==0} {
|
||||
drive $mot $currentmot
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
hmm countblock
|
||||
save $i
|
||||
if {($motdir > 0)} {
|
||||
|
||||
set currentmot [expr {$currentmot + $tstep}]
|
||||
if {$currentmot > $tfin} {set i_bool 1}
|
||||
incr i
|
||||
} else {
|
||||
set currentmot [expr {$currentmot - $tstep}]
|
||||
if {$currentmot < $tstart} {set i_bool 1}
|
||||
incr i -1
|
||||
}
|
||||
}
|
||||
set motdir [expr {(-1*$motdir)}]
|
||||
}
|
||||
|
||||
proc VListTexScan {voltlist mot tstart tstep tfin oscno} {
|
||||
global rampstep rampdelay
|
||||
set curvolt [lindex $voltlist 0]
|
||||
broadcast $curvolt
|
||||
SetVolt $curvolt
|
||||
foreach volt $voltlist {
|
||||
broadcast $volt
|
||||
VoltSetStep $curvolt $rampstep $volt $rampdelay
|
||||
SingleVTexScan $mot $tstart $tstep $tfin $oscno
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -124,12 +165,10 @@ proc SquarePulseTexture {motor start step numsteps volt freq bins oscno} {
|
||||
|
||||
for {set i 0} {$i < $numsteps} {incr i} {
|
||||
drive $motor [expr $i*$step+$start]
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
}
|
||||
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc UniPulseTexture {motor start step numsteps volt freq bins oscno} {
|
||||
@ -144,12 +183,10 @@ proc UniPulseTexture {motor start step numsteps volt freq bins oscno} {
|
||||
|
||||
for {set i 0} {$i < $numsteps} {incr i} {
|
||||
drive $motor [expr $i*$step+$start]
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
}
|
||||
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
|
||||
@ -162,8 +199,8 @@ proc BehlkePulseTexture {motor start step numsteps freq bins oscno} {
|
||||
PulserOn
|
||||
for {set i 0} {$i < $numsteps} {incr i} {
|
||||
drive $motor [expr $i*$step+$start]
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
}
|
||||
}
|
||||
@ -189,12 +226,11 @@ proc SquarePulseVolt {start step fin freq bins oscno} {
|
||||
PulserOn
|
||||
# sct_pulser send "APPL:SQU $freq,$pulservolt,0"
|
||||
}
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc SquarePulseFreq {volt freqlist bins oscno} {
|
||||
@ -209,12 +245,11 @@ proc SquarePulseFreq {volt freqlist bins oscno} {
|
||||
PulserSquare $freq $pulservolt
|
||||
PulserOn
|
||||
# sct_pulser send "APPL:SQU $freq,$pulservolt,0"
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc BehlkePulseFreq {freqlist bins oscno} {
|
||||
@ -227,12 +262,11 @@ proc BehlkePulseFreq {freqlist bins oscno} {
|
||||
wait 3
|
||||
PulserSquareOffs $freq 2.5 2.5
|
||||
PulserOn
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc SinePulseFreq {volt freqlist bins oscno} {
|
||||
@ -246,12 +280,11 @@ proc SinePulseFreq {volt freqlist bins oscno} {
|
||||
wait 3
|
||||
PulserSin $freq $pulservolt
|
||||
PulserOn
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
|
||||
@ -271,12 +304,11 @@ proc UniPulseFreq {volt freqlist bins oscno} {
|
||||
PulserSquareOffs $freq $pulservolt $pulseroffs
|
||||
PulserOn
|
||||
# sct_pulser send "APPL:SQU $freq,$pulservolt,[expr {$pulservolt/2}]"
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
|
||||
proc UniPulseFatigue {volt freq bins oscno reps runs} {
|
||||
@ -290,13 +322,14 @@ proc UniPulseFatigue {volt freq bins oscno reps runs} {
|
||||
for {set i 0} {$i<$runs} {incr i} {
|
||||
newfile HISTOGRAM_XYT
|
||||
for {set j 0} {$j<$reps} {incr j} {
|
||||
oscmd start $oscno
|
||||
hmm countblock
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
save $j
|
||||
}
|
||||
oscmd stop
|
||||
}
|
||||
PulserOff
|
||||
set pulserstate 0
|
||||
Histmem_strobo_off
|
||||
|
||||
}
|
||||
@ -315,6 +348,7 @@ proc PulserBurst {} {
|
||||
if {[string first 1 $sval] >-1} {break}
|
||||
}
|
||||
PulserOff
|
||||
set pulserstate 0
|
||||
|
||||
}
|
||||
|
||||
@ -338,6 +372,7 @@ proc VoltPulseRun {vlo vhi freq cycl} {
|
||||
sct_pulser send "BURS:NCYC $prem; NCYC?"
|
||||
PulserBurst
|
||||
PulserOff
|
||||
set pulserstate 0
|
||||
sct_pulser send "BURS:STAT OFF; STAT?"
|
||||
|
||||
}
|
||||
@ -376,6 +411,7 @@ proc OneTri {volt period} {
|
||||
sct_pulser send "BURS:NCYC 1; NCYC?"
|
||||
PulserBurst
|
||||
PulserOff
|
||||
set pulserstat 0
|
||||
}
|
||||
|
||||
|
||||
@ -384,6 +420,9 @@ publish GetVolt user
|
||||
publish SetDC user
|
||||
publish SetVolt user
|
||||
publish SetVoltScale user
|
||||
publish SingleVTexScan user
|
||||
publish VListTexScan user
|
||||
publish SetRampParms user
|
||||
publish SingleVolt user
|
||||
publish VoltRamp user
|
||||
publish SquarePulseVolt user
|
||||
@ -399,5 +438,6 @@ publish SquarePulseTexture user
|
||||
publish BehlkePulseTexture user
|
||||
publish BehlkePulseFreq user
|
||||
publish UniPulseTexture user
|
||||
publish VoltSetStep user
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@ proc PulserSquareOffs {Freq Volt Offs} {
|
||||
proc PulserDC {Volt} {
|
||||
#NOTE: Setting FUNC DC generates a remote ctrl error if the
|
||||
# burst mode happens to be on
|
||||
set resp [sct_pulser transact "BURS:STAT OFF;:FUNC DC;:VOLT:OFFS $Volt; OFFS?"]
|
||||
set resp [sct_pulser send "BURS:STAT OFF;:FUNC DC;:VOLT:OFFS $Volt; OFFS?"]
|
||||
broadcast $resp
|
||||
|
||||
}
|
||||
|
@ -35,8 +35,8 @@ proc ::counter::ic_initialize {args} {
|
||||
# This must be sourced before the hmm_configuration.tcl until we separate the scan setup from the hmm setup
|
||||
for {set i 0; set n 1} {$i < $isc_numchannels} {incr i; incr n} {
|
||||
MakeCounter bm$n anstomonitor [ params host $isc_monitor_address port [lindex $isc_portlist $i] ]
|
||||
bm$n send scan=1
|
||||
bm$n send sample=10
|
||||
bm$n send set scan=1
|
||||
bm$n send set sample=10
|
||||
append bm_list "bm$n "
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,860 @@
|
||||
# Generated driver for oxford10tlv
|
||||
# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent
|
||||
#
|
||||
|
||||
namespace eval ::scobj::oxford10tlv {
|
||||
set debug_threshold 5
|
||||
}
|
||||
|
||||
proc ::scobj::oxford10tlv::debug_log {tc_root debug_level debug_string} {
|
||||
set catch_status [ catch {
|
||||
set debug_threshold [hgetpropval ${tc_root} debug_threshold]
|
||||
if {${debug_level} >= ${debug_threshold}} {
|
||||
set now [clock seconds]
|
||||
set ts [clock format ${now} -format "%Y%m%d"]
|
||||
set log_file_name "../log/oxford10tlv_[basename ${tc_root}]_${ts}.log"
|
||||
set fd [open "${log_file_name}" "a"]
|
||||
set ts [clock format ${now} -format "%T"]
|
||||
puts ${fd} "${ts} ${debug_string}"
|
||||
close ${fd}
|
||||
}
|
||||
} catch_message ]
|
||||
}
|
||||
|
||||
proc ::scobj::oxford10tlv::sics_log {debug_level debug_string} {
|
||||
set catch_status [ catch {
|
||||
set debug_threshold ${::scobj::oxford10tlv::debug_threshold}
|
||||
if {${debug_level} >= ${debug_threshold}} {
|
||||
sicslog "::scobj::oxford10tlv::${debug_string}"
|
||||
}
|
||||
} catch_message ]
|
||||
}
|
||||
|
||||
# check function for hset change
|
||||
proc ::scobj::oxford10tlv::check_error {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "check_error tc_root=${tc_root} sct=[sct] target=[sct target]"
|
||||
set setpoint [sct target]
|
||||
if { [hpropexists [sct] lowerlimit] } {
|
||||
set lolimit [sct lowerlimit]
|
||||
} else {
|
||||
# lowerlimit not set, use target
|
||||
set lolimit [sct target]
|
||||
}
|
||||
if { [hpropexists [sct] upperlimit] } {
|
||||
set hilimit [sct upperlimit]
|
||||
} else {
|
||||
# upperlimit not set, use target
|
||||
set hilimit [sct target]
|
||||
}
|
||||
# check_error hook code starts
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
set my_state [hval ${tc_root}/magnet/state]
|
||||
if {${my_state} != "IDLE"} {
|
||||
error "Cannot run/drive in state '${my_state}', must be 'IDLE'"
|
||||
}
|
||||
} else {
|
||||
error "Use run/drive and not hset"
|
||||
}
|
||||
}
|
||||
# check_error hook code ends
|
||||
if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } {
|
||||
error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]"
|
||||
}
|
||||
return OK
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# checklimits function for driveable interface
|
||||
proc ::scobj::oxford10tlv::checklimits {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "checklimits tc_root=${tc_root} sct=[sct] target=[sct target]"
|
||||
set setpoint [sct target]
|
||||
if { [hpropexists [sct] lowerlimit] } {
|
||||
set lolimit [sct lowerlimit]
|
||||
} else {
|
||||
# lowerlimit not set, use target
|
||||
set lolimit [sct target]
|
||||
}
|
||||
if { [hpropexists [sct] upperlimit] } {
|
||||
set hilimit [sct upperlimit]
|
||||
} else {
|
||||
# upperlimit not set, use target
|
||||
set hilimit [sct target]
|
||||
}
|
||||
# checklimits hook code goes here
|
||||
if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } {
|
||||
sct driving 0
|
||||
error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]"
|
||||
}
|
||||
return OK
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# check function for hset change
|
||||
proc ::scobj::oxford10tlv::checkrange {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "checkrange tc_root=${tc_root} sct=[sct] target=[sct target]"
|
||||
set setpoint [sct target]
|
||||
if { [hpropexists [sct] lowerlimit] } {
|
||||
set lolimit [sct lowerlimit]
|
||||
} else {
|
||||
# lowerlimit not set, use target
|
||||
set lolimit [sct target]
|
||||
}
|
||||
if { [hpropexists [sct] upperlimit] } {
|
||||
set hilimit [sct upperlimit]
|
||||
} else {
|
||||
# upperlimit not set, use target
|
||||
set hilimit [sct target]
|
||||
}
|
||||
# checkrange hook code goes here
|
||||
if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } {
|
||||
error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]"
|
||||
}
|
||||
return OK
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# checkstatus function for driveable interface
|
||||
proc ::scobj::oxford10tlv::checkstatus {tc_root} {
|
||||
set catch_status [ catch {
|
||||
# checkstatus hook code goes here
|
||||
if {[sct driving]} {
|
||||
set sp "[sct target]"
|
||||
if {[hpropexists [sct] simulated] && [sct simulated] == "true"} {
|
||||
set pv "${sp}"
|
||||
hupdateif ${tc_root}/[sct driveable] ${sp}
|
||||
} else {
|
||||
set pv "[hval ${tc_root}/[sct driveable]]"
|
||||
}
|
||||
if { abs(${pv} - ${sp}) <= [sct tolerance] } {
|
||||
if { [hpropexists [sct] settle_time] } {
|
||||
if { [hpropexists [sct] settle_time_start] } {
|
||||
if { [sct utime] - [sct settle_time_start] >= [sct settle_time]} {
|
||||
sct driving 0
|
||||
return "idle"
|
||||
}
|
||||
return "busy"
|
||||
} else {
|
||||
sct utime settle_time_start
|
||||
return "busy"
|
||||
}
|
||||
}
|
||||
sct driving 0
|
||||
return "idle"
|
||||
}
|
||||
if { [hpropexists [sct] settle_time_start] } {
|
||||
hdelprop [sct] settle_time_start
|
||||
}
|
||||
return "busy"
|
||||
} else {
|
||||
return "idle"
|
||||
}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to request the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::fetch_state {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "fetch_state tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set cmd "${cmd_str}"
|
||||
# fetch_state hook code starts
|
||||
set my_state [hval [sct]]
|
||||
set cmd "@@NOSEND@@"
|
||||
if {${my_state} == "START"} {
|
||||
set cmd "setHS ON\r\n@@NOREPLY@@"
|
||||
sct utime start_time
|
||||
hupdate [sct] "HTRON"
|
||||
} elseif {${my_state} == "HTRON"} {
|
||||
if {[hpropexists [sct] htron_delay]} {
|
||||
set htron_delay [sct htron_delay]
|
||||
if {$htron_delay < 10} {
|
||||
set htron_delay 30
|
||||
} elseif {$htron_delay > 60} {
|
||||
set htron_delay 30
|
||||
}
|
||||
} else {
|
||||
set htron_delay 30
|
||||
}
|
||||
if {[sct utime] - [sct start_time] > $htron_delay} {
|
||||
set cmd "setF [hval ${tc_root}/magnet/setpoint]\r\n@@NOREPLY@@"
|
||||
hupdate [sct] "DRIVE"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "DRIVE"} {
|
||||
if {[hgetpropval ${tc_root}/magnet/setpoint driving] == 0} {
|
||||
set cmd "setHS OFF\r\n@@NOREPLY@@"
|
||||
sct utime start_time
|
||||
hupdate [sct] "HTROFF"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "HTROFF"} {
|
||||
if {[hpropexists [sct] htroff_delay]} {
|
||||
set htroff_delay [sct htroff_delay]
|
||||
if {$htroff_delay <= 10} {
|
||||
set htroff_delay 30
|
||||
} elseif {$htroff_delay >= 60} {
|
||||
set htroff_delay 30
|
||||
}
|
||||
} else {
|
||||
set htroff_delay 30
|
||||
}
|
||||
if {[sct utime] - [sct start_time] > $htroff_delay} {
|
||||
hupdate [sct] "IDLE"
|
||||
} else {
|
||||
set nextState "idle"
|
||||
}
|
||||
} elseif {${my_state} == "IDLE"} {
|
||||
set nextState "idle"
|
||||
}
|
||||
# fetch_state hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
debug_log ${tc_root} 1 "fetch_state sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to request the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::getValue {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "getValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set cmd "${cmd_str}"
|
||||
# getValue hook code goes here
|
||||
debug_log ${tc_root} 1 "getValue sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# halt function for driveable interface
|
||||
proc ::scobj::oxford10tlv::halt {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "halt tc_root=${tc_root} sct=[sct] driving=[sct driving]"
|
||||
### TODO hset [sct] [hval [sct]]
|
||||
# halt hook code goes here
|
||||
sct driving 0
|
||||
return "idle"
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to check the write parameter on a device
|
||||
proc ::scobj::oxford10tlv::noResponse {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "noResponse tc_root=${tc_root} sct=[sct] resp=[sct result]"
|
||||
# noResponse hook code goes here
|
||||
return "idle"
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::rdValue {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "rdValue tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# rdValue hook code goes here
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::read_field {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_field tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_field hook code starts
|
||||
set s1 [string trimright [sct result] "\n"]
|
||||
set s2 [split $s1 ";"]
|
||||
if {[llength $s2] > 1} {
|
||||
if {[string equal -nocase -length 14 "Field_Current=" [lindex $s2 0]]} {
|
||||
#hupdateif ${tc_root}/magnet/current [string range [lindex $s2 0] 14 end]
|
||||
set current [string range [lindex $s2 0] 14 end]
|
||||
hsetprop ${tc_root}/magnet/current result ${current}
|
||||
set ns [namespace current]
|
||||
sct with ${tc_root}/magnet/current "${ns}::rdValue ${tc_root}"
|
||||
}
|
||||
if {[string equal -nocase -length 12 "Field_Tesla=" [lindex $s2 1]]} {
|
||||
set data [string range [lindex $s2 1] 12 end]
|
||||
}
|
||||
}
|
||||
# read_field hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::read_heater {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_heater tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_heater hook code goes here
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::read_rate {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_rate tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_rate hook code goes here
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to parse the read of a parameter on a device
|
||||
proc ::scobj::oxford10tlv::read_state {tc_root} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "read_state tc_root=${tc_root} sct=[sct] result=[sct result]"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set data [sct result]
|
||||
set nextState "idle"
|
||||
if {[string equal -nocase -length 7 ${data} "ASCERR:"]} {
|
||||
# the protocol driver has reported an error
|
||||
sct geterror "${data}"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
# read_state hook code starts
|
||||
return "idle"
|
||||
# read_state hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { ${data} != [sct oldval] } {
|
||||
debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]"
|
||||
sct oldval ${data}
|
||||
sct update ${data}
|
||||
sct utime readtime
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::oxford10tlv::setValue {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "setValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# setValue hook code goes here
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "setValue sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::oxford10tlv::write_heater {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "write_heater tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# write_heater hook code starts
|
||||
if {${par} == 0} {
|
||||
set cmd "setHS OFF\r\n@@NOREPLY@@"
|
||||
} elseif {${par} == 1} {
|
||||
set cmd "setHS ON\r\n@@NOREPLY@@"
|
||||
} else {
|
||||
error "Invalid parameter '${par}' should be 0 or 1"
|
||||
}
|
||||
# Invoke the read function to set the value as if read back
|
||||
sct result $par
|
||||
read_heater ${tc_root}
|
||||
# write_heater hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "write_heater sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::oxford10tlv::write_rate {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "write_rate tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# write_rate hook code starts
|
||||
if {${par} >= 0 && ${par} <= 10} {
|
||||
set cmd "setR ${par}\r\n@@NOREPLY@@"
|
||||
} else {
|
||||
error "Invalid parameter '${par}' should be 0 to 10"
|
||||
}
|
||||
# Invoke the read function to set the value as if read back
|
||||
sct result $par
|
||||
read_rate ${tc_root}
|
||||
# write_rate hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "write_rate sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
# function to write a parameter value on a device
|
||||
proc ::scobj::oxford10tlv::write_setpoint {tc_root nextState cmd_str} {
|
||||
set catch_status [ catch {
|
||||
debug_log ${tc_root} 1 "write_setpoint tc_root=${tc_root} sct=[sct] cmd=${cmd_str}"
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
hdelprop [sct] geterror
|
||||
}
|
||||
set par [sct target]
|
||||
set cmd "${cmd_str}${par}"
|
||||
# write_setpoint hook code starts
|
||||
hset ${tc_root}/magnet/state "START"
|
||||
# Force the driving flag for the state check
|
||||
sct driving 1
|
||||
# Set the value on the field
|
||||
hupdateif [sct] $par
|
||||
# It's all over now
|
||||
set cmd "@@NOSEND@@"
|
||||
set nextState "idle"
|
||||
# write_setpoint hook code ends
|
||||
if { [hpropexists [sct] geterror] } {
|
||||
debug_log ${tc_root} 9 "[sct] error: [sct geterror]"
|
||||
error "[sct geterror]"
|
||||
}
|
||||
if { [hpropexists [sct] driving] } {
|
||||
if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } {
|
||||
sct driving 1
|
||||
}
|
||||
}
|
||||
debug_log ${tc_root} 1 "write_setpoint sct send ${cmd}"
|
||||
if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} {
|
||||
sct send "${cmd}"
|
||||
}
|
||||
return ${nextState}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
proc ::scobj::oxford10tlv::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port id datype interval } {
|
||||
::scobj::oxford10tlv::sics_log 9 "::scobj::oxford10tlv::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${datype} ${interval}"
|
||||
set ns "[namespace current]"
|
||||
set catch_status [ catch {
|
||||
|
||||
MakeSICSObj ${name} SCT_OBJECT
|
||||
|
||||
sicslist setatt ${name} driver oxford10tlv
|
||||
sicslist setatt ${name} klass ${device_class}
|
||||
sicslist setatt ${name} long_name ${name}
|
||||
|
||||
set scobj_hpath /sics/${name}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet plain spy none
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/current plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/current control true
|
||||
hsetprop ${scobj_hpath}/magnet/current data true
|
||||
hsetprop ${scobj_hpath}/magnet/current mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/current nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/current oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/current klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/current sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/current type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/current nxalias "${name}_magnet_current"
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/field plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/field read ${ns}::getValue ${scobj_hpath} read_field {getF}
|
||||
hsetprop ${scobj_hpath}/magnet/field read_field ${ns}::read_field ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/field control true
|
||||
hsetprop ${scobj_hpath}/magnet/field data true
|
||||
hsetprop ${scobj_hpath}/magnet/field mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/field nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/field oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/field klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/field sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/field type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/field nxalias "${name}_magnet_field"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} poll ${scobj_hpath}/magnet/field 5
|
||||
hsetprop ${scobj_hpath}/magnet/field simulated false
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for oxford10tlv"
|
||||
hsetprop ${scobj_hpath}/magnet/field simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/htr_sw plain user int
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw write ${ns}::write_heater ${scobj_hpath} noResponse {}
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw check ${ns}::checkrange ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw control true
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw data true
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw values 0,1
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw oldval 0
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw nxalias "${name}_magnet_htr_sw"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} write ${scobj_hpath}/magnet/htr_sw
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw simulated false
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for oxford10tlv"
|
||||
hsetprop ${scobj_hpath}/magnet/htr_sw simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/rate plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/rate write ${ns}::write_rate ${scobj_hpath} noResponse {}
|
||||
hsetprop ${scobj_hpath}/magnet/rate noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/rate check ${ns}::checkrange ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/rate control true
|
||||
hsetprop ${scobj_hpath}/magnet/rate data true
|
||||
hsetprop ${scobj_hpath}/magnet/rate mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/rate nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/rate oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/rate klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/rate sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/rate type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/rate nxalias "${name}_magnet_rate"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} write ${scobj_hpath}/magnet/rate
|
||||
hsetprop ${scobj_hpath}/magnet/rate simulated false
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for oxford10tlv"
|
||||
hsetprop ${scobj_hpath}/magnet/rate simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/setpoint plain user float
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint write ${ns}::write_setpoint ${scobj_hpath} noResponse {}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint noResponse ${ns}::noResponse ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint check ${ns}::check_error ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint driving 0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint checklimits ${ns}::checklimits ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint checkstatus ${ns}::checkstatus ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint halt ${ns}::halt ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint driveable magnet/field
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint control true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint data true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint mutable true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint nxsave true
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint lowerlimit -10
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint upperlimit 10
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint tolerance 0.01
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint oldval 0.0
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint klass "parameter"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint settle_time "30"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint type "drivable"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint nxalias "${name}_magnet_setpoint"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} write ${scobj_hpath}/magnet/setpoint
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint simulated false
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for oxford10tlv"
|
||||
hsetprop ${scobj_hpath}/magnet/setpoint simulated true
|
||||
}
|
||||
|
||||
hfactory ${scobj_hpath}/magnet/state plain user text
|
||||
hsetprop ${scobj_hpath}/magnet/state read ${ns}::fetch_state ${scobj_hpath} read_state {}
|
||||
hsetprop ${scobj_hpath}/magnet/state read_state ${ns}::read_state ${scobj_hpath}
|
||||
hsetprop ${scobj_hpath}/magnet/state control true
|
||||
hsetprop ${scobj_hpath}/magnet/state data false
|
||||
hsetprop ${scobj_hpath}/magnet/state mutable false
|
||||
hsetprop ${scobj_hpath}/magnet/state nxsave false
|
||||
hsetprop ${scobj_hpath}/magnet/state oldval IDLE
|
||||
hset ${scobj_hpath}/magnet/state IDLE
|
||||
hsetprop ${scobj_hpath}/magnet/state htroff_delay "10"
|
||||
hsetprop ${scobj_hpath}/magnet/state htron_delay "10"
|
||||
hsetprop ${scobj_hpath}/magnet/state sdsinfo "::nexus::scobj::sdsinfo"
|
||||
hsetprop ${scobj_hpath}/magnet/state type "part"
|
||||
hsetprop ${scobj_hpath}/magnet/state nxalias "${name}_magnet_state"
|
||||
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
${sct_controller} poll ${scobj_hpath}/magnet/state 1
|
||||
hsetprop ${scobj_hpath}/magnet/state simulated false
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for oxford10tlv"
|
||||
hsetprop ${scobj_hpath}/magnet/state simulated true
|
||||
}
|
||||
hsetprop ${scobj_hpath}/magnet data "true"
|
||||
hsetprop ${scobj_hpath}/magnet klass "@none"
|
||||
hsetprop ${scobj_hpath}/magnet type "part"
|
||||
ansto_makesctdrive ${name}_magnet_setpoint ${scobj_hpath}/magnet/setpoint ${scobj_hpath}/magnet/field ${sct_controller}
|
||||
hsetprop ${scobj_hpath} driver oxford10tlv
|
||||
hsetprop ${scobj_hpath} klass ${device_class}
|
||||
hsetprop ${scobj_hpath} data true
|
||||
hsetprop ${scobj_hpath} debug_threshold 5
|
||||
# mkDriver hook code goes here
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
proc ::scobj::oxford10tlv::add_driver {name device_class simulation_flag ip_address tcp_port id datype interval} {
|
||||
set catch_status [ catch {
|
||||
::scobj::oxford10tlv::sics_log 9 "::scobj::oxford10tlv::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${datype} ${interval}"
|
||||
if {[string equal -nocase "${simulation_flag}" "false"]} {
|
||||
if {[string equal -nocase "aqadapter" "${ip_address}"]} {
|
||||
::scobj::oxford10tlv::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}"
|
||||
makesctcontroller sct_${name} aqadapter ${tcp_port}
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "makesctcontroller sct_${name} std ${ip_address}:${tcp_port}"
|
||||
makesctcontroller sct_${name} std ${ip_address}:${tcp_port}
|
||||
}
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 9 "simulation_flag=${simulation_flag} => Null sctcontroller for oxford10tlv"
|
||||
::scobj::oxford10tlv::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"
|
||||
makesctcontroller sct_${name} aqadapter NULL
|
||||
}
|
||||
::scobj::oxford10tlv::sics_log 1 "::scobj::oxford10tlv::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${datype} ${interval}"
|
||||
::scobj::oxford10tlv::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${datype} ${interval}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
namespace eval ::scobj::oxford10tlv {
|
||||
namespace export debug_threshold
|
||||
namespace export debug_log
|
||||
namespace export sics_log
|
||||
namespace export mkDriver
|
||||
namespace export add_driver
|
||||
}
|
||||
|
||||
proc add_oxford10tlv {name ip_address tcp_port id datype interval} {
|
||||
set simulation_flag "[string tolower [SplitReply [environment_simulation]]]"
|
||||
::scobj::oxford10tlv::add_driver ${name} "environment" ${simulation_flag} ${ip_address} ${tcp_port} ${id} ${datype} ${interval}
|
||||
}
|
||||
|
||||
clientput "file evaluation of sct_oxford10tlv.tcl"
|
||||
::scobj::oxford10tlv::sics_log 9 "file evaluation of sct_oxford10tlv.tcl"
|
||||
|
||||
proc ::scobj::oxford10tlv::read_config {} {
|
||||
set catch_status [ catch {
|
||||
set ns "::scobj::oxford10tlv"
|
||||
dict for {k u} $::config_dict {
|
||||
if { [dict exists $u "implementation"] } {
|
||||
set simulation_flag "[string tolower [SplitReply [environment_simulation]]]"
|
||||
set device_class "environment"
|
||||
if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } {
|
||||
continue
|
||||
}
|
||||
set enabled [string tolower [dict get $u "enabled"]]
|
||||
if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } {
|
||||
continue
|
||||
}
|
||||
if { [dict exists $u "simulation_group"] } {
|
||||
set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]]
|
||||
}
|
||||
if { [dict exists $u "device_class"] } {
|
||||
set device_class "[dict get $u "device_class"]"
|
||||
}
|
||||
set name [dict get $u name]
|
||||
set implementation [dict get $u "implementation"]
|
||||
if { !([dict exists $::config_dict $implementation]) } {
|
||||
continue
|
||||
}
|
||||
set v [dict get $::config_dict $implementation]
|
||||
if { !([dict exists $v "driver"]) } {
|
||||
continue
|
||||
}
|
||||
if { [string equal -nocase [dict get $v "driver"] "oxford10tlv"] } {
|
||||
if { ![string equal -nocase "${simulation_flag}" "false"] } {
|
||||
set asyncqueue "null"
|
||||
${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue"
|
||||
${ns}::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"
|
||||
makesctcontroller sct_${name} aqadapter NULL
|
||||
} elseif { [dict exists $v "asyncqueue"] } {
|
||||
set asyncqueue [dict get $v "asyncqueue"]
|
||||
if { [string equal -nocase ${asyncqueue} "sct"] } {
|
||||
set ip_address [dict get $v ip]
|
||||
set tcp_port [dict get $v port]
|
||||
makesctcontroller sct_${name} std ${ip_address}:${tcp_port}
|
||||
} else {
|
||||
makesctcontroller sct_${name} aqadapter ${asyncqueue}
|
||||
}
|
||||
} else {
|
||||
if { [dict exists $v "asyncprotocol"] } {
|
||||
set asyncprotocol [dict get $v "asyncprotocol"]
|
||||
} else {
|
||||
set asyncprotocol ${name}_protocol
|
||||
MakeAsyncProtocol ${asyncprotocol}
|
||||
if { [dict exists $v "sendterminator"] } {
|
||||
${asyncprotocol} sendterminator "[dict get $v "sendterminator"]"
|
||||
} elseif { [dict exists $v "terminator"] } {
|
||||
${asyncprotocol} sendterminator "[dict get $v "terminator"]"
|
||||
}
|
||||
if { [dict exists $v "replyterminator"] } {
|
||||
${asyncprotocol} replyterminator "[dict get $v "replyterminator"]"
|
||||
} elseif { [dict exists $v "terminator"] } {
|
||||
${asyncprotocol} replyterminator "[dict get $v "terminator"]"
|
||||
}
|
||||
}
|
||||
set asyncqueue ${name}_queue
|
||||
set ip_address [dict get $v ip]
|
||||
set tcp_port [dict get $v port]
|
||||
MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port}
|
||||
if { [dict exists $v "timeout"] } {
|
||||
${asyncqueue} timeout "[dict get $v "timeout"]"
|
||||
}
|
||||
makesctcontroller sct_${name} aqadapter ${asyncqueue}
|
||||
}
|
||||
set arg_list [list]
|
||||
set missing_list [list]
|
||||
foreach arg {id datype interval} {
|
||||
if {[dict exists $u $arg]} {
|
||||
lappend arg_list "[dict get $u $arg]"
|
||||
} elseif {[dict exists $v $arg]} {
|
||||
lappend arg_list "[dict get $v $arg]"
|
||||
} else {
|
||||
${ns}::sics_log 9 "Missing configuration value $arg"
|
||||
lappend missing_list $arg
|
||||
}
|
||||
}
|
||||
if { [llength $missing_list] > 0 } {
|
||||
error "$name is missing configuration values $missing_list"
|
||||
}
|
||||
${ns}::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
if { [info exists ::config_dict] } {
|
||||
::scobj::oxford10tlv::read_config
|
||||
} else {
|
||||
::scobj::oxford10tlv::sics_log 5 "No config dict"
|
||||
}
|
@ -22,7 +22,7 @@ driver tsi_smc = {
|
||||
permlink = 'B.SP01';
|
||||
writeable = 1;
|
||||
write_function = setGauss;
|
||||
lowerlimit = 0; upperlimit = 500.0; tolerance = 10;
|
||||
lowerlimit = 0; upperlimit = 15000.0; tolerance = 10;
|
||||
property settle_time = 5;
|
||||
mutable = true;
|
||||
property klass = 'sensor';
|
||||
@ -49,7 +49,7 @@ driver tsi_smc = {
|
||||
priv = user;
|
||||
type = text;
|
||||
var Rate = { type = float; write_command = "A"; };
|
||||
var Lower = { type = float; write_command = "L"; lowerlimit = 0; upperlimit = 2; property 'units' = "A"; };
|
||||
var Lower = { type = float; write_command = "L"; lowerlimit = 0; upperlimit = 60; property 'units' = "A"; };
|
||||
var Ramp = { type = int; write_command = "R"; allowed = "0,1"; lowerlimit = 0; upperlimit = 1; };
|
||||
var Pause = { type = int; write_command = "P"; allowed = "0,1"; lowerlimit = 0; upperlimit = 1; };
|
||||
};
|
||||
|
@ -298,7 +298,7 @@ proc ::scobj::tsi_smc::mkDriver { sct_controller name device_class simulation_fl
|
||||
hsetprop ${scobj_hpath}/setpoint mutable true
|
||||
hsetprop ${scobj_hpath}/setpoint nxsave true
|
||||
hsetprop ${scobj_hpath}/setpoint lowerlimit 0
|
||||
hsetprop ${scobj_hpath}/setpoint upperlimit 500.0
|
||||
hsetprop ${scobj_hpath}/setpoint upperlimit 15000.0
|
||||
hsetprop ${scobj_hpath}/setpoint tolerance 10
|
||||
hsetprop ${scobj_hpath}/setpoint permlink data_set "B[format "%02d" ${id}]SP01"
|
||||
hsetprop ${scobj_hpath}/setpoint @description "B[format "%02d" ${id}]SP01"
|
||||
@ -475,7 +475,7 @@ proc ::scobj::tsi_smc::mkDriver { sct_controller name device_class simulation_fl
|
||||
hsetprop ${scobj_hpath}/b/Lower mutable true
|
||||
hsetprop ${scobj_hpath}/b/Lower nxsave true
|
||||
hsetprop ${scobj_hpath}/b/Lower lowerlimit 0
|
||||
hsetprop ${scobj_hpath}/b/Lower upperlimit 2
|
||||
hsetprop ${scobj_hpath}/b/Lower upperlimit 60
|
||||
hsetprop ${scobj_hpath}/b/Lower oldval 0.0
|
||||
hsetprop ${scobj_hpath}/b/Lower klass "parameter"
|
||||
hsetprop ${scobj_hpath}/b/Lower sdsinfo "::nexus::scobj::sdsinfo"
|
||||
|
@ -22,7 +22,7 @@ driver julabo_lh45_gen = {
|
||||
permlink = 'T.SP01';
|
||||
writeable = 1; write_function = setPoint; write_command = 'out_sp_00';
|
||||
driveable = sensor/'value';
|
||||
lowerlimit = 10; upperlimit = 90; tolerance = '${tol}';
|
||||
lowerlimit = -20; upperlimit = 90; tolerance = '${tol}';
|
||||
}
|
||||
var overtemp_warnlimit = {
|
||||
read_command = 'in_sp_03';
|
||||
|
@ -485,7 +485,7 @@ proc ::scobj::julabo_lh45_gen::mkDriver { sct_controller name device_class simul
|
||||
hsetprop ${scobj_hpath}/setpoint data true
|
||||
hsetprop ${scobj_hpath}/setpoint mutable true
|
||||
hsetprop ${scobj_hpath}/setpoint nxsave true
|
||||
hsetprop ${scobj_hpath}/setpoint lowerlimit 10
|
||||
hsetprop ${scobj_hpath}/setpoint lowerlimit -20
|
||||
hsetprop ${scobj_hpath}/setpoint upperlimit 90
|
||||
hsetprop ${scobj_hpath}/setpoint tolerance ${tol}
|
||||
hsetprop ${scobj_hpath}/setpoint permlink data_set "T[format "%02d" ${id}]SP01"
|
||||
|
@ -439,3 +439,88 @@ proc add_julabo_lh45 { name IP port {sensor "bath"} {_tol 5.0} {CID 1} {CTYPE T}
|
||||
}
|
||||
makesctemon $name /sics/$name/emon/monmode /sics/$name/emon/isintol /sics/$name/emon/errhandler
|
||||
}
|
||||
|
||||
namespace eval ::scobj::julabo_lh45 {
|
||||
set debug_threshold 5
|
||||
}
|
||||
proc ::scobj::julabo_lh45::sics_log {debug_level debug_string} {
|
||||
set catch_status [ catch {
|
||||
set debug_threshold ${::scobj::julabo_lh45::debug_threshold}
|
||||
if {${debug_level} >= ${debug_threshold}} {
|
||||
sicslog "::scobj::julabo_lh45::${debug_string}"
|
||||
}
|
||||
} catch_message ]
|
||||
}
|
||||
|
||||
clientput "file evaluation of sct_julabo_lh45.tcl"
|
||||
::scobj::julabo_lh45::sics_log 9 "file evaluation of sct_julabo_lh45.tcl"
|
||||
|
||||
proc ::scobj::julabo_lh45::read_config {} {
|
||||
set catch_status [ catch {
|
||||
set ns "::scobj::julabo_lh45"
|
||||
dict for {k v} $::config_dict {
|
||||
if { [dict exists $v "implementation"] } {
|
||||
if { !([dict exists $v "name"] && [dict exists $v "enabled"]) } {
|
||||
continue
|
||||
}
|
||||
set name [dict get $v name]
|
||||
set enabled [string tolower [dict get $v "enabled"]]
|
||||
set implementation [dict get $v "implementation"]
|
||||
if { !([dict exists $::config_dict $implementation]) } {
|
||||
continue
|
||||
}
|
||||
set v [dict get $::config_dict $implementation]
|
||||
if { !([dict exists $v "driver"]) } {
|
||||
continue
|
||||
}
|
||||
if { [string equal -nocase [dict get $v "driver"] "julabo_lh45"] } {
|
||||
if { [string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"] } {
|
||||
if { ![string equal -nocase [SplitReply [environment_simulation]] "false"] } {
|
||||
set asyncqueue "null"
|
||||
${ns}::sics_log 9 "[environment_simulation] => using null asyncqueue"
|
||||
} elseif { [dict exists $v "asyncqueue"] } {
|
||||
set asyncqueue [dict get $v "asyncqueue"]
|
||||
} else {
|
||||
if { [dict exists $v "asyncprotocol"] } {
|
||||
set asyncprotocol [dict get $v "asyncprotocol"]
|
||||
} else {
|
||||
set asyncprotocol ${name}_protocol
|
||||
MakeAsyncProtocol ${asyncprotocol}
|
||||
if { [dict exists $v "terminator"] } {
|
||||
${asyncprotocol} sendterminator "[dict get $v "terminator"]"
|
||||
${asyncprotocol} replyterminator "[dict get $v "terminator"]"
|
||||
}
|
||||
}
|
||||
set asyncqueue ${name}_queue
|
||||
set IP [dict get $v ip]
|
||||
set PORT [dict get $v port]
|
||||
MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${IP} ${PORT}
|
||||
if { [dict exists $v "timeout"] } {
|
||||
${asyncqueue} timeout "[dict get $v "timeout"]"
|
||||
}
|
||||
}
|
||||
set arg_list [list]
|
||||
foreach arg {ctrl_sensor tol id type} {
|
||||
if {[dict exists $v $arg]} {
|
||||
lappend arg_list "[dict get $v $arg]"
|
||||
} else {
|
||||
${ns}::sics_log 9 "Missing configuration value $arg"
|
||||
error "Missing configuration value $arg"
|
||||
}
|
||||
}
|
||||
add_julabo_lh45 ${name} "aqadapter" ${asyncqueue} {*}$arg_list
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch_message ]
|
||||
handle_exception ${catch_status} ${catch_message}
|
||||
}
|
||||
|
||||
if { [info exists ::config_dict] } {
|
||||
::scobj::julabo_lh45::read_config
|
||||
} else {
|
||||
::scobj::julabo_lh45::sics_log 5 "No config dict"
|
||||
}
|
||||
|
||||
|
||||
|
@ -50,7 +50,7 @@ namespace eval ::scobj::[set vendor]_[set device] {
|
||||
|
||||
proc debug_log {debug_level arg_string} {
|
||||
# write a timestamped string message to a log file for debugging
|
||||
set debug_threshold 0
|
||||
set debug_threshold 5
|
||||
if {$debug_level >= $debug_threshold} {
|
||||
set fd [open "[set [namespace current]::log_file]" "a"]
|
||||
set line "[clock format [clock seconds] -format "%T"] $arg_string"
|
||||
|
@ -1471,6 +1471,26 @@ sicslist setatt ::histogram_memory::ratemap_xy_total klass detector
|
||||
sicslist setatt ::histogram_memory::ratemap_xy_total long_name total_maprate
|
||||
sicslist setatt ::histogram_memory::ratemap_xy_total mutable true
|
||||
|
||||
# Returns 0 If all trips acknowledged, -n if n trips unacknowledged, +n if too many acks?
|
||||
::utility::macro::getset float ::histogram_memory::reset_trip {args} {
|
||||
set num_trips [ SplitReply [hmm configure detector_protect_num_trip] ]
|
||||
set num_acks [ SplitReply [hmm configure detector_protect_num_trip_ack] ]
|
||||
set trip_cnt_diff [expr {$num_acks - $num_trips}]
|
||||
if {$args == ""} {
|
||||
return "reset_trip = $trip_cnt_diff"
|
||||
} else {
|
||||
if {$trip_cnt_diff != 0} {
|
||||
hmm configure fat_detector_protect_num_trip_ack $num_trips
|
||||
hmm astop
|
||||
wait 2
|
||||
hmm init
|
||||
}
|
||||
}
|
||||
}
|
||||
sicslist setatt ::histogram_memory::reset_trip klass detector
|
||||
sicslist setatt ::histogram_memory::reset_trip long_name reset_trip
|
||||
sicslist setatt ::histogram_memory::reset_trip data false
|
||||
|
||||
##
|
||||
# @brief Update the beam monitors when the histmem has finished counting.
|
||||
proc ::histogram_memory::countend_event {} {
|
||||
|
@ -150,21 +150,24 @@ proc ::commands::isc_initialize {} {
|
||||
proc RadCollScanRange {motor start step fin oscno} {
|
||||
if {$step==0} {break}
|
||||
if {($start > $fin) && ($step > 0)} {break}
|
||||
if {($start < $fin) && ($step < 0)} {break}
|
||||
if {($start < $fin) && ($step < 0)} {break}
|
||||
set i_bool 0
|
||||
histmem mode unlimited
|
||||
histmem mode unlimited
|
||||
set currentmot $start
|
||||
set i 0
|
||||
set i 0
|
||||
newfile HISTOGRAM_XY
|
||||
while {$i_bool==0} {
|
||||
drive $motor $currentmot
|
||||
$motor send SH`
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
hmm countblock
|
||||
save $i
|
||||
|
||||
set currentmot [expr {$currentmot + $step}]
|
||||
if {($step > 0) && ($currentmot > $fin)} {set i_bool 1}
|
||||
if {($step < 0) && ($currentmot < $fin)} {set i_bool 1}
|
||||
if {($i_bool == 0)} {run $motor $currentmot}
|
||||
save $i
|
||||
incr i
|
||||
}
|
||||
}
|
||||
@ -172,34 +175,50 @@ proc RadCollScanRange {motor start step fin oscno} {
|
||||
publish RadCollScanRange user
|
||||
|
||||
#RadCollScanBi
|
||||
proc RadCollScanBi {motor start step fin oscno motdir} {
|
||||
proc RadCollScanBi {motor start step fin oscno motdir} {
|
||||
|
||||
set i_bool 0
|
||||
histmem mode unlimited
|
||||
set spx -12500
|
||||
set spstep [expr {$spx * $step * $motdir}]
|
||||
histmem stop
|
||||
histmem mode unlimited
|
||||
|
||||
if {$motdir == 1} {
|
||||
set currentmot $start
|
||||
set i 0
|
||||
} else {
|
||||
set currentmot $fin
|
||||
set i [expr {int(($fin-$start)/$step)}]
|
||||
}
|
||||
}
|
||||
drive $motor $currentmot
|
||||
newfile HISTOGRAM_XY
|
||||
|
||||
while {$i_bool==0} {
|
||||
# drive $motor $currentmot
|
||||
oct oscillate_count $oscno
|
||||
oct oscillate start
|
||||
hmm countblock
|
||||
|
||||
|
||||
if {($motdir > 0)} {
|
||||
set currentmot [expr {$currentmot + $step}]
|
||||
if {$currentmot > $fin} {set i_bool 1}
|
||||
incr i
|
||||
|
||||
} else {
|
||||
set currentmot [expr {$currentmot - $step}]
|
||||
if {$currentmot < $start} {set i_bool 1}
|
||||
incr i -1
|
||||
|
||||
}
|
||||
run $motor $currentmot
|
||||
save $i
|
||||
|
||||
if {($i_bool == 0)} {run $motor $currentmot}
|
||||
save $i
|
||||
if {($motdir > 0)} {incr i 1} else {incr i -1}
|
||||
|
||||
# if {($i_bool == 0)} {
|
||||
# $motor send SH`
|
||||
# $motor send PR` $spstep
|
||||
# $motor send BG`
|
||||
#
|
||||
# }
|
||||
# save $i
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,22 @@
|
||||
# Euler cradle scan commands for texture runs
|
||||
# AJS Dec 2010
|
||||
|
||||
proc EulerScan {mstart mstep mend oscno} {
|
||||
ephi speed 5
|
||||
ephi accel 5
|
||||
ephi decel 5
|
||||
echi speed 2
|
||||
set motdir 1
|
||||
drive echi 0 ephi $mstart
|
||||
foreach chival {0 15 30 45 60 75 90} {
|
||||
drive echi $chival
|
||||
RadCollScanBi ephi $mstart $mstep $mend $oscno $motdir
|
||||
set motdir [expr {$motdir * -1}]
|
||||
}
|
||||
drive echi 0 ephi $mstart
|
||||
}
|
||||
|
||||
publish EulerScan user
|
||||
|
||||
# continous scan for EPHI- the euler cradle phi stage (innermost axis)
|
||||
# note make sure controller 2 has the PHISCAN code in it
|
||||
|
@ -28,7 +28,7 @@ proc ::histogram_memory::init_OAT_TABLE {args} {
|
||||
hmm configure fat_frame_source INTERNAL
|
||||
|
||||
|
||||
# set resolution "double_x"
|
||||
# set resolution "double_x"
|
||||
|
||||
switch $resolution {
|
||||
"hires" {
|
||||
|
@ -26,7 +26,7 @@ set mx_Home 8390583
|
||||
#set mom_Home 9274794
|
||||
##set mom_Home 8391038
|
||||
#set mom_Home 8147038
|
||||
set mom_Home 7736816
|
||||
set mom_Home 7979102
|
||||
set mtth_Home 19927837
|
||||
#set mphi_Home 7613516
|
||||
#set mphi_Home 27847793
|
||||
@ -34,6 +34,7 @@ set mphi_Home 8384818
|
||||
#set mchi_Home 9050090
|
||||
#set mchi_Home 25561619
|
||||
set mchi_Home 8389526
|
||||
#set mchi_Home 6847710
|
||||
#set my_Home 6767221
|
||||
set my_Home 8378212
|
||||
set som_Home 17214054
|
||||
@ -343,7 +344,7 @@ Motor $sample_stage_rotate $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
axis E\
|
||||
units degrees\
|
||||
hardlowerlim -71\
|
||||
hardlowerlim -121\
|
||||
hardupperlim 116\
|
||||
maxSpeed 5\
|
||||
maxAccel 3\
|
||||
@ -363,8 +364,10 @@ Motor stth $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
axis F\
|
||||
units degrees\
|
||||
hardlowerlim 15.8\
|
||||
hardlowerlim 13\
|
||||
hardupperlim 29.7\
|
||||
softlowerlim 13.4\
|
||||
softupperlim 29.6\
|
||||
maxSpeed 0.5\
|
||||
maxAccel 0.1\
|
||||
maxDecel 0.1\
|
||||
@ -374,7 +377,7 @@ Motor stth $motor_driver_type [params \
|
||||
bias_bits 25\
|
||||
bias_bias 932070\
|
||||
cntsPerX -93207]
|
||||
stth softlowerlim 15.9
|
||||
stth softlowerlim 13.4
|
||||
stth softupperlim 29.6
|
||||
stth home 28.481113
|
||||
#stth home 18.981113
|
||||
@ -414,28 +417,34 @@ oct long_name oct
|
||||
############################
|
||||
#
|
||||
|
||||
# Monochromator Focusing (HOPG)
|
||||
#Motor mf1 $motor_driver_type [params \
|
||||
# asyncqueue mc3\
|
||||
# axis A\
|
||||
# units degrees\
|
||||
# hardlowerlim xxxx\
|
||||
# hardupperlim xxxx\
|
||||
# maxSpeed xxxx\
|
||||
# maxAccel xxxx\
|
||||
# maxDecel xxxx\
|
||||
# stepsPerX xxxx\
|
||||
# absEnc 1\
|
||||
# absEncHome $mf1_Home\
|
||||
# cntsPerX xxxx]
|
||||
#setHomeandRange -motor mf1 -home 0 -lowrange 0 -uprange 360
|
||||
#mf1 speed 1
|
||||
#mf1 movecount $move_count
|
||||
#mf1 precision 0.01
|
||||
#mf1 part monochromator
|
||||
#mf1 long_name mf1
|
||||
set mf_config 1
|
||||
|
||||
|
||||
switch $mf_config {
|
||||
1 {
|
||||
# Monochromator Focusing (HOPG)
|
||||
Motor mf1 $motor_driver_type [params \
|
||||
asyncqueue mc3\
|
||||
axis A\
|
||||
units degrees\
|
||||
hardlowerlim -0.1\
|
||||
hardupperlim 1.1\
|
||||
maxSpeed 0.1\
|
||||
maxAccel 0.1\
|
||||
maxDecel 0.1\
|
||||
stepsPerX 22000\
|
||||
absEnc 1\
|
||||
absEncHome 3965\
|
||||
cntsPerX -3500]
|
||||
setHomeandRange -motor mf1 -home 0 -lowrange 0 -uprange 1
|
||||
mf1 speed 0.02
|
||||
# mf1 movecount $move_count
|
||||
mf1 precision 0.005
|
||||
mf1 part monochromator
|
||||
mf1 long_name mf1
|
||||
}
|
||||
# Monochromator Focusing (Ge)
|
||||
|
||||
## ffr 31/7/2012
|
||||
## absEncHome was found to be 16777217 on 31/7/2012 when the
|
||||
## encoder clocked over to 114 counts to give a posn
|
||||
@ -444,26 +453,32 @@ oct long_name oct
|
||||
## and has a 24bit range (ie max cnt=16777216)
|
||||
## I set a bias of 10000 counts with absenchome = 10000
|
||||
## so that SICS can drive the axis to the allowed limits.
|
||||
Motor mf2 $motor_driver_type [params \
|
||||
asyncqueue mc3\
|
||||
axis A\
|
||||
units degrees\
|
||||
hardlowerlim -2\
|
||||
hardupperlim 2\
|
||||
maxSpeed 0.1\
|
||||
maxAccel 0.1\
|
||||
maxDecel 0.1\
|
||||
stepsPerX 22000\
|
||||
absEnc 1\
|
||||
absEncHome 42768\
|
||||
bias_bits 24\
|
||||
bias_bias 10000\
|
||||
cntsPerX -3500]
|
||||
setHomeandRange -motor mf2 -home 0 -lowrange 0 -uprange 2
|
||||
mf2 speed 0.02
|
||||
mf2 precision 0.005
|
||||
mf2 part monochromator
|
||||
mf2 long_name mf2
|
||||
|
||||
2 {
|
||||
|
||||
Motor mf2 $motor_driver_type [params \
|
||||
asyncqueue mc3\
|
||||
axis A\
|
||||
units degrees\
|
||||
hardlowerlim -0.1\
|
||||
hardupperlim 1.1\
|
||||
maxSpeed 0.1\
|
||||
maxAccel 0.1\
|
||||
maxDecel 0.1\
|
||||
stepsPerX 22000\
|
||||
absEnc 1\
|
||||
absEncHome 10000\
|
||||
bias_bits 24\
|
||||
bias_bias 10000\
|
||||
cntsPerX -3500]
|
||||
setHomeandRange -motor mf2 -home 0 -lowrange 0 -uprange 1
|
||||
mf2 speed 0.02
|
||||
mf2 precision 0.005
|
||||
mf2 part monochromator
|
||||
mf2 long_name mf2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Slit 1, right
|
||||
Motor ss1r $motor_driver_type [params \
|
||||
|
@ -324,7 +324,6 @@ driver = "west_6100"
|
||||
imptype = temperature
|
||||
ip = 10.157.205.24
|
||||
port = 502
|
||||
timeout = 2000
|
||||
|
||||
[vf2_west4100]
|
||||
asyncprotocol = modbus_ap
|
||||
@ -334,5 +333,4 @@ driver = "west_6100"
|
||||
imptype = temperature
|
||||
ip = 10.157.205.25
|
||||
port = 502
|
||||
timeout = 2000
|
||||
|
||||
|
@ -31,6 +31,7 @@ fileeval $cfPath(environment)/huber_pilot_sct.tcl
|
||||
fileeval $cfPath(environment)/isotech_ps_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl
|
||||
fileeval $cfPath(environment)/temperature/eurotherm_m2000_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/eurotherm_3200_sct.tcl
|
||||
fileeval $cfPath(environment)/sct_keithley_2700.tcl
|
||||
fileeval $cfPath(environment)/keithley_m2700_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/lakeshore_218_sct.tcl
|
||||
@ -61,13 +62,16 @@ fileeval $cfPath(commands)/pulser.tcl
|
||||
fileeval $cfPath(commands)/hvcommands.tcl
|
||||
fileeval $cfPath(commands)/vactex.tcl
|
||||
fileeval $cfPath(commands)/eulerscan.tcl
|
||||
fileeval $cfPath(commands)/cfcommands.tcl
|
||||
fileeval $cfPath(anticollider)/anticollider.tcl
|
||||
fileeval $cfPath(beamline)/sct_he3_polanal.tcl
|
||||
fileeval $cfPath(hmm)/hmm_rapid.tcl
|
||||
source gumxml.tcl
|
||||
|
||||
# Wombat only change to hvcommands' scaleval variable
|
||||
SetVoltScale 2000.0
|
||||
|
||||
|
||||
# The Alice Thing
|
||||
# Qlink : 9600, 8 data, 1 stop, No Parity, None Flow
|
||||
# LS340 : 9600, 7 data, 1 stop, Odd Parity, None Flow
|
||||
|
@ -24,7 +24,8 @@ set my_Home 8389613
|
||||
#set mx_Home 7580366
|
||||
set mx_Home 8392083
|
||||
#set mom_Home 13442930
|
||||
set mom_Home 8218065
|
||||
#set mom_Home 8218065
|
||||
set mom_Home 8295887
|
||||
set mtth_Home 11534660
|
||||
set pcx_Home 6330515
|
||||
set pcr_Home 21650101
|
||||
|
@ -7,3 +7,7 @@ forbid {-inf 200} for m2y when m2om in {10 170}
|
||||
# Following two rules allow recovery if m2om position has crept above 10 or below 170
|
||||
forbid {11 inf} for m2om whenall {m2y in {-inf 200} m2om in {10 11}}
|
||||
forbid {-inf 169} for m2om whenall {m2y in {-inf 200} m2om in {169 170}}
|
||||
|
||||
# Protect long Cd tunnel
|
||||
forbid {-5.65 inf} for m2x when m2om in {170 182}
|
||||
forbid {55.43 inf} for m2x when m2om in {-2 10}
|
||||
|
@ -12,3 +12,24 @@ proc ::anticollider::enable {args} {
|
||||
}
|
||||
|
||||
::anticollider::loadscript acscript.txt
|
||||
|
||||
# Default enable or disable anticollision for all axes
|
||||
# TODO: Provide a list of motors to enable or disable
|
||||
proc anticollider {args} {
|
||||
set usage "Usage: anticollider (enable | disable)"
|
||||
if {$args == "enable"} {
|
||||
# TODO change protect_detector to just 'protect'
|
||||
::anticollider::protect_detector "true"
|
||||
} elseif {$args == "disable"} {
|
||||
::anticollider::protect_detector "false"
|
||||
} elseif {$args == "help"} {
|
||||
clientput $usage
|
||||
} else {
|
||||
if {[SplitReply [::anticollider::protect_detector]] == "false"} {
|
||||
clientput "Anticollision disabled on all axes"
|
||||
} else {
|
||||
clientput "Anticollision enabled on all axes"
|
||||
}
|
||||
}
|
||||
}
|
||||
publish anticollider user
|
||||
|
@ -235,7 +235,7 @@ Motor m1chi $motor_driver_type [params \
|
||||
cntsPerX [expr 131072*100.0/68.681]\
|
||||
nopowersave 1]
|
||||
m1chi precision 0.001
|
||||
m1chi speed 0.200
|
||||
m1chi speed 0.137362
|
||||
m1chi part crystal
|
||||
m1chi long_name m1chi
|
||||
m1chi softlowerlim -2
|
||||
@ -435,7 +435,7 @@ Motor samz $motor_driver_type [params \
|
||||
stepsPerX [expr 25000.0 * 100 / 10.0]\
|
||||
cntsPerX 819.2\
|
||||
absEnc 1\
|
||||
absEncHome 72607]
|
||||
absEncHome 75330]
|
||||
samz part sample
|
||||
samz long_name samz
|
||||
samz softlowerlim 0
|
||||
@ -590,7 +590,7 @@ Motor m2chi $motor_driver_type [params \
|
||||
cntsPerX [expr 131072*100.0/68.681]\
|
||||
nopowersave 1]
|
||||
m2chi precision 0.001
|
||||
m2chi speed 0.200
|
||||
m2chi speed 0.137362
|
||||
m2chi part crystal
|
||||
m2chi long_name m2chi
|
||||
m2chi softlowerlim -2
|
||||
@ -610,7 +610,7 @@ Motor m2om $motor_driver_type [params \
|
||||
port pmc3-kookaburra\
|
||||
axis F\
|
||||
units degrees\
|
||||
hardlowerlim 0\
|
||||
hardlowerlim -2\
|
||||
hardupperlim 182\
|
||||
maxSpeed [expr 300000.0/$m2omSetRate]\
|
||||
maxAccel [expr 25000.0/$m2omSetRate]\
|
||||
@ -673,7 +673,7 @@ Motor m2y $motor_driver_type [params \
|
||||
axis H\
|
||||
units mm\
|
||||
hardlowerlim -4.35\
|
||||
hardupperlim 357.9\
|
||||
hardupperlim 400\
|
||||
maxSpeed [expr 100000.0/$m2ySetRate]\
|
||||
maxAccel [expr 25000.0/$m2ySetRate]\
|
||||
maxDecel [expr 25000.0/$m2ySetRate]\
|
||||
@ -685,7 +685,7 @@ m2y speed 0.5
|
||||
m2y part crystal
|
||||
m2y long_name m2y
|
||||
m2y softlowerlim -4.3
|
||||
m2y softupperlim 355
|
||||
m2y softupperlim 399
|
||||
m2y home 0
|
||||
|
||||
|
||||
|
@ -32,7 +32,7 @@ proc thresholdscan {minVoltage maxVoltage stepVoltage minBMThreshold manBMThresh
|
||||
|
||||
clientput "Start scanning loop now"
|
||||
for {set vol $minVoltage} {$vol <= $maxVoltage} {incr vol $stepVoltage} {
|
||||
emHV1 $vol
|
||||
# emHV1 $vol
|
||||
set curCount ""
|
||||
for {set thres $minBMThreshold} {$thres <= $manBMThreshold} {incr thres $stepBMThreshold} {
|
||||
clientput "set thredshold to $thres"
|
||||
|
@ -45,6 +45,8 @@ fileeval $cfPath(environment)/temperature/mercury_valve_sct.tcl
|
||||
fileeval $cfPath(environment)/sct_protek_common.tcl
|
||||
fileeval $cfPath(environment)/protekmm_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/julabo_lh45_gen_sct.tcl
|
||||
fileeval $cfPath(environment)/sct_rheometer.tcl
|
||||
fileeval $cfPath(environment)/sct_antonparr_MCR500.tcl
|
||||
fileeval $cfPath(counter)/sct_bm.tcl
|
||||
fileeval $cfPath(hmm)/hmm_configuration.tcl
|
||||
fileeval $cfPath(nexus)/nxscripts.tcl
|
||||
@ -54,6 +56,7 @@ fileeval $cfPath(commands)/commands.tcl
|
||||
fileeval $cfPath(anticollider)/anticollider.tcl
|
||||
fileeval $cfPath(parameters)/parameters.tcl
|
||||
|
||||
|
||||
source gumxml.tcl
|
||||
|
||||
::utility::mkVar ::anticollider::protect_detector text manager protect_detector false detector true false
|
||||
|
@ -112,3 +112,8 @@ server_init
|
||||
# WARNING: Do not add any code below server_init, if you do SICS may fail to initialise properly.
|
||||
|
||||
# You can add extra-configuration code in ../extraconfig.tcl
|
||||
# Update chopper speed and phase if a stop or idle command is issued.
|
||||
sicspoll add /instrument/fermi_chopper/mchs hdb 5
|
||||
sicspoll add /instrument/fermi_chopper/mchp hdb 5
|
||||
sicspoll add /instrument/fermi_chopper/schs hdb 5
|
||||
sicspoll add /instrument/fermi_chopper/schp hdb 5
|
||||
|
1
site_ansto/instrument/qld/MANIFEST.TXT
Normal file → Executable file
1
site_ansto/instrument/qld/MANIFEST.TXT
Normal file → Executable file
@ -4,6 +4,5 @@ hipadaba_configuration.tcl
|
||||
hpaths.tcl
|
||||
koala.hdd
|
||||
troubleshoot_setup.tcl
|
||||
extraconfig.tcl
|
||||
InstXML.xml
|
||||
sics_simulation.tcl
|
||||
|
1
site_ansto/instrument/reflectometer/MANIFEST.TXT
Normal file → Executable file
1
site_ansto/instrument/reflectometer/MANIFEST.TXT
Normal file → Executable file
@ -2,7 +2,6 @@ runsics_def.py
|
||||
platypus_configuration.tcl
|
||||
sics_ports.tcl
|
||||
script_validator_ports.tcl
|
||||
extraconfig.tcl
|
||||
config
|
||||
util
|
||||
hostport_config.tcl
|
||||
|
@ -14,10 +14,14 @@ evfactory new dhv1 nhq200 acq 1
|
||||
dhv1 tolerance 5
|
||||
dhv1 rate 25
|
||||
dhv1 upper 3000
|
||||
dhv1 max 3000
|
||||
dhv1 upperlimit 3000
|
||||
#dhv1 lock
|
||||
evfactory new dhv2 nhq200 acq 2
|
||||
dhv2 tolerance 5
|
||||
dhv2 rate 25
|
||||
dhv2 upper 1500
|
||||
dhv1 max 1500
|
||||
dhv1 upperlimit 1500
|
||||
#dhv2 lock
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ fileeval $cfPath(environment)/mvp_valve_sct.tcl
|
||||
fileeval $cfPath(environment)/sct_protek_common.tcl
|
||||
fileeval $cfPath(environment)/protekmm_sct.tcl
|
||||
fileeval $cfPath(environment)/omron_hldc_sct.tcl
|
||||
fileeval $cfPath(environment)/keysight_N8740A_sct.tcl
|
||||
fileeval $cfPath(environment)/magneticField/sct_bruker_BEC1.tcl
|
||||
fileeval $cfPath(environment)/magneticField/bruker_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl
|
||||
@ -48,6 +49,7 @@ fileeval $cfPath(chopper)/chopper.tcl
|
||||
fileeval $cfPath(commands)/commands.tcl
|
||||
fileeval $cfPath(anticollider)/anticollider.tcl
|
||||
fileeval $cfPath(beamline)/polanal.tcl
|
||||
fileeval $cfPath(beamline)/he3_polanal_sct.tcl
|
||||
fileeval $cfPath(commands)/pulser.tcl
|
||||
fileeval $cfPath(commands)/hvcommands.tcl
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined)
|
||||
# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev)
|
||||
foreach {simflag icsval fakedev} {
|
||||
opal_simulation true true
|
||||
opal_simulation false true
|
||||
detector_simulation false true
|
||||
hmm_simulation false true
|
||||
environment_simulation false true
|
||||
|
1
site_ansto/instrument/rsd/MANIFEST.TXT
Normal file → Executable file
1
site_ansto/instrument/rsd/MANIFEST.TXT
Normal file → Executable file
@ -2,7 +2,6 @@ runsics_def.py
|
||||
sics_ports.tcl
|
||||
script_validator_ports.tcl
|
||||
kowari_configuration.tcl
|
||||
extraconfig.tcl
|
||||
config
|
||||
util
|
||||
hostport_config.tcl
|
||||
|
1
site_ansto/instrument/sans/MANIFEST.TXT
Normal file → Executable file
1
site_ansto/instrument/sans/MANIFEST.TXT
Normal file → Executable file
@ -2,7 +2,6 @@ runsics_def.py
|
||||
quokka_configuration.tcl
|
||||
sics_ports.tcl
|
||||
script_validator_ports.tcl
|
||||
extraconfig.tcl
|
||||
config
|
||||
util
|
||||
hostport_config.tcl
|
||||
|
@ -100,4 +100,5 @@ proc add_rheo {rhControl tol settle} {
|
||||
hfactory /sics/$rhControl/settletime plain user float
|
||||
hset /sics/$rhControl/settletime $settle
|
||||
hsetprop /sics/$rhControl timecheck 0
|
||||
hsetprop /sics/$rhControl callBack "rhCallBack /sics/$rhControl"
|
||||
}
|
||||
|
@ -718,7 +718,7 @@ Motor apx $motor_driver_type [params \
|
||||
axis E\
|
||||
units mm\
|
||||
hardlowerlim -260\
|
||||
hardupperlim 5\
|
||||
hardupperlim 45\
|
||||
maxSpeed 5\
|
||||
maxAccel 5\
|
||||
maxDecel 5\
|
||||
@ -730,7 +730,7 @@ apx part collimator
|
||||
apx long_name apx
|
||||
apx home 0
|
||||
apx softlowerlim -255
|
||||
apx softupperlim 5
|
||||
apx softupperlim 45
|
||||
apx speed 5
|
||||
|
||||
# Sample aperture y
|
||||
|
@ -61,12 +61,16 @@ fileeval $cfPath(hmm)/detector.tcl
|
||||
fileeval $cfPath(scan)/scan.tcl
|
||||
fileeval $cfPath(commands)/commands.tcl
|
||||
fileeval $cfPath(anticollider)/anticollider.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_julabo_lh45.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_julabo_lh45_gen.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_qlink.tcl
|
||||
fileeval $cfPath(environment)/magneticField/tsi_smc_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_oxford_itc.tcl
|
||||
fileeval $cfPath(environment)/magneticField/oxford_labview.tcl
|
||||
fileeval $cfPath(environment)/magneticField/sct_oxford10tlv.tcl
|
||||
fileeval $cfPath(environment)/magneticField/sct_oxford12tlv.tcl
|
||||
fileeval $cfPath(environment)/magneticField/sct_bruker_BEC1.tcl
|
||||
fileeval $cfPath(environment)/magneticField/sct_bruker.tcl
|
||||
fileeval $cfPath(beamline)/sct_he3_polanal.tcl
|
||||
fileeval $cfPath(environment)/environment.tcl
|
||||
fileeval $cfPath(environment)/sct_rheometer.tcl
|
||||
fileeval $cfPath(environment)/sct_antonparr_MCR500.tcl
|
||||
|
@ -104,25 +104,58 @@ if { [ info exists ::config_dict ] } {
|
||||
set axis_config 0
|
||||
} elseif {$implementation == "12tmagnet_sample_insert"} {
|
||||
set axis_config 1
|
||||
} elseif {$implementation == "eulerian_cradle"} {
|
||||
set axis_config 2
|
||||
} else {
|
||||
set axis_config 0
|
||||
}
|
||||
}
|
||||
if { [ dict exists $::config_dict m2s2 implementation ] } {
|
||||
set implementation [ dict get $::config_dict m2s2 implementation ]
|
||||
if {$implementation == "normal_m2s2"} {
|
||||
set m2_speed 0.4
|
||||
set m2_accel 0.04
|
||||
set m2_decel 0.04
|
||||
set s2_speed 0.8
|
||||
set s2_accel 0.2
|
||||
set s2_decel 0.2
|
||||
} elseif {$implementation == "extended_m2s2"} {
|
||||
set m2_speed 0.1
|
||||
set m2_accel 0.025
|
||||
set m2_decel 0.025
|
||||
set s2_speed 0.4
|
||||
set s2_accel 0.1
|
||||
set s2_decel 0.1
|
||||
} else {
|
||||
set m2_speed 0.4
|
||||
set m2_accel 0.04
|
||||
set m2_decel 0.04
|
||||
set s2_speed 0.8
|
||||
set s2_accel 0.2
|
||||
set s2_decel 0.2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch $axis_config {
|
||||
0 {
|
||||
set use_normal_config "true"
|
||||
set use_s1_stage "true"
|
||||
set tilt_motor_driver_type $motor_driver_type
|
||||
fileeval $cfPath(motors)/tilt_configuration.tcl
|
||||
}
|
||||
1 {
|
||||
set magmot s1
|
||||
set magmot_aq "mc2"
|
||||
set magmot_axis "A"
|
||||
set use_normal_config "false"
|
||||
set use_s1_stage "false"
|
||||
set tilt_motor_driver_type asim
|
||||
fileeval $cfPath(motors)/tilt_configuration.tcl
|
||||
fileeval $cfPath(motors)/magnet_configuration.tcl
|
||||
}
|
||||
2 {
|
||||
set use_s1_stage "true"
|
||||
fileeval $cfPath(motors)/euler_configuration.tcl
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -250,9 +283,9 @@ m2 motOffDelay 0
|
||||
m2 backlash_offset -0.5
|
||||
m2 creep_offset 0.1
|
||||
m2 creep_precision 0.0
|
||||
m2 speed 0.4
|
||||
m2 accel 0.04
|
||||
m2 decel 0.04
|
||||
m2 speed $m2_speed
|
||||
m2 accel $m2_accel
|
||||
m2 decel $m2_decel
|
||||
|
||||
# mc1: Detector Rotate
|
||||
Motor a2 $motor_driver_type [params \
|
||||
@ -292,100 +325,8 @@ a2 decel 0.2
|
||||
############################
|
||||
#
|
||||
|
||||
# mc2: Sample Tilt 1
|
||||
Motor sgu $tilt_motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis A\
|
||||
units degrees\
|
||||
hardlowerlim -13\
|
||||
hardupperlim 16.5\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7745478\
|
||||
cntsPerX 8192]
|
||||
sgu part sample
|
||||
sgu long_name sgu
|
||||
sgu softlowerlim -13
|
||||
sgu softupperlim 16.5
|
||||
sgu home 0
|
||||
sgu backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Tilt 2
|
||||
Motor sgl $tilt_motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis B\
|
||||
units degrees\
|
||||
hardlowerlim -16.5\
|
||||
hardupperlim 17.5\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7499135\
|
||||
cntsPerX 8192]
|
||||
sgl part sample
|
||||
sgl long_name sgl
|
||||
sgl softlowerlim -16.5
|
||||
sgl softupperlim 17.5
|
||||
sgl home 0
|
||||
sgl backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Up Tanslation
|
||||
Motor stu $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis C\
|
||||
units mm\
|
||||
hardlowerlim -15\
|
||||
hardupperlim 15\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX -25000\
|
||||
absEnc 1\
|
||||
absEncHome 7392933\
|
||||
cntsPerX -8192]
|
||||
stu part sample
|
||||
stu long_name stu
|
||||
stu softlowerlim -15
|
||||
stu softupperlim 15
|
||||
stu home 0.0
|
||||
stu backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Lower Tanslation
|
||||
Motor stl $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis D\
|
||||
units mm\
|
||||
hardlowerlim -15\
|
||||
hardupperlim 15\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7582773\
|
||||
cntsPerX 8192]
|
||||
stl part sample
|
||||
stl long_name stl
|
||||
stl softlowerlim -15
|
||||
stl softupperlim 15
|
||||
stl home 0.0
|
||||
stl backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Rotate
|
||||
if {$use_normal_config == "true"} {
|
||||
if {$use_s1_stage == "true"} {
|
||||
Motor s1 $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
@ -409,6 +350,7 @@ if {$use_normal_config == "true"} {
|
||||
s1 backlash_offset -0.2
|
||||
}
|
||||
|
||||
|
||||
# mc2: Analyser Detector Rotate -- Sample Scattering Angle
|
||||
# absEncHome 20728908\ at -50
|
||||
Motor s2 $motor_driver_type [params \
|
||||
@ -440,9 +382,9 @@ s2 backlash_offset 0.5
|
||||
s2 blockage_thresh 1
|
||||
s2 creep_offset 0.015
|
||||
s2 creep_precision 0.005
|
||||
s2 speed 0.8
|
||||
s2 accel 0.2
|
||||
s2 decel 0.2
|
||||
s2 speed $s2_speed
|
||||
s2 accel $s2_accel
|
||||
s2 decel $s2_decel
|
||||
|
||||
# mc2: Analyser Horizontal Focus
|
||||
Motor ahfocus $motor_driver_type [params \
|
||||
@ -520,9 +462,10 @@ mvfocus long_name mvfocus
|
||||
mvfocus softlowerlim 0
|
||||
mvfocus softupperlim 300
|
||||
mvfocus home 0.0
|
||||
mvfocus Blockage_Thresh 2
|
||||
mvfocus Blockage_Thresh 4
|
||||
mvfocus Blockage_Check_Interval 2
|
||||
mvfocus creep_offset 0.2
|
||||
mvfocus backlash_offset -4
|
||||
# mc3: Monochromator Horizontal Focus
|
||||
Motor mhfocus $motor_driver_type [params \
|
||||
asyncqueue mc3\
|
||||
@ -531,25 +474,26 @@ Motor mhfocus $motor_driver_type [params \
|
||||
axis B\
|
||||
units degrees\
|
||||
precision 0.2\
|
||||
hardlowerlim -80\
|
||||
hardupperlim 240\
|
||||
hardlowerlim -10\
|
||||
hardupperlim 280\
|
||||
maxSpeed 3.6\
|
||||
maxAccel 1.728\
|
||||
maxDecel 1.728\
|
||||
stepsPerX [expr -25000.0 * 50.0 / 360.0]\
|
||||
stepsPerX [expr 25000.0 * 50.0 / 360.0]\
|
||||
absEnc 1\
|
||||
bias_bits 12\
|
||||
bias_bias 1540\
|
||||
absEncHome 2788\
|
||||
cntsPerX [expr -4096.0 / 360.0]]
|
||||
bias_bias 1300\
|
||||
absEncHome 243\
|
||||
cntsPerX [expr 4096.0 / 360.0]]
|
||||
mhfocus part crystal
|
||||
mhfocus long_name mhfocus
|
||||
mhfocus softlowerlim -75
|
||||
mhfocus softupperlim 235
|
||||
mhfocus softlowerlim -10
|
||||
mhfocus softupperlim 280
|
||||
mhfocus home 0
|
||||
mhfocus Blockage_Thresh 2
|
||||
mhfocus Blockage_Thresh 4
|
||||
mhfocus Blockage_Check_Interval 2
|
||||
mhfocus creep_offset 0.2
|
||||
mhfocus backlash_offset -4
|
||||
|
||||
# mc3: Monochromator Rotate
|
||||
Motor m1 $motor_driver_type [params \
|
||||
|
@ -0,0 +1,92 @@
|
||||
# mc2: Sample Tilt 1
|
||||
Motor sgu $tilt_motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis A\
|
||||
units degrees\
|
||||
hardlowerlim -13\
|
||||
hardupperlim 16.5\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7745478\
|
||||
cntsPerX 8192]
|
||||
sgu part sample
|
||||
sgu long_name sgu
|
||||
sgu softlowerlim -13
|
||||
sgu softupperlim 16.5
|
||||
sgu home 0
|
||||
sgu backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Tilt 2
|
||||
Motor sgl $tilt_motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis B\
|
||||
units degrees\
|
||||
hardlowerlim -16.5\
|
||||
hardupperlim 17.5\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7499135\
|
||||
cntsPerX 8192]
|
||||
sgl part sample
|
||||
sgl long_name sgl
|
||||
sgl softlowerlim -16.5
|
||||
sgl softupperlim 17.5
|
||||
sgl home 0
|
||||
sgl backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Up Tanslation
|
||||
Motor stu $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis C\
|
||||
units mm\
|
||||
hardlowerlim -15\
|
||||
hardupperlim 15\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX -25000\
|
||||
absEnc 1\
|
||||
absEncHome 7392933\
|
||||
cntsPerX -8192]
|
||||
stu part sample
|
||||
stu long_name stu
|
||||
stu softlowerlim -15
|
||||
stu softupperlim 15
|
||||
stu home 0.0
|
||||
stu backlash_offset -0.2
|
||||
|
||||
# mc2: Sample Lower Tanslation
|
||||
Motor stl $motor_driver_type [params \
|
||||
asyncqueue mc2\
|
||||
host mc2-taipan\
|
||||
port pmc2-taipan\
|
||||
axis D\
|
||||
units mm\
|
||||
hardlowerlim -15\
|
||||
hardupperlim 15\
|
||||
maxSpeed 2\
|
||||
maxAccel 1\
|
||||
maxDecel 1\
|
||||
stepsPerX 25000\
|
||||
absEnc 1\
|
||||
absEncHome 7582773\
|
||||
cntsPerX 8192]
|
||||
stl part sample
|
||||
stl long_name stl
|
||||
stl softlowerlim -15
|
||||
stl softupperlim 15
|
||||
stl home 0.0
|
||||
stl backlash_offset -0.2
|
||||
|
@ -40,18 +40,22 @@ fileeval $cfPath(environment)/agilent_33220A_sct.tcl
|
||||
fileeval $cfPath(environment)/sct_protek_common.tcl
|
||||
fileeval $cfPath(environment)/protekmm_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_eurotherm_3200.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_julabo_lh45.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl
|
||||
fileeval $cfPath(environment)/temperature/ls336_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_340.tcl
|
||||
fileeval $cfPath(environment)/temperature/ls340_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_370.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_m370.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_oxford_itc.tcl
|
||||
fileeval $cfPath(environment)/temperature/oxford_mercury_sct.tcl
|
||||
fileeval $cfPath(environment)/temperature/west400.tcl
|
||||
fileeval $cfPath(environment)/temperature/sct_west_6100.tcl
|
||||
fileeval $cfPath(environment)/he3/sct_he3.tcl
|
||||
fileeval $cfPath(environment)/magneticField/oxford_labview.tcl
|
||||
fileeval $cfPath(environment)/magneticField/oxford12tlv_sct.tcl
|
||||
fileeval $cfPath(environment)/he3/sct_he3.tcl
|
||||
fileeval $cfPath(beamline)/he3_polanal_sct.tcl
|
||||
fileeval config/load_setup.tcl
|
||||
fileeval log.tcl
|
||||
publish logbook spy
|
||||
@ -60,18 +64,36 @@ source gumxml.tcl
|
||||
::utility::mkVar ::anticollider::protect_detector text manager protect_detector false detector true false
|
||||
::anticollider::protect_detector "true"
|
||||
|
||||
if { [ dict exists $::config_dict sample_stage implementation ] } {
|
||||
set sample_stage [ dict get $::config_dict sample_stage implementation ]
|
||||
} else {
|
||||
set sample_stage "normal_sample_stage"
|
||||
}
|
||||
switch $sample_stage {
|
||||
"eulerian_cradle" {
|
||||
# s1-> eom, sgu -> ephi, sgl -> echi
|
||||
set OMEGA s1
|
||||
set PHI ephi
|
||||
set CHI echi
|
||||
}
|
||||
"normal_sample_stage" - default {
|
||||
set OMEGA s1
|
||||
set PHI sgu
|
||||
set CHI sgl
|
||||
}
|
||||
}
|
||||
# init for the tasUB
|
||||
#make mcv mch acv ach into mvfocus mhfocus avfocus ahfocus when it works
|
||||
puts "doing tasub"
|
||||
MakeTasUB tasub m1 m2 mvfocus mhfocus s1 s2 sgu sgl a1 a2 avfocus ahfocus
|
||||
MakeTasUB tasub m1 m2 mvfocus mhfocus $OMEGA s2 $PHI $CHI a1 a2 avfocus ahfocus
|
||||
tasub mono dd 3.35416
|
||||
tasub ana dd 3.35416
|
||||
# NOTE Autofocussing parameters persist in status.tcl
|
||||
# You must set them in extraconfig.tcl to override this behaviour
|
||||
# NOTE Autofocussing parameters (vbn, hbn) persist in status.tcl
|
||||
# To override this behaviour you can set them in extraconfig.tcl
|
||||
tasub mono vb1 102.2
|
||||
tasub mono vb2 1.78
|
||||
tasub mono hb1 184.42
|
||||
tasub mono hb2 -60.1
|
||||
tasub mono hb1 18.28
|
||||
tasub mono hb2 60.1
|
||||
tasub mono hb3 0.951
|
||||
tasub ana vb1 115
|
||||
tasub ana vb2 2.13
|
||||
@ -90,6 +112,16 @@ server_init
|
||||
###########################################
|
||||
# WARNING: Do not add any code below server_init, if you do SICS may fail to initialise properly.
|
||||
|
||||
puts "Making hkl command"
|
||||
MakeMono mono PG m1 m2
|
||||
mono dd 3.35416
|
||||
MakeWaveLength lambda mono
|
||||
MakeEnergy energy mono
|
||||
#MakeSingleX singlex
|
||||
#MakeHKL s2 $OMEGA $PHI $CHI
|
||||
#MakeHKLMot hkl
|
||||
#MakeUBcalc ubcalc hkl
|
||||
|
||||
# Provide tasmot notifications to GumTree when real motors move
|
||||
proc m2tasupdate {} {
|
||||
tasub update
|
||||
@ -125,7 +157,7 @@ proc a2tasupdate {} {
|
||||
publish a2tasupdate user
|
||||
|
||||
scriptcallback connect m2 MOTEND m2tasupdate
|
||||
scriptcallback connect s1 MOTEND s1s2tasupdate
|
||||
scriptcallback connect $OMEGA MOTEND s1s2tasupdate
|
||||
scriptcallback connect s2 MOTEND s1s2tasupdate
|
||||
scriptcallback connect a2 MOTEND a2tasupdate
|
||||
|
||||
|
Reference in New Issue
Block a user