refactored to uint16

fixed panic
This commit is contained in:
Javier Peletier
2020-12-21 12:05:57 +01:00
parent 96b3f00f29
commit 9992352454
7 changed files with 69 additions and 77 deletions
+4 -9
View File
@@ -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
View File
@@ -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