initial commit
This commit is contained in:
171
tcl/drivers/svumot.tcl
Normal file
171
tcl/drivers/svumot.tcl
Normal file
@@ -0,0 +1,171 @@
|
||||
# 7-8 solenoid valves + one motorized valve (DC-motor with endswitch)
|
||||
namespace eval svumot {} {
|
||||
}
|
||||
|
||||
proc stdConfig::svumot {valvelist} {
|
||||
controller std "\n" 5
|
||||
|
||||
prop mot 0
|
||||
prop startcmd "tv1"
|
||||
foreach {name nr} $valvelist {
|
||||
if {$nr == 8} {
|
||||
# disable button 8 for motor
|
||||
prop startcmd "tv0"
|
||||
} elseif {$nr eq "mot"} {
|
||||
prop mot $name
|
||||
} elseif {$nr < 1 || $nr > 9} {
|
||||
error "bad valve number / mot: /$nr/"
|
||||
}
|
||||
}
|
||||
|
||||
obj svumot rd -none
|
||||
prop read svumot::read
|
||||
prop @closetime 0
|
||||
kids "valves" {
|
||||
foreach {name nr} $valvelist {
|
||||
node $name out
|
||||
if {$nr eq "mot"} {
|
||||
prop label $name
|
||||
prop enum close,open
|
||||
prop write svumot::swrite
|
||||
|
||||
} else {
|
||||
prop nr $nr
|
||||
prop enum 1
|
||||
prop write svumot::write
|
||||
prop nonewline 1
|
||||
}
|
||||
}
|
||||
node motpos upd
|
||||
kids "set" {
|
||||
node set out
|
||||
default 0
|
||||
prop write svumot::wset
|
||||
}
|
||||
|
||||
node n2top upd
|
||||
# prop visible false
|
||||
prop label N2top
|
||||
prop newline 1
|
||||
|
||||
|
||||
node n2bot
|
||||
prop label N2bot
|
||||
}
|
||||
}
|
||||
|
||||
proc svumot::write {} {
|
||||
if {[sct target]} {
|
||||
sct send o[sct nr]
|
||||
} else {
|
||||
sct send c[sct nr]
|
||||
}
|
||||
[sct controller] queue [sct parent] read read
|
||||
return stdSct::completeUpdate
|
||||
}
|
||||
|
||||
proc svumot::swrite {} {
|
||||
if {[sct target] == 1 || [sct target] == 3} {
|
||||
sct send o9
|
||||
sct @closetime -1
|
||||
} else {
|
||||
sct send c9
|
||||
sct @closetime -1
|
||||
}
|
||||
[sct controller] queue [sct parent] read read
|
||||
return stdSct::completeUpdate
|
||||
}
|
||||
|
||||
proc svumot::read {} {
|
||||
sct send enmp
|
||||
return svumot::update
|
||||
}
|
||||
|
||||
proc svumot::update {} {
|
||||
set pos -1
|
||||
set state -1
|
||||
set error ""
|
||||
set valves none
|
||||
scan [sct result] "e%d n%f m%f p%f %d %s" state n2a n2b pos valves error
|
||||
if {$valves eq "none"} {
|
||||
return idle
|
||||
}
|
||||
updateval [sct]/motpos $pos
|
||||
switch $state {
|
||||
0 {set enum closed,open}
|
||||
1 {set enum close,opened}
|
||||
2 {set enum close,open,closing}
|
||||
3 {set enum close,open,opening=3}
|
||||
7 {set enum unplugged=7}
|
||||
default {set enum close,open,$error=$state}
|
||||
}
|
||||
hsetprop [sct]/[sct mot] enum $enum
|
||||
foreach nr {1 2 3 4 5 6 7 8} {
|
||||
set vs($nr) 0
|
||||
}
|
||||
foreach nr [split $valves {}] {
|
||||
set vs($nr) 1
|
||||
}
|
||||
foreach node [hlist [sct]] {
|
||||
set nr [silent 0 hgetpropval [sct]/$node nr]
|
||||
if {$nr != 0} {
|
||||
updateval [sct]/$node $vs($nr)
|
||||
}
|
||||
}
|
||||
updateval [sct]/[sct mot] $state
|
||||
if {"$error" ne "" && "$error" ne "stopped"} {
|
||||
hsetprop [sct]/motpos geterror $error
|
||||
} else {
|
||||
hdelprop [sct]/motpos geterror
|
||||
}
|
||||
updateval [sct]/n2top $n2a
|
||||
updateval [sct]/n2bot $n2b
|
||||
return idle
|
||||
}
|
||||
|
||||
proc svumot::holdopen {} {
|
||||
if {[sct @closetime] < 0} {
|
||||
return unpoll
|
||||
}
|
||||
if {[doubletime] >= [sct @closetime]} {
|
||||
sct send s
|
||||
return svumot::unpoll
|
||||
}
|
||||
return idle
|
||||
}
|
||||
|
||||
proc svumot::unpoll {} {
|
||||
sct @closetime 0
|
||||
[sct controller] queue [sct parent] read read
|
||||
return unpoll
|
||||
}
|
||||
|
||||
proc svumot::wset {} {
|
||||
if {[sct @closetime] <= 0} {
|
||||
set t2o 60
|
||||
scan [sct idn] "t%f v" t2o
|
||||
set pos [hvali [sct]]
|
||||
set posr [hvali [sct parent]]
|
||||
if {$pos > $posr + 0.002} {
|
||||
set pos [expr $posr + 0.002]
|
||||
} elseif {$pos < $posr - 0.002} {
|
||||
set pos [expr $posr - 0.002]
|
||||
}
|
||||
set dif [expr [sct target] - $pos]
|
||||
set delta [expr abs($dif) * $t2o]
|
||||
if {abs($dif) > 0.0001} {
|
||||
sct update [sct target]
|
||||
sct @closetime [expr [doubletime] + $delta]
|
||||
if {$dif > 0} {
|
||||
sct send o9
|
||||
} else {
|
||||
sct send c9
|
||||
}
|
||||
[sct controller] poll [sct parent] 0.001 write svumot::holdopen
|
||||
return stdSct::complete
|
||||
} else {
|
||||
sct update $pos
|
||||
}
|
||||
}
|
||||
return idle
|
||||
}
|
||||
Reference in New Issue
Block a user