Modbus: close connection on error (#15319)
This commit is contained in:
parent
04a3b385e6
commit
1eeeebdadd
2 changed files with 44 additions and 39 deletions
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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{}) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue