mirror of
https://github.com/jpeletier/koolnova2mqtt.git
synced 2026-07-26 19:46:58 +00:00
refactored to uint16
fixed panic
This commit is contained in:
+4
-9
@@ -1,7 +1,6 @@
|
||||
package modbus
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
)
|
||||
|
||||
@@ -18,28 +17,24 @@ func NewMock() Modbus {
|
||||
}
|
||||
}
|
||||
|
||||
func (ms *Mock) ReadRegister(slaveID byte, address uint16, quantity uint16) (results []byte, err error) {
|
||||
func (ms *Mock) ReadRegister(slaveID byte, address uint16, quantity uint16) (results []uint16, err error) {
|
||||
state, ok := ms.State[slaveID]
|
||||
if !ok {
|
||||
return nil, errors.New("Unknown slave")
|
||||
}
|
||||
address--
|
||||
for a := address; a < address+quantity; a++ {
|
||||
b := make([]byte, 2)
|
||||
binary.BigEndian.PutUint16(b, state[a])
|
||||
results = append(results, b...)
|
||||
results = append(results, state[a])
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
func (ms *Mock) WriteRegister(slaveID byte, address uint16, value uint16) (results []byte, err error) {
|
||||
func (ms *Mock) WriteRegister(slaveID byte, address uint16, value uint16) (results []uint16, err error) {
|
||||
state, ok := ms.State[slaveID]
|
||||
if !ok {
|
||||
return nil, errors.New("Unknown slave")
|
||||
}
|
||||
state[address-1] = value
|
||||
results = make([]byte, 2)
|
||||
binary.BigEndian.PutUint16(results, value)
|
||||
return results, nil
|
||||
return []uint16{value}, nil
|
||||
}
|
||||
|
||||
func (ms *Mock) Close() error { return nil }
|
||||
|
||||
+29
-6
@@ -1,6 +1,8 @@
|
||||
package modbus
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -9,8 +11,8 @@ import (
|
||||
)
|
||||
|
||||
type Modbus interface {
|
||||
ReadRegister(slaveID byte, address uint16, quantity uint16) (results []byte, err error)
|
||||
WriteRegister(slaveID byte, address uint16, value uint16) (results []byte, err error)
|
||||
ReadRegister(slaveID byte, address uint16, quantity uint16) (results []uint16, err error)
|
||||
WriteRegister(slaveID byte, address uint16, value uint16) (results []uint16, err error)
|
||||
Close() error
|
||||
}
|
||||
|
||||
@@ -33,6 +35,8 @@ func throttle(ms int) {
|
||||
time.Sleep(time.Duration(ms) * time.Millisecond)
|
||||
}
|
||||
|
||||
var ErrIncorrectResultSize = errors.New("Incorrect number of results returned")
|
||||
|
||||
func New(config *Config) (Modbus, error) {
|
||||
handler := gmodbus.NewRTUClientHandler(config.Port)
|
||||
handler.BaudRate = config.BaudRate
|
||||
@@ -51,17 +55,36 @@ func (mb *modbus) Close() error {
|
||||
return mb.handler.Close()
|
||||
}
|
||||
|
||||
func (mb *modbus) ReadRegister(slaveID byte, address uint16, quantity uint16) (results []byte, err error) {
|
||||
func parseResults(r []byte, quantity uint16) ([]uint16, error) {
|
||||
if len(r) != int(quantity*2) {
|
||||
return nil, ErrIncorrectResultSize
|
||||
}
|
||||
results := make([]uint16, quantity)
|
||||
for n := uint16(0); n < quantity; n++ {
|
||||
results[n] = binary.BigEndian.Uint16(r[n*2 : n*2+2])
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (mb *modbus) ReadRegister(slaveID byte, address uint16, quantity uint16) (results []uint16, err error) {
|
||||
err = mb.try(slaveID, func() (err error) {
|
||||
results, err = mb.client.ReadHoldingRegisters(address-1, quantity)
|
||||
r, err := mb.client.ReadHoldingRegisters(address-1, quantity)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
results, err = parseResults(r, quantity)
|
||||
return err
|
||||
})
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (mb *modbus) WriteRegister(slaveID byte, address uint16, value uint16) (results []byte, err error) {
|
||||
func (mb *modbus) WriteRegister(slaveID byte, address uint16, value uint16) (results []uint16, err error) {
|
||||
err = mb.try(slaveID, func() (err error) {
|
||||
results, err = mb.client.WriteSingleRegister(address-1, value)
|
||||
r, err := mb.client.WriteSingleRegister(address-1, value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
results, err = parseResults(r, 1)
|
||||
return err
|
||||
})
|
||||
return results, err
|
||||
|
||||
Reference in New Issue
Block a user