99 lines
1.8 KiB
Tcl
99 lines
1.8 KiB
Tcl
# solenoid valve unit
|
|
|
|
namespace eval svu {} {
|
|
}
|
|
|
|
proc stdConfig::svu {valves} {
|
|
controller std "\r" 5
|
|
prop startcmd "*IDN?"
|
|
|
|
pollperiod 1 1
|
|
|
|
obj SolenoidValveUnit -text rd
|
|
prop read svu::read
|
|
prop @valves $valves
|
|
prop visible false
|
|
|
|
kids "valves" {
|
|
foreach {v i} $valves {
|
|
node $v out
|
|
prop number $i
|
|
prop write svu::write
|
|
prop enum off=0,on=1
|
|
prop label $v
|
|
prop lineend 0
|
|
|
|
node ${v}_time -int wr
|
|
prop writecmd "t$i %d"
|
|
prop readcmd t$i
|
|
prop readfmt %d
|
|
prop label "timer \[ms\], 0=off"
|
|
prop lineend 0
|
|
|
|
node ${v}_pwm par 0
|
|
prop enum 1
|
|
}
|
|
node idn -text wr
|
|
prop width 30
|
|
prop write svu::store
|
|
prop readcmd i
|
|
prop label "store timer settings"
|
|
# prop readfmt %s
|
|
}
|
|
}
|
|
|
|
proc svu::read {} {
|
|
sct send "s"
|
|
return svu::update
|
|
}
|
|
|
|
proc svu::update {{kid 0}} {
|
|
set res [sct result]
|
|
set ocmd ""
|
|
foreach {v i} [sct @valves] {
|
|
set val [string equal [string index $res [expr $i - 1]] $i]
|
|
hupdate [sct objectPath]/$v $val
|
|
hdelprop [sct objectPath]/$v geterror
|
|
if {[hvali [sct objectPath]/${v}_pwm]} {
|
|
set t [hvali [sct objectPath]/${v}_time]
|
|
if {$t > 0} {
|
|
append ocmd o$i
|
|
} else {
|
|
append ocmd c$i
|
|
}
|
|
}
|
|
}
|
|
if {$kid} {
|
|
hupdate [sct objectPath] $res
|
|
hdelprop [sct objectPath] geterror
|
|
} else {
|
|
sct update $res
|
|
}
|
|
if {$ocmd eq ""} {
|
|
return idle
|
|
} else {
|
|
sct send $ocmd
|
|
return stdSct::complete
|
|
}
|
|
}
|
|
|
|
proc svu::write {} {
|
|
if {[sct target]} {
|
|
sct send "o[sct number]"
|
|
} else {
|
|
sct send "c[sct number]"
|
|
}
|
|
return "svu::update 1"
|
|
}
|
|
|
|
proc svu::store {} {
|
|
sct send "i[sct target]"
|
|
return svu::updatestore
|
|
}
|
|
|
|
proc svu::updatestore {} {
|
|
sct update [sct result]
|
|
sct send "store"
|
|
return stdSct::complete
|
|
}
|