| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- 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
- }
- }
|