| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package rtuService
- import (
- "MeterService/core/logger"
- "MeterService/core/modbus"
- "MeterService/core/tcpserver"
- "MeterService/core/utils"
- "MeterService/dataStruct"
- "fmt"
- )
- type rtuNetPackager struct {
- Sn string
- Id int
- Clt modbus.Client
- Sta *dataStruct.ClientState
- }
- type RtuNetPgr interface {
- GetHoldingRegs(address, quantity uint16) (adu []byte, err error) // 获取寄存器值
- SetAddress(Id int) // 设置电表地址
- SetSerialNumber(sn string) // 设置电表序列号
- SetClientState(sta *dataStruct.ClientState) // 设置客户端
- }
- 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 *dataStruct.ClientState) {
- 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("客户端不存在")
- logger.Error("发送失败,%s", err.Error())
- return
- }
- result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
- if err != nil {
- return
- }
- logger.Debug("=====SEND CMD===== %v", result)
- res, bok := tcpserver.SendTo(mb.Sta.FD, result)
- if !bok {
- if utils.ConnTimeoutJudge(mb.Sta.Times) {
- logger.Error("发送失败,连接超时")
- }
- err = fmt.Errorf("发送失败")
- return
- }
- adu, err = mb.Clt.DePackRegisters(res)
- return
- }
|