rtuTcp.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package iotRtuService
  2. import (
  3. "IotAdmin/core/logger"
  4. "IotAdmin/core/modbus"
  5. "IotAdmin/core/tcpserver"
  6. "IotAdmin/core/tools/utils"
  7. "IotAdmin/iot/constant"
  8. iotStruct "IotAdmin/iot/struct"
  9. "fmt"
  10. )
  11. type rtuNetPackager struct {
  12. Sn string
  13. Id int
  14. Clt modbus.Client
  15. Sta *iotStruct.DtuClient
  16. }
  17. type RtuNetPgr interface {
  18. GetHoldingRegs(address, quantity uint16) (adu []byte, err error) // 获取寄存器值
  19. SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error)
  20. SetAddress(Id int) // 设置电表地址
  21. SetSerialNumber(sn string) // 设置电表序列号
  22. SetClientState(sta *iotStruct.DtuClient) // 设置客户端
  23. }
  24. func NewRtuNetPgr(Id byte) RtuNetPgr {
  25. handler := modbus.NewRTUClientHandler("")
  26. handler.SlaveId = Id
  27. return &rtuNetPackager{Sn: "", Id: 1, Clt: modbus.NewClient(handler), Sta: nil}
  28. }
  29. func (mb *rtuNetPackager) SetAddress(Id int) {
  30. if Id > 0 && Id < 255 {
  31. mb.Id = Id
  32. }
  33. }
  34. func (mb *rtuNetPackager) SetSerialNumber(sn string) {
  35. mb.Sn = sn
  36. }
  37. func (mb *rtuNetPackager) SetClientState(sta *iotStruct.DtuClient) {
  38. mb.Sta = sta
  39. }
  40. // GetHoldingRegs adu []byte, err error
  41. // 发送modbus rtu报文并解析
  42. func (mb *rtuNetPackager) GetHoldingRegs(address, quantity uint16) (adu []byte, err error) {
  43. var result []byte
  44. if mb.Sta == nil {
  45. err = fmt.Errorf("读命令,客户端不存在")
  46. logger.Errorf("读命令发送失败,%s", err.Error())
  47. return
  48. }
  49. result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
  50. if err != nil {
  51. return
  52. }
  53. logger.Debugf("=====SEND CMD===== %v", result)
  54. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  55. if !bok {
  56. if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
  57. logger.Error("读命令发送失败,连接超时")
  58. }
  59. err = fmt.Errorf("读命令发送失败")
  60. return
  61. }
  62. adu, err = mb.Clt.DePackRegisters(res)
  63. return
  64. }
  65. func (mb *rtuNetPackager) SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error) {
  66. var result []byte
  67. if mb.Sta == nil {
  68. err = fmt.Errorf("写命令客户端不存在")
  69. return
  70. }
  71. result, err = mb.Clt.PackWriteMultipleRegisters(address, quantity, value)
  72. if err != nil {
  73. return
  74. }
  75. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  76. if !bok {
  77. if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
  78. logger.Error("写命令发送失败,连接超时")
  79. }
  80. err = fmt.Errorf("写命令发送失败")
  81. return
  82. }
  83. adu, err = mb.Clt.DePackSetRegs(res)
  84. return
  85. }