zhangqian
2023-10-26 620d904921c76b6b29d1b69787da7a82121d4c31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package modbusx
 
import (
    "apsClient/constvar"
    "apsClient/model/common"
    "github.com/goburrow/modbus"
    "time"
)
 
func ReadByRTU(c *common.RTUConfig, address uint16, quantity uint16) (data []byte, err error) {
    address--
    cli, err := getModbusRTUConnection(c)
    if err != nil {
        return nil, err
    }
    data, err = cli.ReadHoldingRegisters(address, quantity)
    if err != nil {
        cli, err = getModbusRTUConnection(c)
        if err != nil {
            return nil, err
        }
        data, err = cli.ReadHoldingRegisters(address, quantity)
    }
    return
}
 
func WriteByRTU(c *common.RTUConfig, address uint16, value int) (err error) {
    address--
    var bytesVal []byte
    bytesVal = intToBytes(value)
 
    cli, err := getModbusRTUConnection(c)
    if err != nil {
        return err
    }
    _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
    if err != nil {
        cli, err = getModbusRTUConnection(c)
        if err != nil {
            return err
        }
        _, err = cli.WriteMultipleRegisters(address, uint16(len(bytesVal)), bytesVal)
    }
    return err
}
 
func getModbusRTUConnection(c *common.RTUConfig) (cli modbus.Client, err error) {
    // Modbus RTU/ASCII
    h := modbus.NewRTUClientHandler(c.SerialName)
    h.BaudRate = c.BaudRate
    h.DataBits = c.DataBit
    switch c.Parity {
    case constvar.ParityEven:
        h.Parity = "E"
    case constvar.ParityOdd:
        h.Parity = "O"
    case constvar.ParityNull:
        h.Parity = "N"
    }
 
    h.StopBits = c.StopBit
    h.SlaveId = 1
    h.Timeout = 5 * time.Second
 
    err = h.Connect()
    if err != nil {
        return nil, err
    }
    defer h.Close()
    cli = modbus.NewClient(h)
    return
}