#9 Function to update all coil values

This commit is contained in:
Jarno Rankinen 2023-01-29 21:56:22 +02:00
parent 3fab63f60f
commit 8143414c39
2 changed files with 36 additions and 11 deletions

View File

@ -2,16 +2,14 @@ package main
import ( import (
"fmt" "fmt"
"log"
"time"
"github.com/0ranki/enervent-ctrl/enervent-ctrl-go/pingvinKL" "github.com/0ranki/enervent-ctrl/enervent-ctrl-go/pingvinKL"
) )
func main() { func main() {
log.Println(time.Now())
pingvin := pingvinKL.New() pingvin := pingvinKL.New()
log.Println(time.Now()) pingvin.Update()
fmt.Println(pingvin.ReadCoil(40)) for i := 0; i < len(pingvin.Coils); i++ {
log.Println(time.Now()) fmt.Println(pingvin.Coils[i].Symbol, pingvin.Coils[i].Value, pingvin.Coils[i].Description)
}
} }

View File

@ -49,7 +49,7 @@ func readCsvLines(file string) [][]string {
return data return data
} }
// Configure the modbus client on creation // Configure the modbus parameters
func (p PingvinKL) getHandler() *modbus.RTUClientHandler { func (p PingvinKL) getHandler() *modbus.RTUClientHandler {
// TODO: read configuration from file, hardcoded for now // TODO: read configuration from file, hardcoded for now
handler := modbus.NewRTUClientHandler("/dev/ttyS0") handler := modbus.NewRTUClientHandler("/dev/ttyS0")
@ -58,25 +58,52 @@ func (p PingvinKL) getHandler() *modbus.RTUClientHandler {
handler.Parity = "N" handler.Parity = "N"
handler.StopBits = 1 handler.StopBits = 1
handler.SlaveId = 1 handler.SlaveId = 1
handler.Timeout = 200 * time.Millisecond handler.Timeout = 1500 * time.Millisecond
return handler return handler
} }
func (p PingvinKL) Update() { func (p PingvinKL) Update() {
// coildata, err := p.Client.ReadCoils(0, len(p.Coils)) handler := p.getHandler()
err := handler.Connect()
if err != nil {
log.Fatal("Update: handler.Connect: ", err)
}
defer handler.Close()
client := modbus.NewClient(handler)
results, err := client.ReadCoils(0, uint16(len(p.Coils)))
if err != nil {
log.Fatal("Update: client.ReadCoils:", err)
}
// modbus.ReadCoils returns a byte array, with the first byte's bits representing coil values 0-7,
// second byte coils 8-15 etc.
// Within each byte, LSB represents the lowest n coil while MSB is the highest
// e.g. reading the first 8 coils might return a byte array of length 1, with the following:
// [4], which is 00000100, meaning all other coils are 0 except coil #2 (3rd coil)
//
k := 0 // pingvinCoil index
for i := 0; i < len(results); i++ { // loop through the byte array
for j := 0; j < 8; j++ {
// Here we loop through each bit in the byte, shifting right
// and checking if the LSB after the shift is 1 with a bitwise AND
// A coil value of 1 means on/true/yes, so == 1 returns the bool value
// for each coil
p.Coils[k].Value = (results[i] >> j & 0x1) == 1
k++
}
}
} }
func (p PingvinKL) ReadCoil(n uint16) []byte { func (p PingvinKL) ReadCoil(n uint16) []byte {
handler := p.getHandler() handler := p.getHandler()
err := handler.Connect() err := handler.Connect()
if err != nil { if err != nil {
log.Fatal("ReadCoil1: ", err) log.Fatal("ReadCoil: handler.Connect: ", err)
} }
defer handler.Close() defer handler.Close()
client := modbus.NewClient(handler) client := modbus.NewClient(handler)
results, err := client.ReadCoils(n, 1) results, err := client.ReadCoils(n, 1)
if err != nil { if err != nil {
log.Fatal("ReadCoil2: ", err) log.Fatal("ReadCoil: client.ReadCoils", err)
} }
return results return results
} }