From 175254b4ba38d6fb9934582b68bd9eaba379f688 Mon Sep 17 00:00:00 2001 From: Jarno Rankinen Date: Sun, 19 Feb 2023 21:28:50 +0200 Subject: [PATCH] gh-16 Retry reading registers 5 times, added debug variable to PingvinKL.New(). Not much debug output yet. --- enervent-ctrl-go/main.go | 2 +- enervent-ctrl-go/pingvinKL/pingvinKL.go | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/enervent-ctrl-go/main.go b/enervent-ctrl-go/main.go index 9736cec..03ecdb2 100644 --- a/enervent-ctrl-go/main.go +++ b/enervent-ctrl-go/main.go @@ -62,7 +62,7 @@ func listen() { func main() { log.Println("enervent-ctrl version", version) - pingvin = pingvinKL.New() + pingvin = pingvinKL.New(DEBUG) pingvin.Update() go pingvin.Monitor(15) listen() diff --git a/enervent-ctrl-go/pingvinKL/pingvinKL.go b/enervent-ctrl-go/pingvinKL/pingvinKL.go index d5b9433..b782abf 100644 --- a/enervent-ctrl-go/pingvinKL/pingvinKL.go +++ b/enervent-ctrl-go/pingvinKL/pingvinKL.go @@ -2,7 +2,6 @@ package pingvinKL import ( "bufio" - "encoding/json" "fmt" "log" "os" @@ -30,6 +29,7 @@ type PingvinKL struct { Status pingvinStatus buslock *sync.Mutex statuslock *sync.Mutex + debug bool } // single register data @@ -182,9 +182,16 @@ func (p *PingvinKL) updateRegisters() { if regs-k < 125 { r = regs - k } - results, err := client.ReadHoldingRegisters(uint16(k), uint16(r)) - if err != nil { - log.Fatal("updateRegisters: client.ReadCoils: ", err) + results := []byte{} + for retries := 0; retries < 5; retries++ { + results, err = client.ReadHoldingRegisters(uint16(k), uint16(r)) + if len(results) > 0 { + break + } else if retries == 4 { + log.Fatal("updateRegisters: client.ReadHoldingRegisters: ", err) + } else if err != nil { + log.Println("WARNING: updateRegisters: client.ReadHoldingRegisters: ", err) + } } // The values represent 16 bit integers, but modbus works with bytes // Each even byte of the returned []byte is the 8 MSBs of a new 16-bit @@ -244,7 +251,6 @@ func (p PingvinKL) ReadCoil(n uint16) []byte { func (p *PingvinKL) populateStatus() { hpct := p.Registers[49].Value / p.Registers[49].Multiplier - log.Println(hpct) if hpct > 100 { p.Status.HeaterPct = hpct - 100 p.Status.HrcPct = 100 @@ -269,7 +275,6 @@ func (p *PingvinKL) populateStatus() { // TODO: Alarms, n of alarms p.Status.DaysUntilService = p.Registers[538].Value / p.Registers[538].Multiplier // TODO: Uptime & date in separate functions - json.NewEncoder(log.Writer()).Encode(p.Status) } func (p *PingvinKL) Monitor(interval int) { @@ -280,8 +285,9 @@ func (p *PingvinKL) Monitor(interval int) { } // create a PingvinKL struct, read coils and registers from CSVs -func New() PingvinKL { +func New(debug bool) PingvinKL { pingvin := PingvinKL{} + pingvin.debug = debug pingvin.buslock = &sync.Mutex{} log.Println("Parsing coil data...") coilData := readCsvLines("coils.csv")