collect.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package downStreamService
  2. import (
  3. "MeterService/core/logger"
  4. "MeterService/core/utils"
  5. "MeterService/data"
  6. "MeterService/dataStruct"
  7. "MeterService/database/meterCalcParam"
  8. "MeterService/service/downStreamService/proto/acrel"
  9. "MeterService/service/rtuService"
  10. )
  11. func collectData(sn string, config *dataStruct.DtuConfig) []*dataStruct.CollectData {
  12. array := make([]*dataStruct.CollectData, 0)
  13. meterRef := &dataStruct.MeterRef{}
  14. logger.Info("【%s】开始采集数据 ", sn)
  15. logger.Debug("【%s】开始采集数据 %v", sn, config)
  16. if !config.Enable || config.Secs < 1 {
  17. return array
  18. }
  19. client, ok := data.DtuMapState.Get(sn)
  20. if !ok {
  21. logger.Error("采集数据失败,[%s]客户端不存在", sn)
  22. return array
  23. }
  24. if !client.Online {
  25. logger.Error("采集数据失败,[%s]客户端离线", sn)
  26. }
  27. for _, cfg := range config.Slave {
  28. if cfg.Addr < 1 || cfg.Addr > 254 {
  29. logger.Error("采集数据失败,[%s]客户端地址错误: %d", sn, cfg.Addr)
  30. continue
  31. }
  32. bAddr := utils.IntoByte(cfg.Addr)
  33. w := rtuService.NewRtuNetPgr(bAddr)
  34. w.SetClientState(client)
  35. w.SetSerialNumber(sn)
  36. meterRef.LvRef = 220
  37. meterRef.PvRef = 380
  38. if cfg.LvRef > 0 {
  39. meterRef.LvRef = cfg.LvRef
  40. }
  41. if cfg.PvRef > 0 {
  42. meterRef.PvRef = cfg.PvRef
  43. }
  44. var (
  45. colData *dataStruct.CollectData
  46. err error
  47. )
  48. switch cfg.MType {
  49. case "ADW300":
  50. colData, err = acrel.CollectADW300(w, meterRef)
  51. if err != nil {
  52. logger.Error("采集数据失败, [%s][%s]客户端采集数据错误: %s", sn, cfg.MType, err.Error())
  53. continue
  54. }
  55. processCollectData(colData, cfg)
  56. array = append(array, colData)
  57. default:
  58. }
  59. }
  60. logger.Debug("采集数据完成【%s】 %v", sn, array)
  61. return array
  62. }
  63. func processCollectData(colData *dataStruct.CollectData, cfg *dataStruct.DtuSlave) {
  64. // 从机的配置需要保存到采集数据中,上报需要使用配置
  65. colData.Slave = cfg
  66. // 计算电表数据
  67. logger.Debug("计算电表数据: %s", cfg.NO)
  68. calc := &dataStruct.MeterCalcParam{}
  69. tms := utils.NowDataToTimeStamp()
  70. if x, ok := data.CalcParam.Get(cfg.NO); ok {
  71. calc = x.(*dataStruct.MeterCalcParam)
  72. } else {
  73. calc.PowerRate.Count = 1
  74. calc.PowerRate.MaxPower = colData.P
  75. calc.PowerRate.SumPower = colData.P
  76. calc.ClearDayEnergy()
  77. }
  78. t := (&dataStruct.DateTime{}).TimeStampToData(tms)
  79. if t.Hour == 0 && t.Minute == 0 {
  80. calc.PowerRate.Count = 1
  81. calc.PowerRate.MaxPower = colData.P
  82. calc.PowerRate.SumPower = colData.P
  83. calc.ClearDayEnergy()
  84. }
  85. // 计算电表数据
  86. logger.Debug("[%s] 计算前: [%v]", cfg.NO, calc)
  87. colData.CalcWithParam(calc)
  88. calc.Time = tms
  89. logger.Debug("[%s] 计算完成: [%v]", cfg.NO, calc)
  90. // 更新电表计算参数
  91. db := meterCalcParam.NewMeterCalcParamDb()
  92. data.CalcParam.Add(cfg.NO, calc)
  93. if db != nil {
  94. calcEt := &meterCalcParam.MeterCalcParam{
  95. Id: cfg.NO,
  96. Time: tms,
  97. SumPower: calc.PowerRate.SumPower,
  98. MaxPower: calc.PowerRate.MaxPower,
  99. Count: calc.PowerRate.Count,
  100. Tps: calc.TotalEnergy.Tp,
  101. Tqs: calc.TotalEnergy.Tq,
  102. Fps: calc.TotalEnergy.Fp,
  103. Fqs: calc.TotalEnergy.Fq,
  104. Tpe: calc.DayTotalEnergy.Tp,
  105. Tqe: calc.DayTotalEnergy.Tq,
  106. Fpe: calc.DayTotalEnergy.Fp,
  107. Fqe: calc.DayTotalEnergy.Fq,
  108. }
  109. err := db.AddOrUpdate(calcEt)
  110. if err != nil {
  111. logger.Error("更新电表计算参数失败: %s", err.Error())
  112. }
  113. }
  114. }