70 lines
2.0 KiB
Go
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.")
|
|
}
|
|
}
|