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:DWORD").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 } // Do something with the response if readResult.GetResponse().GetResponseCode("count") != apiModel.PlcResponseCode_OK { fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName()) return } value := readResult.GetResponse().GetValue("count") fmt.Printf("Got result %d\n", value.GetUint32()) }