Files
sea/tcl/drivers/salsa.tcl
2022-08-18 15:04:28 +02:00

76 lines
2.1 KiB
Tcl

# rs485, 9600 baud / 8 bit / no parity / 2 stop
namespace eval salsa {} {
}
proc stdConfig::salsa {adr upperlimit} {
# timeout 5, try again 2
controller bin modbus-crc 1 2
prop read salsa::read
prop write salsa::write
# prop startcmd "int1 4 3 int2 0 6 crc / skip code skip str12 crc"
obj SALSA rd
prop @adr $adr
prop adr 24
prop scale 10
kids "salsa" {
node set wr
prop adr 25
prop upperlimit $upperlimit
prop scale 10
node clamp rd
prop adr 21
prop scale 10
node hwstatus rd
prop adr 19
}
}
proc salsa::read {} {
set cmd [format {int1 %d 3 int2 %d 1 crc} [sct @adr] [sct adr]]
# code 3: read multiple input registers, 1: size / reply: code, bytesize, value
sct send "int1 [sct @adr] 3 int2 [sct adr] 1 crc / skip code skip int2 crc"
# sct send "int1 [sct @adr] 3 int2 [sct adr] 1 crc / hex hex hex hex hex hex dump"
# alternatively code 4: read multiple holding registers
# sct send "int1 [sct @adr] 4 int2 [sct adr] 1 crc / skip code skip int2 crc"
# return salsa::update
return salsa::update
}
proc salsa::update {} {
set crcerror ""
lassign [sct result] result crcerror
if {$crcerror ne ""} {
clientlog "WARNING: sended [sct send] reply: $crcerror"
}
set scale [silent 1 sct scale]
if {$scale != 1} {
set result [expr $result / double($scale)]
}
sct update $result
return idle
}
proc salsa::write {} {
if {[sct target] > [silent [sct target] sct upperlimit]} {
error "[sct] [sct target] is above upper limit [sct upperlimit]"
}
set tg [expr round([sct target] * [silent 1 sct scale])]
# code 16: write multiple registers, 1: size (words), 2: size (bytes) / reply: code, int2 adr, int2 size
sct send "int1 [sct @adr] 16 int2 [sct adr] 1 int1 2 int2 $tg crc / skip code skip4 crc"
# alternatively: code 6: write single register: no size) / reply: code int2 adr int2 value
# sct send "int1 [sct @adr] 6 int2 [sct adr] int2 $tg crc / skip code skip4 crc"
return salsa::read
}
proc salsa::write_coil {} {
# code 5: write single coil
sct send "int1 [sct @adr] 5 int2 [sct adr] int2 [sct target] crc / skip code skip4 crc"
return salsa::read
}