119 lines
2.6 KiB
Tcl
119 lines
2.6 KiB
Tcl
namespace eval motorvalve {
|
|
}
|
|
|
|
proc stdConfig::motorvalve {} {
|
|
variable name
|
|
|
|
controller syncedprot
|
|
prop write stdSct::complete
|
|
pollperiod 1 1
|
|
|
|
obj MotorValve -int wr
|
|
prop enum closed,closing,opening,opened,undefined
|
|
prop check motorvalve::check_valve
|
|
prop write motorvalve::set_valve
|
|
prop read motorvalve::get_valve
|
|
prop buttontitle "operate valve"
|
|
prop buttons open/2/2,3:close/1/0,1
|
|
prop mot ${name}_mot
|
|
prop try 0
|
|
|
|
kids "$name motor valve" {
|
|
}
|
|
}
|
|
|
|
proc motorvalve::set_valve_status {new} {
|
|
set old [silent "" sct valvestatus]
|
|
set path [sct objectPath]/status
|
|
set status [hvali $path]
|
|
if {$new ne "" || $old eq $status} {
|
|
hupdate $path $new
|
|
}
|
|
sct valvestatus $new
|
|
}
|
|
|
|
proc motorvalve::check_valve {} {
|
|
set_valve_status ""
|
|
sct try 5
|
|
sct slowspeed 50
|
|
}
|
|
|
|
proc motorvalve::set_valve {} {
|
|
set val [hvali [sct]]
|
|
if {[sct target] < 2} {
|
|
if {[hvali [sct]/[sct mot]/encoder] > 20} {
|
|
[sct mot] maxspeed 200
|
|
sctsync {
|
|
run [sct mot] 15
|
|
}
|
|
}
|
|
set val 1
|
|
sct update 1
|
|
return motorvalve::slow_close
|
|
} elseif {[sct target] < 4} {
|
|
[sct mot] maxspeed 200
|
|
hset [sct]/[sct mot] [hval [sct]/[sct mot]/upperlimit]
|
|
set val 2
|
|
}
|
|
sct update $val
|
|
return idle
|
|
}
|
|
|
|
proc motorvalve::slow_close {} {
|
|
[sct mot] maxspeed [sct slowspeed]
|
|
sct slowspeed [expr max(10,[sct slowspeed] - 10)]
|
|
run [sct mot] [hval [sct]/[sct mot]/lowerlimit]
|
|
return idle
|
|
}
|
|
|
|
proc motorvalve::get_valve {} {
|
|
set p [sct]/[sct mot]
|
|
set stat [hgetpropval $p status]
|
|
set pos [hvali $p/encoder]
|
|
if {$pos < [hval $p/lowerlimit] - 15 ||
|
|
$pos > [hval $p/upperlimit] + 15} {
|
|
hsetprop $p/encoder adjust_zero 1
|
|
return idle
|
|
}
|
|
set dir [string map {0 close 1 close 2 open 3 open 4 undefined} [silent 4 sct target]]
|
|
if {[sct try] == 0} {
|
|
set dir undefined
|
|
}
|
|
if {$stat eq "run"} {
|
|
if {[hgetpropval $p target] > $pos} {
|
|
sct update 2
|
|
} else {
|
|
sct update 1
|
|
}
|
|
} elseif {$pos < 2 && $dir ne "open"} {
|
|
sct update 0 ;# closed
|
|
sct try 0
|
|
set_valve_status ""
|
|
} elseif {$pos > 30 && $dir ne "close"} {
|
|
sct update 3 ;# opened
|
|
sct try 0
|
|
set_valve_status ""
|
|
} else {
|
|
if {[sct try] > 1 && $dir ne "undefined"} {
|
|
set try [sct try]
|
|
incr try -1
|
|
if {$try <= 3} {
|
|
clientput "[sct] try again to $dir ($try)"
|
|
}
|
|
hset [sct] [sct target]
|
|
sct try $try
|
|
} else {
|
|
sct try 0
|
|
if {$dir ne "undefined"} {
|
|
set txt "cannot $dir valve at He pump. Please do it manually"
|
|
clientput "ERROR: $txt"
|
|
set_valve_status $txt
|
|
sct target 4
|
|
}
|
|
sct update 4 ;# undefined
|
|
}
|
|
}
|
|
return idle
|
|
}
|
|
|