package downStreamService import ( "MeterService/core/logger" "MeterService/core/utils" "MeterService/data" "MeterService/dataStruct" "MeterService/database/meterCalcParam" "MeterService/service/downStreamService/proto/acrel" "MeterService/service/rtuService" "strconv" "time" ) func collectData(sn string, config *dataStruct.DtuConfig) []*dataStruct.CollectData { array := make([]*dataStruct.CollectData, 0) meterRef := &dataStruct.MeterRef{} logger.Info("【%s】开始采集数据 ", sn) logger.Debug("【%s】开始采集数据 %v", sn, config) if !config.Enable || config.Secs < 1 { return array } client, ok := data.DtuMapState.Get(sn) if !ok { logger.Error("采集数据失败,[%s]客户端不存在", sn) return array } if !client.Online { logger.Error("采集数据失败,[%s]客户端离线", sn) } for _, cfg := range config.Slave { if cfg.Addr < 1 || cfg.Addr > 254 { logger.Error("采集数据失败,[%s]客户端地址错误: %d", sn, cfg.Addr) continue } bAddr := utils.IntoByte(cfg.Addr) w := rtuService.NewRtuNetPgr(bAddr) w.SetClientState(client) w.SetSerialNumber(sn) meterRef.LvRef = 220 meterRef.PvRef = 380 if cfg.LvRef > 0 { meterRef.LvRef = cfg.LvRef } if cfg.PvRef > 0 { meterRef.PvRef = cfg.PvRef } var ( colData *dataStruct.CollectData err error ) switch cfg.MType { case "ADW300": colData, err = acrel.CollectADW300(w, meterRef) if err != nil { logger.Error("采集数据失败, [%s][%s]客户端采集数据错误: %s", sn, cfg.MType, err.Error()) continue } processCollectData(colData, cfg) array = append(array, colData) default: } } logger.Debug("采集数据完成【%s】 %v", sn, array) return array } func processCollectData(colData *dataStruct.CollectData, cfg *dataStruct.DtuSlave) { // 从机的配置需要保存到采集数据中,上报需要使用配置 colData.Slave = cfg // 计算电表数据 logger.Debug("计算电表数据: %s", cfg.NO) calc := &dataStruct.MeterCalcParam{} now := time.Now() today, _ := strconv.Atoi(now.Format("20060102")) tms := int64(today) if x, ok := data.CalcParam.Get(cfg.NO); ok { calc = x.(*dataStruct.MeterCalcParam) if calc.Time != tms { calc.ClearDayEnergy() } } else { calc.ClearDayEnergy() } // 计算电表数据 logger.Debug("[%s] 计算前: [%v]", cfg.NO, calc) colData.CalcWithParam(calc) calc.Time = tms logger.Debug("[%s] 计算完成: [%v]", cfg.NO, calc) // 更新电表计算参数 data.CalcParam.Add(cfg.NO, calc) db := meterCalcParam.NewMeterCalcParamDb() if db != nil { calcEt := &meterCalcParam.MeterCalcParam{ Id: cfg.NO, Time: tms, SumPower: calc.PowerRate.SumPower, MaxPower: calc.PowerRate.MaxPower, Count: calc.PowerRate.Count, Tps: calc.TotalEnergy.Tp, Tqs: calc.TotalEnergy.Tq, Fps: calc.TotalEnergy.Fp, Fqs: calc.TotalEnergy.Fq, Tpe: calc.DayTotalEnergy.Tp, Tqe: calc.DayTotalEnergy.Tq, Fpe: calc.DayTotalEnergy.Fp, Fqe: calc.DayTotalEnergy.Fq, } err := db.AddOrUpdate(calcEt) if err != nil { logger.Error("更新电表计算参数失败: %s", err.Error()) } } }