meter.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package electric
  2. import (
  3. iotStruct "IotAdmin/iot/struct"
  4. "encoding/json"
  5. )
  6. type MeterElectric struct {
  7. MeterElectricBase
  8. MeterElectricRef `json:"-"`
  9. }
  10. type MeterElectricBase struct {
  11. Id string `json:"-"` //电表编码
  12. Time int `json:"-"` //计算日期
  13. PowerRate CalcPowerRate //负荷率
  14. TotalEnergy CalcDataEnergy //总电能
  15. DayTotalEnergy CalcDataEnergy //日总电能
  16. isClean bool
  17. }
  18. type MeterElectricRef struct {
  19. PvRef float32 `json:"pvRef"`
  20. LvRef float32 `json:"lvRef"`
  21. }
  22. // CalcPowerRate 负荷率
  23. type CalcPowerRate struct {
  24. SumPower float32 //有功功率总和
  25. MaxPower float32 //最大有功功率
  26. Count int //有功功率个数
  27. }
  28. // CalcDataEnergy 电能
  29. type CalcDataEnergy struct {
  30. Tp float32
  31. Tq float32
  32. Fp float32
  33. Fq float32
  34. }
  35. // CalcAndSetPowerRate 计算负荷率
  36. func (m *MeterElectricBase) CalcAndSetPowerRate(data *iotStruct.CollectData) {
  37. m.PowerRate.Count++
  38. m.PowerRate.SumPower += data.P
  39. if m.PowerRate.MaxPower < data.P {
  40. m.PowerRate.MaxPower = data.P
  41. }
  42. data.Pv = m.CalcRate()
  43. data.Logger.Debugf("[%s]计算负荷率:%f %v", data.SlaveConfig.No, data.Pv, m.PowerRate)
  44. }
  45. // CalcRate 计算负荷率
  46. func (m *MeterElectricBase) CalcRate() float32 {
  47. pv := float32(0)
  48. if m.PowerRate.MaxPower > float32(0.0001) && m.PowerRate.Count > 0 {
  49. pv = m.PowerRate.SumPower / (float32(m.PowerRate.Count) * m.PowerRate.MaxPower)
  50. }
  51. return pv
  52. }
  53. // ClearDayEnergy 日总电能清零
  54. func (m *MeterElectricBase) ClearDayEnergy() {
  55. m.DayTotalEnergy.Tp = 0
  56. m.DayTotalEnergy.Tq = 0
  57. m.DayTotalEnergy.Fp = 0
  58. m.DayTotalEnergy.Fq = 0
  59. m.PowerRate.Count = 0
  60. m.PowerRate.MaxPower = 0
  61. m.PowerRate.SumPower = 0
  62. m.isClean = true
  63. }
  64. // CalcAndSetDayEnergy 计算并设置日电能
  65. func (m *MeterElectricBase) CalcAndSetDayEnergy(data *iotStruct.CollectData) {
  66. if m.isClean {
  67. m.isClean = false
  68. data.Logger.Debugf("[%s]当日电表日电能第一次采集 电表地址: %d", data.SlaveConfig.No, data.SlaveConfig.Addr)
  69. return
  70. }
  71. m.DayTotalEnergy.Tp += data.Tps - m.TotalEnergy.Tp
  72. m.DayTotalEnergy.Tq += data.Tqs - m.TotalEnergy.Tq
  73. m.DayTotalEnergy.Fp += data.Fps - m.TotalEnergy.Fp
  74. m.DayTotalEnergy.Fq += data.Fqs - m.TotalEnergy.Fq
  75. 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)
  76. }
  77. // SetCalcTotalEnergy 设置总电能
  78. func (m *MeterElectricBase) SetCalcTotalEnergy(data *iotStruct.CollectData) {
  79. m.TotalEnergy.Tp = data.Tps
  80. m.TotalEnergy.Tq = data.Tqs
  81. m.TotalEnergy.Fp = data.Fps
  82. m.TotalEnergy.Fq = data.Fqs
  83. }
  84. // CalcDiff 计算偏差
  85. func (m *MeterElectricBase) CalcDiff(data *iotStruct.CollectData) {
  86. ref := &MeterElectricRef{}
  87. err := json.Unmarshal([]byte(data.SlaveConfig.OtherConfig), ref)
  88. if err != nil {
  89. data.Logger.Errorf("计算电表偏差失败, %s", err.Error())
  90. return
  91. }
  92. data.Logger.Debugf("计算偏差:%v", ref)
  93. data.Fw = data.Freq - float32(50.0)
  94. data.Uaw = (data.Ua - ref.LvRef) * float32(100.0) / ref.LvRef
  95. data.Ubw = (data.Ub - ref.LvRef) * float32(100.0) / ref.LvRef
  96. data.Ucw = (data.Uc - ref.LvRef) * float32(100.0) / ref.LvRef
  97. data.Uabw = (data.Uab - ref.PvRef) * float32(100.0) / ref.PvRef
  98. data.Ubcw = (data.Ubc - ref.PvRef) * float32(100.0) / ref.PvRef
  99. data.Ucaw = (data.Uca - ref.PvRef) * float32(100.0) / ref.PvRef
  100. }
  101. // CalcMeterData 计算电表部分数据
  102. func (m *MeterElectricBase) CalcMeterData(data *iotStruct.CollectData, today int) {
  103. if m.Time != today {
  104. m.Time = today
  105. m.ClearDayEnergy()
  106. }
  107. m.CalcDiff(data)
  108. m.CalcAndSetPowerRate(data)
  109. m.CalcAndSetDayEnergy(data)
  110. m.SetCalcTotalEnergy(data)
  111. data.Tpe = m.DayTotalEnergy.Tp
  112. data.Tqe = m.DayTotalEnergy.Tq
  113. data.Fpe = m.DayTotalEnergy.Fp
  114. data.Fqe = m.DayTotalEnergy.Fq
  115. }
  116. func (m *MeterElectricBase) GetMeterNo() string {
  117. return m.Id
  118. }
  119. func (m *MeterElectricBase) GetUpdateTime() int {
  120. return m.Time
  121. }
  122. func (m *MeterElectric) GetMeterData() interface{} {
  123. return m
  124. }
  125. func (m *MeterElectric) SetMeterData(data interface{}) {
  126. meter, ok := data.(MeterElectricBase)
  127. if ok {
  128. m.MeterElectricBase = meter
  129. }
  130. }