2025-11-24 18:06:00 +08:00

70 lines
2.0 KiB
Go

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