package electric import ( iotStruct "IotAdmin/iot/struct" "encoding/json" ) type MeterElectric struct { MeterElectricBase MeterElectricRef `json:"-"` } type MeterElectricBase struct { Id string `json:"-"` //电表编码 Time int `json:"-"` //计算日期 PowerRate CalcPowerRate //负荷率 TotalEnergy CalcDataEnergy //总电能 DayTotalEnergy CalcDataEnergy //日总电能 isClean bool } type MeterElectricRef struct { PvRef float32 `json:"pvRef"` LvRef float32 `json:"lvRef"` } // CalcPowerRate 负荷率 type CalcPowerRate struct { SumPower float32 //有功功率总和 MaxPower float32 //最大有功功率 Count int //有功功率个数 } // CalcDataEnergy 电能 type CalcDataEnergy struct { Tp float32 Tq float32 Fp float32 Fq float32 } // CalcAndSetPowerRate 计算负荷率 func (m *MeterElectricBase) CalcAndSetPowerRate(data *iotStruct.CollectData) { m.PowerRate.Count++ m.PowerRate.SumPower += data.P if m.PowerRate.MaxPower < data.P { m.PowerRate.MaxPower = data.P } data.Pv = m.CalcRate() data.Logger.Debugf("[%s]计算负荷率:%f %v", data.SlaveConfig.No, data.Pv, m.PowerRate) } // CalcRate 计算负荷率 func (m *MeterElectricBase) CalcRate() float32 { pv := float32(0) if m.PowerRate.MaxPower > float32(0.0001) && m.PowerRate.Count > 0 { pv = m.PowerRate.SumPower / (float32(m.PowerRate.Count) * m.PowerRate.MaxPower) } return pv } // ClearDayEnergy 日总电能清零 func (m *MeterElectricBase) ClearDayEnergy() { m.DayTotalEnergy.Tp = 0 m.DayTotalEnergy.Tq = 0 m.DayTotalEnergy.Fp = 0 m.DayTotalEnergy.Fq = 0 m.PowerRate.Count = 0 m.PowerRate.MaxPower = 0 m.PowerRate.SumPower = 0 m.isClean = true } // CalcAndSetDayEnergy 计算并设置日电能 func (m *MeterElectricBase) CalcAndSetDayEnergy(data *iotStruct.CollectData) { if m.isClean { m.isClean = false data.Logger.Debugf("[%s]当日电表日电能第一次采集 电表地址: %d", data.SlaveConfig.No, data.SlaveConfig.Addr) return } m.DayTotalEnergy.Tp += data.Tps - m.TotalEnergy.Tp m.DayTotalEnergy.Tq += data.Tqs - m.TotalEnergy.Tq m.DayTotalEnergy.Fp += data.Fps - m.TotalEnergy.Fp m.DayTotalEnergy.Fq += data.Fqs - m.TotalEnergy.Fq data.Logger.Debugf("[%s]当日电表日电能 电表地址: %d tpe:%f tqe:%f fpe:%f fqe:%f", data.SlaveConfig.No, data.SlaveConfig.Addr, m.DayTotalEnergy.Tp, m.DayTotalEnergy.Tq, m.DayTotalEnergy.Fp, m.DayTotalEnergy.Fq) } // SetCalcTotalEnergy 设置总电能 func (m *MeterElectricBase) SetCalcTotalEnergy(data *iotStruct.CollectData) { m.TotalEnergy.Tp = data.Tps m.TotalEnergy.Tq = data.Tqs m.TotalEnergy.Fp = data.Fps m.TotalEnergy.Fq = data.Fqs } // CalcDiff 计算偏差 func (m *MeterElectricBase) CalcDiff(data *iotStruct.CollectData) { ref := &MeterElectricRef{} err := json.Unmarshal([]byte(data.SlaveConfig.OtherConfig), ref) if err != nil { data.Logger.Errorf("计算电表偏差失败, %s", err.Error()) return } data.Logger.Debugf("计算偏差:%v", ref) data.Fw = data.Freq - float32(50.0) data.Uaw = (data.Ua - ref.LvRef) * float32(100.0) / ref.LvRef data.Ubw = (data.Ub - ref.LvRef) * float32(100.0) / ref.LvRef data.Ucw = (data.Uc - ref.LvRef) * float32(100.0) / ref.LvRef data.Uabw = (data.Uab - ref.PvRef) * float32(100.0) / ref.PvRef data.Ubcw = (data.Ubc - ref.PvRef) * float32(100.0) / ref.PvRef data.Ucaw = (data.Uca - ref.PvRef) * float32(100.0) / ref.PvRef } // CalcMeterData 计算电表部分数据 func (m *MeterElectricBase) CalcMeterData(data *iotStruct.CollectData) { m.CalcDiff(data) m.CalcAndSetPowerRate(data) m.CalcAndSetDayEnergy(data) m.SetCalcTotalEnergy(data) data.Tpe = m.DayTotalEnergy.Tp data.Tqe = m.DayTotalEnergy.Tq data.Fpe = m.DayTotalEnergy.Fp data.Fqe = m.DayTotalEnergy.Fq } func (m *MeterElectricBase) GetMeterNo() string { return m.Id } func (m *MeterElectricBase) GetUpdateTime() int { return m.Time } func (m *MeterElectric) GetMeterData() interface{} { return m } func (m *MeterElectric) SetMeterData(data interface{}) { meter, ok := data.(MeterElectricBase) if ok { m.MeterElectricBase = meter } }