Generate a wrapper for the old protek driver from a protekmm.sct template.
This commit is contained in:
9
site_ansto/instrument/config/environment/protekmm.sct
Normal file
9
site_ansto/instrument/config/environment/protekmm.sct
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent
|
||||||
|
driver protekmm = {
|
||||||
|
protocol = protek608
|
||||||
|
class = environment
|
||||||
|
simulation_group = environment_simulation
|
||||||
|
code mkDriver = {%%
|
||||||
|
MakeProtek $name $sct_controller
|
||||||
|
%%}
|
||||||
|
}
|
@ -60,10 +60,10 @@ proc rdStateRep {} {
|
|||||||
|
|
||||||
array set stateArr [split $stateRep "|:"]
|
array set stateArr [split $stateRep "|:"]
|
||||||
if {$stateArr(AUTOOFF)} {
|
if {$stateArr(AUTOOFF)} {
|
||||||
broadcast "PROTEK608:[sct IP]:[sct PORT] WARNING AUTO OFF IS ENABLED"
|
broadcast "PROTEK608:[sct] WARNING AUTO OFF IS ENABLED"
|
||||||
}
|
}
|
||||||
if {$stateArr(LOBAT)} {
|
if {$stateArr(LOBAT)} {
|
||||||
broadcast "PROTEK608: LOW BATTERY WARNING"
|
broadcast "PROTEK608:[sct] LOW BATTERY WARNING"
|
||||||
}
|
}
|
||||||
if {$stateRep != [sct oldval]} {
|
if {$stateRep != [sct oldval]} {
|
||||||
sct update $stateRep
|
sct update $stateRep
|
||||||
@ -122,7 +122,7 @@ close $fd
|
|||||||
# @param cbFunc, this function will be called after the voltage reading has been updated
|
# @param cbFunc, this function will be called after the voltage reading has been updated
|
||||||
# NOTE: If the interval is negative then the multimeter will be polled on every cycle of
|
# NOTE: If the interval is negative then the multimeter will be polled on every cycle of
|
||||||
# the SICS task loop.
|
# the SICS task loop.
|
||||||
proc MakeProtek {name IP PORT {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "return idle"}} {
|
proc MakeProtek {name sctName {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "return idle"}} {
|
||||||
set catch_status [ catch {
|
set catch_status [ catch {
|
||||||
set sctName "sct_$name"
|
set sctName "sct_$name"
|
||||||
set sobjName "$name"
|
set sobjName "$name"
|
||||||
@ -149,9 +149,6 @@ proc MakeProtek {name IP PORT {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "r
|
|||||||
::scobj::hinitprops $sobjName
|
::scobj::hinitprops $sobjName
|
||||||
sicslist setatt $sobjName long_name $name
|
sicslist setatt $sobjName long_name $name
|
||||||
if {[SplitReply [environment_simulation]] == false} {
|
if {[SplitReply [environment_simulation]] == false} {
|
||||||
makesctcontroller $sctName protek608 $IP:$PORT
|
|
||||||
hsetprop /sics/$soState/state IP $IP
|
|
||||||
hsetprop /sics/$soState/state PORT $PORT
|
|
||||||
$sctName poll /sics/$soState/state $interval
|
$sctName poll /sics/$soState/state $interval
|
||||||
$sctName poll /sics/$sobjName $interval
|
$sctName poll /sics/$sobjName $interval
|
||||||
}
|
}
|
||||||
@ -162,102 +159,11 @@ proc MakeProtek {name IP PORT {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "r
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
proc add_protekmm {name IP PORT CTYPE CID {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "return idle"}} {
|
# proc add_protekmm {name IP PORT CTYPE CID {scale 1.0} {offset 0.0} {interval 0.5} {cbFunc "return idle"}} {
|
||||||
set catch_status [ catch {
|
# set catch_status [ catch {
|
||||||
MakeProtek $name $IP $PORT $scale $offset $interval $cbFunc
|
# MakeProtek $name $IP $PORT $scale $offset $interval $cbFunc
|
||||||
hsetprop /sics/$name permlink data_set ${CTYPE}${CID}S1
|
# hsetprop /sics/$name permlink data_set ${CTYPE}${CID}S1
|
||||||
} catch_message ] {
|
# } catch_message ] {
|
||||||
handle_exception ${catch_status} ${catch_message}
|
# handle_exception ${catch_status} ${catch_message}
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
|
|
||||||
namespace eval ::scobj::add_protekmm {
|
|
||||||
set debug_threshold 5
|
|
||||||
}
|
|
||||||
proc ::scobj::add_protekmm::sics_log {debug_level debug_string} {
|
|
||||||
set catch_status [ catch {
|
|
||||||
set debug_threshold ${::scobj::add_protekmm::debug_threshold}
|
|
||||||
if {${debug_level} >= ${debug_threshold}} {
|
|
||||||
sicslog "::scobj::add_protekmm::${debug_string}"
|
|
||||||
}
|
|
||||||
} catch_message ]
|
|
||||||
}
|
|
||||||
|
|
||||||
clientput "file evaluation of sct_protekmm.tcl"
|
|
||||||
::scobj::add_protekmm::sics_log 9 "file evaluation of sct_protekmm.tcl"
|
|
||||||
|
|
||||||
proc ::scobj::add_protekmm::read_config {} {
|
|
||||||
set catch_status [ catch {
|
|
||||||
set ns "::scobj::add_protekmm"
|
|
||||||
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 $v "datype"] {
|
|
||||||
set datype [dict get $v "datype"]
|
|
||||||
}
|
|
||||||
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"] "protekmm"] } {
|
|
||||||
set driver [dict get $v driver]
|
|
||||||
${ns}::sics_log 9 "Found ${name}: $driver"
|
|
||||||
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
|
|
||||||
${ns}::sics_log 9 "${name}:${driver}: MakeAsyncProtocol ${asyncprotocol}"
|
|
||||||
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]
|
|
||||||
${ns}::sics_log 9 "${name}:${driver}: MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${IP} ${PORT}"
|
|
||||||
MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${IP} ${PORT}
|
|
||||||
if { [dict exists $v "timeout"] } {
|
|
||||||
${asyncqueue} timeout "[dict get $v "timeout"]"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set arg_list [list]
|
|
||||||
foreach arg {id} {
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
${ns}:sics_log 9 "add_protekmm ${name} aqadapter ${asyncqueue} {*}$arg_list"
|
|
||||||
add_protekmm ${name} "aqadapter" ${asyncqueue} {*}$arg_list
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch_message ]
|
|
||||||
handle_exception ${catch_status} ${catch_message}
|
|
||||||
}
|
|
||||||
|
|
||||||
if { [info exists ::config_dict] } {
|
|
||||||
::scobj::add_protekmm::read_config
|
|
||||||
} else {
|
|
||||||
::scobj::add_protekmm::sics_log 5 "No config dict"
|
|
||||||
}
|
|
||||||
|
145
site_ansto/instrument/config/environment/sct_protekmm.tcl
Normal file
145
site_ansto/instrument/config/environment/sct_protekmm.tcl
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
# Generated driver for protekmm
|
||||||
|
# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent
|
||||||
|
#
|
||||||
|
|
||||||
|
namespace eval ::scobj::protekmm {
|
||||||
|
set debug_threshold 5
|
||||||
|
}
|
||||||
|
|
||||||
|
proc ::scobj::protekmm::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 fd [open "../log/protekmm_[basename ${tc_root}].log" "a"]
|
||||||
|
set line "[clock format [clock seconds] -format "%T"] ${debug_string}"
|
||||||
|
puts ${fd} "${line}"
|
||||||
|
close ${fd}
|
||||||
|
}
|
||||||
|
} catch_message ]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc ::scobj::protekmm::sics_log {debug_level debug_string} {
|
||||||
|
set catch_status [ catch {
|
||||||
|
set debug_threshold ${::scobj::protekmm::debug_threshold}
|
||||||
|
if {${debug_level} >= ${debug_threshold}} {
|
||||||
|
sicslog "::scobj::protekmm::${debug_string}"
|
||||||
|
}
|
||||||
|
} catch_message ]
|
||||||
|
}
|
||||||
|
|
||||||
|
proc ::scobj::protekmm::mkDriver { sct_controller name } {
|
||||||
|
::scobj::protekmm::sics_log 9 "::scobj::protekmm::mkDriver for ${name}"
|
||||||
|
set ns "[namespace current]"
|
||||||
|
set catch_status [ catch {
|
||||||
|
|
||||||
|
MakeSICSObj ${name} SCT_OBJECT
|
||||||
|
|
||||||
|
sicslist setatt ${name} klass environment
|
||||||
|
sicslist setatt ${name} long_name ${name}
|
||||||
|
|
||||||
|
set scobj_hpath /sics/${name}
|
||||||
|
hsetprop ${scobj_hpath} klass environment
|
||||||
|
hsetprop ${scobj_hpath} debug_threshold 5
|
||||||
|
# mkDriver hook code starts
|
||||||
|
MakeProtek $name $sct_controller
|
||||||
|
# mkDriver hook code ends
|
||||||
|
} catch_message ]
|
||||||
|
handle_exception ${catch_status} ${catch_message}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace eval ::scobj::protekmm {
|
||||||
|
namespace export debug_threshold
|
||||||
|
namespace export debug_log
|
||||||
|
namespace export sics_log
|
||||||
|
namespace export mkDriver
|
||||||
|
}
|
||||||
|
|
||||||
|
proc add_protekmm {name IP port} {
|
||||||
|
set catch_status [ catch {
|
||||||
|
::scobj::protekmm::sics_log 9 "add_protekmm ${name} ${IP} ${port}"
|
||||||
|
if {[string equal -nocase [SplitReply [environment_simulation]] "false"]} {
|
||||||
|
if {[string equal -nocase "aqadapter" "${IP}"]} {
|
||||||
|
::scobj::protekmm::sics_log 9 "makesctcontroller sct_${name} aqadapter ${port}"
|
||||||
|
makesctcontroller sct_${name} aqadapter ${port}
|
||||||
|
} else {
|
||||||
|
::scobj::protekmm::sics_log 9 "makesctcontroller sct_${name} protek608 ${IP}:${port}"
|
||||||
|
makesctcontroller sct_${name} protek608 ${IP}:${port}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
::scobj::protekmm::sics_log 9 "[environment_simulation] => No sctcontroller for protekmm"
|
||||||
|
}
|
||||||
|
::scobj::protekmm::sics_log 1 "::scobj::protekmm::mkDriver sct_${name} ${name}"
|
||||||
|
::scobj::protekmm::mkDriver sct_${name} ${name}
|
||||||
|
} catch_message ]
|
||||||
|
handle_exception ${catch_status} ${catch_message}
|
||||||
|
}
|
||||||
|
|
||||||
|
clientput "file evaluation of sct_protekmm.tcl"
|
||||||
|
::scobj::protekmm::sics_log 9 "file evaluation of sct_protekmm.tcl"
|
||||||
|
|
||||||
|
proc ::scobj::protekmm::read_config {} {
|
||||||
|
set catch_status [ catch {
|
||||||
|
set ns "::scobj::protekmm"
|
||||||
|
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"] "protekmm"] } {
|
||||||
|
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"]
|
||||||
|
if { [string equal -nocase ${asyncqueue} "sct"] } {
|
||||||
|
set IP [dict get $v ip]
|
||||||
|
set PORT [dict get $v port]
|
||||||
|
}
|
||||||
|
} 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"]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if { [string equal -nocase ${asyncqueue} "sct"] } {
|
||||||
|
add_protekmm ${name} ${IP} ${PORT}
|
||||||
|
} else {
|
||||||
|
add_protekmm ${name} "aqadapter" ${asyncqueue}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch_message ]
|
||||||
|
handle_exception ${catch_status} ${catch_message}
|
||||||
|
}
|
||||||
|
|
||||||
|
if { [info exists ::config_dict] } {
|
||||||
|
::scobj::protekmm::read_config
|
||||||
|
} else {
|
||||||
|
::scobj::protekmm::sics_log 5 "No config dict"
|
||||||
|
}
|
@ -218,6 +218,7 @@ desc = "This is the default sample stage configuration with xy translation and p
|
|||||||
imptype = motion_axis
|
imptype = motion_axis
|
||||||
|
|
||||||
[protek_01]
|
[protek_01]
|
||||||
|
asyncqueue = sct
|
||||||
desc = "Protek Multimeter"
|
desc = "Protek Multimeter"
|
||||||
driver = "protekmm"
|
driver = "protekmm"
|
||||||
id = 1
|
id = 1
|
||||||
@ -226,6 +227,7 @@ ip = 10.157.205.36
|
|||||||
port = 4001
|
port = 4001
|
||||||
|
|
||||||
[protek_02]
|
[protek_02]
|
||||||
|
asyncqueue = sct
|
||||||
desc = "Protek Multimeter"
|
desc = "Protek Multimeter"
|
||||||
driver = "protekmm"
|
driver = "protekmm"
|
||||||
id = 2
|
id = 2
|
||||||
|
@ -27,6 +27,7 @@ fileeval $cfPath(plc)/plc.tcl
|
|||||||
fileeval $cfPath(counter)/counter.tcl
|
fileeval $cfPath(counter)/counter.tcl
|
||||||
fileeval $cfPath(environment)/sct_keithley_2700.tcl
|
fileeval $cfPath(environment)/sct_keithley_2700.tcl
|
||||||
fileeval $cfPath(environment)/sct_protek_common.tcl
|
fileeval $cfPath(environment)/sct_protek_common.tcl
|
||||||
|
fileeval $cfPath(environment)/sct_protekmm.tcl
|
||||||
#TODO Provide method for choosing environment controller
|
#TODO Provide method for choosing environment controller
|
||||||
fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl
|
fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl
|
||||||
fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl
|
fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl
|
||||||
|
Reference in New Issue
Block a user