Files
sea/tcl/archive/drivers/flowbus.tcl
l_samenv 4d9961fe5c add archive (files probably no longer used)
here we can find old files
2022-08-22 15:28:09 +02:00

85 lines
2.3 KiB
Tcl

# based on untested flowbusprot, not used M.Z. Feb 2017
namespace eval flowbus {} {
}
proc stdConfig::flowbus {label scale {adr 128} {readonly 0}} {
controller flowbus "\r\n"
# driver for Bronkhorst Flow or Pressure regulator (i.e.P-602CV-21KA-AAD)
# serial interface is set to:
# Char Size/Stop Bits: 8/1 Input Speed: 38400
# Flow Ctrl: None Output Speed: 38400
# Parity: None Modem Control: None
# syntax (chaining not mentioned):
# read command: :06Ad04CopyPrTp
# write command: :LnAd01PrTpData
# where:
# Ln: number of bytes (hex digits pairs) following
# Ad: node address (starting from 3)
# Copy: values just to be copied by the reply (first and third digit < 8)
# recommended practice: Use PrTp for Copy
# Pr: Process number (<80)
# Tp: Type + parameter number. Type: 00 byte, 20 int, 40 long/float, 60 string
# for strings either 00 (for nul terminated) or the max. number of chars
# has to be appended to the type
# Data: length depending on type.
# the interface returns readings on a scale where 32000 is 100%
set adr [format %02x $adr]
clientput "BRONK $label $scale $adr"
obj bflow rd
prop label $label
prop readcmd "r$adr 1 i0"
prop readfmt "%d"
prop update flowbus::conv $scale
prop @adr $adr
kids "$label" {
node setpoint wr
prop label Setpoint
prop write flowbus::setp $scale
prop readcmd "r$adr 1 i1"
prop readfmt "%d"
prop update flowbus::conv $scale
}
}
proc flowbus::conv {scale} {
if {[scan [sct result] [sct readfmt] flow ] != 1} {
error "bad result format: '[sct result]'"
}
sct update [format %.6g [expr $flow * $scale / 32000.]]
return idle
}
proc flowbus::setp {scale} {
set setval [expr int( [sct target] * 32000.0 / $scale) ]
if {$setval > 32000 } {
if {$setval < 32320} {
set setval 32000
} else {
error "[sct]: setpoint [sct target] must be <= $scale"
}
} elseif {$setval < 0 } {
error "[sct]: setpoint [sct target] must be >= 0"
}
sct send "w [sct @adr] 1 i1=$setval"
return "flowbus::acknowledge"
}
proc flowbus::acknowledge {} {
if {[string compare [sct result] "0" ] != 0} {
error "bad result format: '[sct result]' [sct result]"
}
return read
}