| | |
| | | "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) |
| | | |
| | |
| | | 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) |