Modbus: close connection on error (#15319)

This commit is contained in:
andig 2024-08-09 09:24:01 +02:00 • committed by GitHub
parent 04a3b385e6
commit 1eeeebdadd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 44 additions and 39 deletions

View file

@ -1,18 +1,15 @@
package modbus
import (
"sync"
"time"
"github.com/grid-x/modbus"
"github.com/volkszaehler/mbmd/meters"
)
// Connection is a logical modbus connection per slave ID sharing a physical connection
type Connection struct {
*logger
meters.Connection
mu sync.Mutex
logger *logger
logical meters.Logger
delay time.Duration
}
@ -42,72 +39,79 @@ func (c *Connection) Timeout(timeout time.Duration) {
}
}
func (c *Connection) Logger(l modbus.Logger) {
c.mu.Lock()
defer c.mu.Unlock()
c.logical = l
}
func (c *Connection) prepare() {
c.mu.Lock()
defer c.mu.Unlock()
func (c *Connection) exec(fun func() ([]byte, error)) ([]byte, error) {
time.Sleep(c.delay)
c.logger.Logger(c.logical)
return c.WithLogger(c.logical, func() ([]byte, error) {
b, err := fun()
if err != nil {
c.Connection.Close()
}
return b, err
})
}
func (c *Connection) ReadCoils(address, quantity uint16) ([]byte, error) {
c.prepare()
return c.ModbusClient().ReadCoils(address, quantity)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadCoils(address, quantity)
})
}
func (c *Connection) WriteSingleCoil(address, value uint16) ([]byte, error) {
c.prepare()
return c.ModbusClient().WriteSingleCoil(address, value)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().WriteSingleCoil(address, value)
})
}
func (c *Connection) ReadInputRegisters(address, quantity uint16) ([]byte, error) {
c.prepare()
return c.ModbusClient().ReadInputRegisters(address, quantity)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadInputRegisters(address, quantity)
})
}
func (c *Connection) ReadHoldingRegisters(address, quantity uint16) ([]byte, error) {
c.prepare()
return c.ModbusClient().ReadHoldingRegisters(address, quantity)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadHoldingRegisters(address, quantity)
})
}
func (c *Connection) WriteSingleRegister(address, value uint16) ([]byte, error) {
c.prepare()
return c.ModbusClient().WriteSingleRegister(address, value)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().WriteSingleRegister(address, value)
})
}
func (c *Connection) WriteMultipleRegisters(address, quantity uint16, value []byte) ([]byte, error) {
c.prepare()
return c.ModbusClient().WriteMultipleRegisters(address, quantity, value)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().WriteMultipleRegisters(address, quantity, value)
})
}
func (c *Connection) ReadDiscreteInputs(address, quantity uint16) (results []byte, err error) {
c.prepare()
return c.ModbusClient().ReadDiscreteInputs(address, quantity)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadDiscreteInputs(address, quantity)
})
}
func (c *Connection) WriteMultipleCoils(address, quantity uint16, value []byte) (results []byte, err error) {
c.prepare()
return c.ModbusClient().WriteMultipleCoils(address, quantity, value)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().WriteMultipleCoils(address, quantity, value)
})
}
func (c *Connection) ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity uint16, value []byte) (results []byte, err error) {
c.prepare()
return c.ModbusClient().ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity, value)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity, value)
})
}
func (c *Connection) MaskWriteRegister(address, andMask, orMask uint16) (results []byte, err error) {
c.prepare()
return c.ModbusClient().MaskWriteRegister(address, andMask, orMask)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().MaskWriteRegister(address, andMask, orMask)
})
}
func (c *Connection) ReadFIFOQueue(address uint16) (results []byte, err error) {
c.prepare()
return c.ModbusClient().ReadFIFOQueue(address)
return c.exec(func() ([]byte, error) {
return c.ModbusClient().ReadFIFOQueue(address)
})
}

View file

@ -12,11 +12,12 @@ type logger struct {
logger meters.Logger
}
func (l *logger) Logger(logger modbus.Logger) {
func (l *logger) WithLogger(logger modbus.Logger, fun func() ([]byte, error)) ([]byte, error) {
l.mu.Lock()
defer l.mu.Unlock()
l.logger = logger
return fun()
}
func (l *logger) Printf(format string, v ...interface{}) {