Files
sea/tcl/drivers/tc400.tcl

105 lines
1.9 KiB
Tcl

namespace eval tc400 {} {
}
proc stdConfig::tc400 {adr} {
controller std "\r" 5
prop startcmd "0010031202=?101"
prop read tc400::read
prop write tc400::write
pollperiod 5 5
obj "TC400" wr
prop par 707
prop @adr $adr
prop type fix2
kids "turbo $adr" {
node on wr
prop par 10
prop type bool
prop enum 1
node motor wr
prop par 23
prop type bool
prop enum 1
node speed rd
prop par 309
prop type fix0
node nominalspeed rd
prop par 308
prop type fix0
node current rd
prop par 310
prop type fix2
node errorcode -text rd
prop par 303
prop type text
node ovtempelec rd
prop par 304
prop type bool
node ovtemppump rd
prop par 305
prop type bool
node temppmpbot rd
prop par 330
prop type fix0
node tempbearng rd
prop par 342
prop type fix0
node tempmotor rd
prop par 346
prop type fix0
}
return "TC400 turbo pump"
}
proc tc400::addcksum {str} {
set cksum 0
foreach num [scan $str [string repeat %c [string length $str]]] {
incr cksum $num
}
return "$str[format %3.3d [expr $cksum % 256]]"
}
proc tc400::read {} {
sct send [addcksum [format "%3.3d00%3.3d02=?" [sct @adr] [sct par]]]
return tc400::update
}
proc tc400::update {} {
set end 15
set value [string range [sct result] 10 $end]
if {![scan $value %d value]} {
error "$value"
}
switch [sct type] {
bool { sct update [expr $value != 0] }
fix2 { sct update [expr $value * 0.01] }
default { sct update $value }
}
return idle
}
proc tc400::write {} {
switch [sct type] {
bool {set val [format "06%6.6d" [expr ([sct target] != 0) * 111111]]}
fix2 {set val [format "06%6.6d" [expr int(0.5 + [sct target] * 100)]]}
default {set val [format "06%6.6d" [expr int(0.5 + [sct target])]]}
}
sct send [addcksum [format "%3.3d10%3.3d$val" [sct @adr] [sct par] [sct target]]]
return tc400::update
}