zhangzengfei
2023-07-18 787cbd888c764c4e17e7c542865426f6c371b05f
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
 
import (
    "fmt"
 
    plc4go "github.com/apache/plc4x/plc4go/pkg/api"
    "github.com/apache/plc4x/plc4go/pkg/api/drivers"
    apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
    "github.com/apache/plc4x/plc4go/pkg/api/transports"
)
 
func main() {
    // 创建驱动管理器
    driverManager := plc4go.NewPlcDriverManager()
 
    // 注册TCP传输
    transports.RegisterTcpTransport(driverManager)
 
    // 注册UDP传输
    //transports.RegisterUdpTransport(driverManager)
 
    // 注册串口传输
    //transports.RegisterSerialTransport(driverManager)
 
    // 注册驱动
    //drivers.RegisterKnxDriver(driverManager)
    drivers.RegisterModbusTcpDriver(driverManager)
 
    // 通过TCP连接PLC设备
    connectionRequestChanel := driverManager.GetConnection("modbus-tcp://192.168.1.88")
 
    // 等待连接响应
    connectionResult := <-connectionRequestChanel
 
    // 判断是否连接成功
    if err := connectionResult.GetErr(); err != nil {
        fmt.Printf("Error connecting to PLC: %s\n", err.Error())
        return
    }
 
    // 已连接, 获取连接实例
    connection := connectionResult.GetConnection()
    defer connection.Close()
 
    // 测试是否可以正常通信
    pingResult := <-connection.Ping()
    if err := pingResult.GetErr(); err != nil {
        fmt.Printf("Couldn't ping device: %s\n", err.Error())
    }
 
    // 验证是否可读
    if !connection.GetMetadata().CanRead() {
        fmt.Printf("This connection doesn't support read operations\n")
        return
    }
 
    // 读模式
    readRequest, err := connection.ReadRequestBuilder().AddTagAddress("count", "holding-register:1230:DINT[20]").Build()
    if err != nil {
        fmt.Printf("Error preparing read-request:%s\n", err.Error())
        return
    }
 
    // 执行
    readResult := <-readRequest.Execute()
    if err := readResult.GetErr(); err != nil {
        fmt.Printf("Error execting read-request:%s\n", err.Error())
        return
    }
 
    // 判断响应码是否正确
    if readResult.GetResponse().GetResponseCode("count") != apiModel.PlcResponseCode_OK {
        fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("count").GetName())
        return
    }
 
    // 测试获取变量名称
    //names := readResult.GetResponse().GetTagNames()
    //fmt.Printf("Got tag names %+v", names)
 
    value := readResult.GetResponse().GetValue("count")
    fmt.Printf("Got result length %d\n", value.GetLength())
 
    // 按字符串打印变量
    fmt.Printf("val data: %s\n", value.GetRaw())
    for _, val := range value.GetList() {
        fmt.Printf("%d ", val.GetUint16())
    }
 
}