124 lines
2.6 KiB
Tcl
124 lines
2.6 KiB
Tcl
# ACM Capacitance Meter
|
|
namespace eval acm {} {
|
|
}
|
|
|
|
proc stdConfig::acm {} {
|
|
controller std "\n" 5
|
|
prop startcmd "*IDN?"
|
|
|
|
obj acm rd -float
|
|
prop read acm::read
|
|
|
|
kids "ACM" {
|
|
node stdev upd
|
|
|
|
node offset par 00.0
|
|
prop label "tune offset"
|
|
|
|
|
|
node tstat upd -text
|
|
prop label ""
|
|
default ""
|
|
prop nonewline 1
|
|
|
|
node offset_tune par 0
|
|
prop enum "off,set,auto"
|
|
|
|
}
|
|
}
|
|
|
|
proc acm::read {} {
|
|
sct send "readAVCVT"
|
|
return acm::update
|
|
}
|
|
|
|
proc acm::update {} {
|
|
set dat [split [sct result] "," ]
|
|
sct update [lindex $dat 2]
|
|
hupdate [sct]/stdev [lindex $dat 3]
|
|
# hupdate [sct objectPath]/tstat ""
|
|
hdelprop [sct]/stdev geterror
|
|
# hdelprop [sct objectPath]/tstat geterror
|
|
if {[hvali [sct objectPath]/offset_tune]} {
|
|
return acm::twrite
|
|
}
|
|
return idle
|
|
|
|
}
|
|
|
|
#works with poll but is replaced by : return "stdSct::after wait time next script"
|
|
#proc acm::wait {} {
|
|
# if {[sct firstround]} {
|
|
# sct firstround [expr [sct firstround] -1]
|
|
# return idle
|
|
# }
|
|
# [sct controller] queue [sct] write acm::aread
|
|
# return unpoll
|
|
#}
|
|
|
|
proc acm::aread {} {
|
|
sct send "readCVT"
|
|
return acm::aupdate
|
|
}
|
|
|
|
|
|
proc acm::aupdate {} {
|
|
set dat [lindex [split [sct result] "," ] 0]
|
|
return "acm::achange $dat"
|
|
}
|
|
|
|
proc acm::achange {cap} {
|
|
set cap $cap
|
|
set scap [hvali [sct objectPath]/offset]
|
|
# clientput offset $scap
|
|
if {[expr abs($cap -$scap)] > 0.2 } {
|
|
set scap [expr $cap]
|
|
hupdate [sct objectPath]/offset $scap
|
|
if {$scap > 17} {
|
|
set scap 17
|
|
if {$scap > 21} {
|
|
hupdate [sct objectPath]/tstat "capacitance out of range"
|
|
} else {
|
|
hupdate [sct objectPath]/tstat "upper limit reached"
|
|
}
|
|
hupdate [sct objectPath]/offset $scap
|
|
hupdate [sct objectPath]/offset_tune 0
|
|
return idle
|
|
}
|
|
return acm::twrite
|
|
}
|
|
hupdate [sct objectPath]/tstat "auto tune O.K."
|
|
hupdate [sct objectPath]/offset_tune 0
|
|
return idle
|
|
}
|
|
|
|
proc acm::twrite {} {
|
|
set cap [format "%04.1f" [hvali [sct objectPath]/offset] ]
|
|
sct send "setCIN 1,0,$cap,99.9,0,99.9,99.9"
|
|
return acm::tread
|
|
}
|
|
|
|
proc acm::tread {} {
|
|
set resp [string range [sct result] 6 end]
|
|
# clientput resp: $resp
|
|
set dat [split $resp "," ]
|
|
# clientput [lindex $dat 2]
|
|
hupdate [sct objectPath]/offset [lindex $dat 2]
|
|
if {[hvali [sct objectPath]/offset_tune] == 2} {
|
|
hupdate [sct objectPath]/tstat "...tuning"
|
|
# sct firstround 2
|
|
# [sct controller] poll [sct] 0.5 start acm::wait
|
|
# return idle
|
|
return "stdSct::after 1.0 acm::aread"
|
|
}
|
|
hupdate [sct objectPath]/tstat "O.K."
|
|
hupdate [sct objectPath]/offset_tune 0
|
|
return idle
|
|
}
|
|
|
|
proc acm::checktune {} {
|
|
clientput checktune
|
|
sct update [result sct]
|
|
return idle
|
|
}
|