| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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) // 获取寄存器值
- SetHoldingRegs(address, quantity uint16, value []byte) (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
- }
- 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.ConnTimeoutJudge(mb.Sta.Times) {
- logger.Error("写命令发送失败,连接超时")
- }
- err = fmt.Errorf("写命令发送失败")
- return
- }
- adu, err = mb.Clt.DePackSetRegs(res)
- return
- }
|