zhangqian
2023-08-25 48ef530180aeec4f91517e2b86ef75745c28241c
pkg/plc/plc4x.go
@@ -4,16 +4,52 @@
   "errors"
   "fmt"
   apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
   "github.com/apache/plc4x/plc4go/spi/options"
   "sync"
   "time"
   plc4go "github.com/apache/plc4x/plc4go/pkg/api"
   "github.com/apache/plc4x/plc4go/pkg/api/drivers"
   "github.com/apache/plc4x/plc4go/pkg/api/transports"
)
func NewModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
   // 创建驱动管理器
   driverManager := plc4go.NewPlcDriverManager()
type ConnectionManager struct {
   connections map[string]plc4go.PlcConnection
   mu          sync.Mutex
}
func NewPlcConnectionManager() *ConnectionManager {
   return &ConnectionManager{
      connections: make(map[string]plc4go.PlcConnection),
   }
}
func (cm *ConnectionManager) GetConnection(address string) (plc4go.PlcConnection, bool) {
   cm.mu.Lock()
   defer cm.mu.Unlock()
   conn, ok := cm.connections[address]
   return conn, ok
}
var connectionManager = NewPlcConnectionManager()
func (cm *ConnectionManager) AddConnection(address string, connection plc4go.PlcConnection) {
   cm.mu.Lock()
   defer cm.mu.Unlock()
   cm.connections[address] = connection
}
func GetModbusConnection(ipAddr string) (plc4go.PlcConnection, error) {
   if conn, ok := connectionManager.GetConnection(ipAddr); ok {
      if conn.IsConnected() {
         return conn, nil
      }
   }
   // 创建驱动管理器
   option := options.WithReceiveTimeout(time.Second * 5) //五秒超时
   driverManager := plc4go.NewPlcDriverManager(option)
   // 注册TCP传输
   transports.RegisterTcpTransport(driverManager)
@@ -33,7 +69,9 @@
      return nil, err
   }
   return connectionResult.GetConnection(), nil
   conn := connectionResult.GetConnection()
   connectionManager.AddConnection(ipAddr, conn)
   return conn, nil
}
func ReadHoldingRegisterSingle(connection plc4go.PlcConnection, address int) ([]byte, error) {
   tagAddress := fmt.Sprintf("holding-register:%d:UINT", address)