package business import ( "fmt" "time" "Dynamic_environmental_detection/logger" "github.com/goburrow/modbus" ) // DebugModbusClient 调试版Modbus客户端 type DebugModbusClient struct { client modbus.Client handler *modbus.RTUClientHandler slaveID byte } // NewDebugModbusClient 创建调试版Modbus客户端 func NewDebugModbusClient(config *ModbusConfig, slaveID byte) (*DebugModbusClient, error) { logger.Logger.Printf("DEBUG: Create a Modbus client - SlaveID: %d, port: %s", slaveID, config.Port) handler := modbus.NewRTUClientHandler(config.Port) handler.BaudRate = config.BaudRate handler.DataBits = config.DataBits handler.StopBits = config.StopBits handler.Parity = config.Parity handler.Timeout = config.Timeout handler.SlaveId = slaveID logger.Logger.Printf("DEBUG: Attempt to connect to the Modbus device...") if err := handler.Connect(); err != nil { logger.Logger.Printf("DEBUG: Modbus connection failed: %v", err) return nil, fmt.Errorf("Failed to connect to Modbus device: %v", err) } logger.Logger.Printf("DEBUG: Modbus connection successful!") return &DebugModbusClient{ client: modbus.NewClient(handler), handler: handler, slaveID: slaveID, }, nil } // ReadHoldingRegisters 读取保持寄存器(带调试信息) func (d *DebugModbusClient) ReadHoldingRegisters(address, quantity uint16) ([]byte, error) { logger.Logger.Printf("DEBUG: Send Modbus request - SlaveID: %d, Function code: 0x03, Address: %d, quantity: %d", d.slaveID, address, quantity) startTime := time.Now() data, err := d.client.ReadHoldingRegisters(address, quantity) elapsed := time.Since(startTime) if err != nil { logger.Logger.Printf("DEBUG: Failed to read - time-consuming: %v, Error: %v", elapsed, err) return nil, err } logger.Logger.Printf("DEBUG: Reading successful - time-consuming: %v, Data length: %d, Data %X", elapsed, len(data), data) return data, nil } // Close 关闭连接 func (d *DebugModbusClient) Close() { if d.handler != nil { d.handler.Close() logger.Logger.Printf("DEBUG: Modbus connection has been closed.") } }