rtuTcp.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package rtuService
  2. import (
  3. "MeterService/core/logger"
  4. "MeterService/core/modbus"
  5. "MeterService/core/tcpserver"
  6. "MeterService/core/utils"
  7. "MeterService/dataStruct"
  8. "fmt"
  9. )
  10. type rtuNetPackager struct {
  11. Sn string
  12. Id int
  13. Clt modbus.Client
  14. Sta *dataStruct.ClientState
  15. }
  16. type RtuNetPgr interface {
  17. GetHoldingRegs(address, quantity uint16) (adu []byte, err error) // 获取寄存器值
  18. SetAddress(Id int) // 设置电表地址
  19. SetSerialNumber(sn string) // 设置电表序列号
  20. SetClientState(sta *dataStruct.ClientState) // 设置客户端
  21. }
  22. func NewRtuNetPgr(Id byte) RtuNetPgr {
  23. handler := modbus.NewRTUClientHandler("")
  24. handler.SlaveId = Id
  25. return &rtuNetPackager{Sn: "", Id: 1, Clt: modbus.NewClient(handler), Sta: nil}
  26. }
  27. func (mb *rtuNetPackager) SetAddress(Id int) {
  28. if Id > 0 && Id < 255 {
  29. mb.Id = Id
  30. }
  31. }
  32. func (mb *rtuNetPackager) SetSerialNumber(sn string) {
  33. mb.Sn = sn
  34. }
  35. func (mb *rtuNetPackager) SetClientState(sta *dataStruct.ClientState) {
  36. mb.Sta = sta
  37. }
  38. // GetHoldingRegs adu []byte, err error
  39. // 发送modbus rtu报文并解析
  40. func (mb *rtuNetPackager) GetHoldingRegs(address, quantity uint16) (adu []byte, err error) {
  41. var result []byte
  42. if mb.Sta == nil {
  43. err = fmt.Errorf("客户端不存在")
  44. logger.Error("发送失败,%s", err.Error())
  45. return
  46. }
  47. result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
  48. if err != nil {
  49. return
  50. }
  51. logger.Debug("=====SEND CMD===== %v", result)
  52. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  53. if !bok {
  54. if utils.ConnTimeoutJudge(mb.Sta.Times) {
  55. logger.Error("发送失败,连接超时")
  56. }
  57. err = fmt.Errorf("发送失败")
  58. return
  59. }
  60. adu, err = mb.Clt.DePackRegisters(res)
  61. return
  62. }