meter.go 3.6 KB

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