package modbusx import ( "github.com/goburrow/modbus" "sync" ) type ConnectionManager struct { connections map[string]modbus.Client mu sync.Mutex } func newPlcConnectionManager() *ConnectionManager { return &ConnectionManager{ connections: make(map[string]modbus.Client), } } func (cm *ConnectionManager) GetConnection(address string) (modbus.Client, bool) { cm.mu.Lock() defer cm.mu.Unlock() conn, ok := cm.connections[address] if !ok { return nil, false } return conn, true } var connectionManager = newPlcConnectionManager() func (cm *ConnectionManager) AddConnection(address string, connection modbus.Client) { cm.mu.Lock() defer cm.mu.Unlock() cm.connections[address] = connection } func (cm *ConnectionManager) RemoveConnection(address string) { cm.mu.Lock() defer cm.mu.Unlock() delete(cm.connections, address) } func getModbusConnection(ipAddr string) modbus.Client { if conn, ok := connectionManager.GetConnection(ipAddr); ok { return conn } conn := newGetModbusConnection(ipAddr) connectionManager.AddConnection(ipAddr, conn) return conn } func unsetModbusConnection(ipAddr string) { _, ok := connectionManager.GetConnection(ipAddr) if !ok { return } connectionManager.RemoveConnection(ipAddr) } func newGetModbusConnection(ipAddr string) modbus.Client { return modbus.TCPClient(ipAddr) }