zhangzengfei
2023-08-11 742923a5512707bdfd4c0e2e9adfcb86b453be28
collector/plc4x.go
@@ -1,6 +1,7 @@
package collector
import (
   "errors"
   "fmt"
   plc4go "github.com/apache/plc4x/plc4go/pkg/api"
@@ -35,27 +36,35 @@
   return connectionResult.GetConnection(), nil
}
func ReadHoldingRegister(connection plc4go.PlcConnection, address int) ([]byte, error) {
   tagAddress := fmt.Sprintf("holding-register:%d:DINT", address)
func ReadHoldingRegister(connection plc4go.PlcConnection, address, length int) ([]byte, error) {
   if length > 1 {
      return ReadHoldingRegisterList(connection, address, length)
   }
   return ReadHoldingRegisterSingle(connection, address)
}
func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
   tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)
   // 读模式
   readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build()
   if err != nil {
      fmt.Printf("Error preparing read-request:%s\n", err.Error())
      fmt.Printf("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())
      fmt.Printf("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
      return nil, nil
   }
   value := readResult.GetResponse().GetValue("tag")
@@ -63,3 +72,37 @@
   return value.GetRaw(), err
}
func ReadHoldingRegisterList(connection plc4go.PlcConnection, address, length int) ([]byte, error) {
   tagAddress := fmt.Sprintf("holding-register:%d:UINT[%d]", address, length)
   // 读模式
   readRequest, err := connection.ReadRequestBuilder().AddTagAddress("tag", tagAddress).Build()
   if err != nil {
      fmt.Printf("preparing read-request:%s\n", err.Error())
      return nil, err
   }
   // 执行
   readResult := <-readRequest.Execute()
   if err := readResult.GetErr(); err != nil {
      fmt.Printf("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, errors.New("error  code: " + readResult.GetResponse().GetResponseCode("tag").GetName())
   }
   value := readResult.GetResponse().GetValue("tag")
   var result []byte
   for _, val := range value.GetList() {
      result = append(result, val.GetRaw()...)
   }
   return result, nil
}