rtuTcp.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error)
  19. SetAddress(Id int) // 设置电表地址
  20. SetSerialNumber(sn string) // 设置电表序列号
  21. SetClientState(sta *dataStruct.ClientState) // 设置客户端
  22. }
  23. func NewRtuNetPgr(Id byte) RtuNetPgr {
  24. handler := modbus.NewRTUClientHandler("")
  25. handler.SlaveId = Id
  26. return &rtuNetPackager{Sn: "", Id: 1, Clt: modbus.NewClient(handler), Sta: nil}
  27. }
  28. func (mb *rtuNetPackager) SetAddress(Id int) {
  29. if Id > 0 && Id < 255 {
  30. mb.Id = Id
  31. }
  32. }
  33. func (mb *rtuNetPackager) SetSerialNumber(sn string) {
  34. mb.Sn = sn
  35. }
  36. func (mb *rtuNetPackager) SetClientState(sta *dataStruct.ClientState) {
  37. mb.Sta = sta
  38. }
  39. // GetHoldingRegs adu []byte, err error
  40. // 发送modbus rtu报文并解析
  41. func (mb *rtuNetPackager) GetHoldingRegs(address, quantity uint16) (adu []byte, err error) {
  42. var result []byte
  43. if mb.Sta == nil {
  44. err = fmt.Errorf("读命令,客户端不存在")
  45. logger.Error("读命令发送失败,%s", err.Error())
  46. return
  47. }
  48. result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
  49. if err != nil {
  50. return
  51. }
  52. logger.Debug("=====SEND CMD===== %v", result)
  53. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  54. if !bok {
  55. if utils.ConnTimeoutJudge(mb.Sta.Times) {
  56. logger.Error("读命令发送失败,连接超时")
  57. }
  58. err = fmt.Errorf("读命令发送失败")
  59. return
  60. }
  61. adu, err = mb.Clt.DePackRegisters(res)
  62. return
  63. }
  64. func (mb *rtuNetPackager) SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error) {
  65. var result []byte
  66. if mb.Sta == nil {
  67. err = fmt.Errorf("写命令客户端不存在")
  68. return
  69. }
  70. result, err = mb.Clt.PackWriteMultipleRegisters(address, quantity, value)
  71. if err != nil {
  72. return
  73. }
  74. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  75. if !bok {
  76. if utils.ConnTimeoutJudge(mb.Sta.Times) {
  77. logger.Error("写命令发送失败,连接超时")
  78. }
  79. err = fmt.Errorf("写命令发送失败")
  80. return
  81. }
  82. adu, err = mb.Clt.DePackSetRegs(res)
  83. return
  84. }