rtuTcp.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package iotRtuService
  2. import (
  3. "IotAdmin/core/modbus"
  4. "IotAdmin/core/tcpserver"
  5. "IotAdmin/core/tools/utils"
  6. "IotAdmin/iot/constant"
  7. iotStruct "IotAdmin/iot/struct"
  8. "fmt"
  9. )
  10. type rtuNetPackager struct {
  11. Sn string
  12. Id int
  13. Clt modbus.Client
  14. Sta *iotStruct.DtuClient
  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 *iotStruct.DtuClient) // 设置客户端
  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 *iotStruct.DtuClient) {
  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. return
  46. }
  47. result, err = mb.Clt.PackReadHoldingRegisters(address, quantity)
  48. if err != nil {
  49. return
  50. }
  51. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  52. if !bok {
  53. if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
  54. err = fmt.Errorf("读命令发送失败,连接超时")
  55. return
  56. }
  57. err = fmt.Errorf("读命令发送失败")
  58. return
  59. }
  60. adu, err = mb.Clt.DePackRegisters(res)
  61. return
  62. }
  63. func (mb *rtuNetPackager) SetHoldingRegs(address, quantity uint16, value []byte) (adu []byte, err error) {
  64. var result []byte
  65. if mb.Sta == nil {
  66. err = fmt.Errorf("写命令客户端不存在")
  67. return
  68. }
  69. result, err = mb.Clt.PackWriteMultipleRegisters(address, quantity, value)
  70. if err != nil {
  71. return
  72. }
  73. res, bok := tcpserver.SendTo(mb.Sta.FD, result)
  74. if !bok {
  75. if utils.TimeDiff(mb.Sta.Times, constant.TCPTimeoutTime) {
  76. err = fmt.Errorf("写命令发送失败,连接超时")
  77. return
  78. }
  79. err = fmt.Errorf("写命令发送失败")
  80. return
  81. }
  82. adu, err = mb.Clt.DePackSetRegs(res)
  83. return
  84. }