collect.go 3.2 KB

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