From 5bbbf364e4d8a19b5fb5bfaf8755efe01675d581 Mon Sep 17 00:00:00 2001 From: l_samenv Date: Fri, 19 Aug 2022 17:25:34 +0200 Subject: [PATCH] added slop addon and drivers --- tcl/drivers/slope.tcl | 77 +++++++++++++++++++++++++++++++++++++++++++ tcl/slope.addon | 6 ++++ 2 files changed, 83 insertions(+) create mode 100644 tcl/drivers/slope.tcl create mode 100644 tcl/slope.addon diff --git a/tcl/drivers/slope.tcl b/tcl/drivers/slope.tcl new file mode 100644 index 0000000..48dd4c5 --- /dev/null +++ b/tcl/drivers/slope.tcl @@ -0,0 +1,77 @@ +namespace eval slope {} { + variable tbuffer + variable vbuffer +} + +proc stdConfig::slope {srcnode {omitzero 0}} { + variable hostport none + variable name + variable node + variable tbuffer + variable vbuffer + controller syncedprot + + obj slope upd + + dolater 0 hset $node/node $srcnode + + kids $name { + node node out -text + prop check slope::setnode $omitzero + prop write stdSct::complete + + node unit par 60 + prop help "unit=60: mainunits/minutes, unit=1: mainunits/sec" + node ref par 0 + node bufperiod par 300 + } +} + +proc slope::setnode {omitzero} { + variable tbuffer + variable vbuffer + + [sct controller] updatescript [sct target] "slope::update_value [sct parent] $omitzero" + sct update [sct target] + set tbuffer([sct parent]) [list] + set vbuffer([sct parent]) [list] +} + +proc slope::update_value {sn omitzero val} { + variable tbuffer + variable vbuffer + + if {$val == 0 && $omitzero} { + return + } + # sn: slope node + set tbuf $tbuffer($sn) + set vbuf $vbuffer($sn) + set now [DoubleTime] + lappend tbuf $now + lappend vbuf $val + set b [hvali $sn/bufperiod] + while {[lindex $tbuf 0] < $now - $b} { + set tbuf [lrange $tbuf 1 end] + set vbuf [lrange $vbuf 1 end] + } + set tbuffer($sn) $tbuf + set vbuffer($sn) $vbuf + set l [llength $tbuf] + if {$l < 3 || [lindex $tbuf end] - [lindex $tbuf 0] < $b / 4} { + updateerror $sn "not enough data" + return + } + set nom 0 + set div 0 + set i 0 + for {set i 0} {$i * 2 < $l} {incr i} { + set j [expr $l - $i - 1] + set dt [expr [lindex $tbuf $j] - [lindex $tbuf $i]] + set nom [expr $nom + ([lindex $vbuf $j] - [lindex $vbuf $i]) * $dt] + set div [expr $div + $dt * $dt] + incr i + } + set slope [expr ($nom / $div) * [hval $sn/unit]] + updateval $sn $slope +} diff --git a/tcl/slope.addon b/tcl/slope.addon new file mode 100644 index 0000000..5a10483 --- /dev/null +++ b/tcl/slope.addon @@ -0,0 +1,6 @@ +addonDesc = slope + +makenv slope -driver slope + +GraphAdd slope s1 slope auto +GraphAdd slope.ref v volt auto