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())
|
}
|
|
}
|