package iotRtuService import ( "IotAdmin/core/modbus" "IotAdmin/core/tcpserver" "IotAdmin/core/tools/utils" "IotAdmin/iot/constant" iotStruct "IotAdmin/iot/struct" "fmt" ) type rtuNetPackager struct { Sn string Id int Clt modbus.Client Sta *iotStruct.DtuClient } type RtuNetPgr interface { GetHoldingRegs(address, quantity uint16) (adu []byte, err error) // 获取寄存器值 SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error) SetAddress(Id int) // 设置电表地址 SetSerialNumber(sn string) // 设置电表序列号 SetClientState(sta *iotStruct.DtuClient) // 设置客户端 } func NewRtuNetPgr(Id byte) RtuNetPgr { handler := modbus.NewRTUClientHandler("") handler.SlaveId = Id return &rtuNetPackager{Sn: "", Id: 1, Clt: modbus.NewClient(handler), Sta: nil} } func (mb *rtuNetPackager) SetAddress(Id int) { if Id > 0 && Id < 255 { mb.Id = Id } } func (mb *rtuNetPackager) SetSerialNumber(sn string) { mb.Sn = sn } func (mb *rtuNetPackager) SetClientState(sta *iotStruct.DtuClient) { mb.Sta = sta } // GetHoldingRegs adu []byte, err error // 发送modbus rtu报文并解析 func (mb *rtuNetPackager) GetHoldingRegs(address, quantity uint16) (adu []byte, err error) { var result []byte if mb.Sta == nil { err = fmt.Errorf("读命令,客户端不存在") return } result, err = mb.Clt.PackReadHoldingRegisters(address, quantity) if err != nil { return } res, bok := tcpserver.SendTo(mb.Sta.FD, result) if !bok { if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) { err = fmt.Errorf("读命令发送失败,连接超时") return } err = fmt.Errorf("读命令发送失败") return } adu, err = mb.Clt.DePackRegisters(res) return } func (mb *rtuNetPackager) SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error) { var result []byte if mb.Sta == nil { err = fmt.Errorf("写命令客户端不存在") return } result, err = mb.Clt.PackWriteMultipleRegisters(address, quantity, value) if err != nil { return } res, bok := tcpserver.SendTo(mb.Sta.FD, result) if !bok { if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) { err = fmt.Errorf("写命令发送失败,连接超时") return } err = fmt.Errorf("写命令发送失败") return } adu, err = mb.Clt.DePackSetRegs(res) return }