Merge pull request 'Open tcp connection for every read.' (#1) from move-dial-to-read-registers into master

This commit was merged in pull request #1.
This commit is contained in:
2020-10-19 19:53:36 +02:00

View File

@@ -10,24 +10,27 @@ import (
type Mbclient struct {
transactionCounter uint16
conn net.Conn
address string
header [7]byte
unit uint8
}
func New(address string, unit uint8) (*Mbclient, error) {
var err error
c := new(Mbclient)
c.conn, err = net.Dial("tcp", address)
if err != nil {
return nil, err
}
c.address = address
c.unit = unit
return c, nil
}
func (m *Mbclient) ReadRegisters(first uint16, numRegs uint16) ([]uint16, error) {
conn, err := net.Dial("tcp", m.address)
if err != nil {
return nil, err
}
defer conn.Close()
const requestLength = 12
m.transactionCounter++
req := make([]byte, requestLength)
@@ -41,21 +44,21 @@ func (m *Mbclient) ReadRegisters(first uint16, numRegs uint16) ([]uint16, error)
req[7] = 3 //FunctionCode
binary.BigEndian.PutUint16(req[8:10], first-1)
binary.BigEndian.PutUint16(req[10:12], numRegs)
m.conn.SetDeadline(time.Now().Add(10 * time.Second))
byteswritten, err := m.conn.Write(req)
conn.SetDeadline(time.Now().Add(10 * time.Second))
byteswritten, err := conn.Write(req)
if err != nil {
return nil, err
}
if byteswritten != requestLength {
return nil, fmt.Errorf("Failed to send request")
}
m.conn.SetDeadline(time.Now().Add(10 * time.Second))
_, err = io.ReadFull(m.conn, m.header[:])
conn.SetDeadline(time.Now().Add(10 * time.Second))
_, err = io.ReadFull(conn, m.header[:])
responseHeader.unMarshal(m.header)
expectedDataLength := responseHeader.length - 1
response := make([]byte, expectedDataLength)
_, err = m.conn.Read(response)
_, err = conn.Read(response)
err = mbpayload.unMarshal(response)
if mbpayload.functionCode != 3 {