package collector 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 NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) { // 创建驱动管理器 driverManager := plc4go.NewPlcDriverManager() // 注册TCP传输 transports.RegisterTcpTransport(driverManager) // 注册驱动 //drivers.RegisterKnxDriver(driverManager) drivers.RegisterModbusTcpDriver(driverManager) // 通过TCP连接PLC设备 connectionString := fmt.Sprintf("modbus-tcp://%s", ipAddr) connectionRequestChanel := driverManager.GetConnection(connectionString) // 等待连接响应 connectionResult := <-connectionRequestChanel // 判断是否连接成功 if err := connectionResult.GetErr(); err != nil { return nil, err } return connectionResult.GetConnection(), nil } func ReadHoldingRegister(connection plc4go.PlcConnection, address int) ([]byte, error) { tagAddress := fmt.Sprintf("holding-register:%d:DINT", address) // 读模式 readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build() if err != nil { fmt.Printf("Error preparing read-request:%s\n", err.Error()) return nil, err } // 执行 readResult := <-readRequest.Execute() if err := readResult.GetErr(); err != nil { fmt.Printf("Error execting read-request:%s\n", err.Error()) return nil, err } // 判断响应码是否正确 if readResult.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK { fmt.Printf("error an non-ok return code: %s", readResult.GetResponse().GetResponseCode("tag").GetName()) return nil, err } value := readResult.GetResponse().GetValue("tag") return value.GetRaw(), err }