ycHj212.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package report
  2. import (
  3. "MeterService/core/logger"
  4. "MeterService/data"
  5. "MeterService/dataStruct"
  6. "MeterService/database/meterCalcParam"
  7. "MeterService/service/downStreamService/proto"
  8. "MeterService/service/reportService"
  9. "fmt"
  10. "strconv"
  11. "time"
  12. )
  13. type ycHj212 struct {
  14. }
  15. func NewYcHj212ReportHandler() proto.ReportHandler {
  16. return &ycHj212{}
  17. }
  18. func (*ycHj212) Adapter(colDataArray *[]*dataStruct.CollectData) {
  19. for _, colData := range *colDataArray {
  20. processData(colData)
  21. }
  22. }
  23. func processData(colData *dataStruct.CollectData) {
  24. // 从机的配置需要保存到采集数据中,上报需要使用配置
  25. cfg := colData.Slave
  26. // 计算电表数据
  27. logger.Debug("计算电表数据: %s", cfg.NO)
  28. calc := &dataStruct.MeterCalcParam{}
  29. now := time.Now()
  30. today, _ := strconv.Atoi(now.Format("20060102"))
  31. tms := int64(today)
  32. if x, ok := data.CalcParam.Get(cfg.NO); ok {
  33. calc = x.(*dataStruct.MeterCalcParam)
  34. //logger.Debug("[%s][%d] 查询到电表计算参数: [%v]", cfg.NO, today, calc)
  35. if calc.Time != tms {
  36. calc.ClearDayEnergy()
  37. }
  38. } else {
  39. logger.Debug("[%s][%d] 没有查询到电表计算参数。", cfg.NO, today)
  40. calc.ClearDayEnergy()
  41. }
  42. // 计算电表数据
  43. logger.Debug("[%d]计算前: [%v]", today, *calc)
  44. calc.Time = tms
  45. colData.CalcWithParam(calc)
  46. logger.Debug("[%d]计算后: [%v]", today, *calc)
  47. // 更新电表计算参数
  48. data.CalcParam.Add(cfg.NO, calc)
  49. db := meterCalcParam.NewMeterCalcParamDb()
  50. if db != nil {
  51. calcEt := &meterCalcParam.MeterCalcParam{
  52. Id: cfg.NO,
  53. Time: tms,
  54. SumPower: calc.PowerRate.SumPower,
  55. MaxPower: calc.PowerRate.MaxPower,
  56. Count: calc.PowerRate.Count,
  57. Tps: calc.TotalEnergy.Tp,
  58. Tqs: calc.TotalEnergy.Tq,
  59. Fps: calc.TotalEnergy.Fp,
  60. Fqs: calc.TotalEnergy.Fq,
  61. Tpe: calc.DayTotalEnergy.Tp,
  62. Tqe: calc.DayTotalEnergy.Tq,
  63. Fpe: calc.DayTotalEnergy.Fp,
  64. Fqe: calc.DayTotalEnergy.Fq,
  65. }
  66. err := db.AddOrUpdate(calcEt)
  67. if err != nil {
  68. logger.Error("更新电表计算参数失败: %s", err.Error())
  69. }
  70. }
  71. }
  72. func (*ycHj212) Report(dataArray *[]*dataStruct.CollectData, config *dataStruct.DtuConfig) {
  73. bs := &dataStruct.HJBaseInfo{
  74. Host: config.IP,
  75. ST: config.St,
  76. CN: config.Cn,
  77. PW: config.Pw,
  78. MN: config.Mn,
  79. Port: strconv.Itoa(config.Port),
  80. }
  81. if strArray, ok := packYcHj212(bs, dataArray); ok {
  82. for _, str := range strArray {
  83. if receive, err := reportService.UpToServer(bs.Host, bs.Port, str); err != nil {
  84. logger.Error("[%s:%s]上报数据失败: [ %s ] %s", bs.Host, bs.Port, str, err.Error())
  85. } else {
  86. logger.Debug("上报数据 SEND -> %s", str)
  87. logger.Info("上报数据 RECE <- %s", receive)
  88. }
  89. }
  90. }
  91. }
  92. func packYcHj212(bs *dataStruct.HJBaseInfo, dataArray *[]*dataStruct.CollectData) ([]string, bool) {
  93. array := make([]string, 0)
  94. if len(*dataArray) == 0 {
  95. return array, false
  96. }
  97. now := time.Now()
  98. nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())
  99. for _, d := range *dataArray {
  100. body := fmt.Sprintf("%s=%s", d.Slave.GetBmYzKey("p"), getBmYzFloatValue(d.P)) +
  101. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) +
  102. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) +
  103. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) +
  104. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) +
  105. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) +
  106. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) +
  107. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) +
  108. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) +
  109. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) +
  110. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) +
  111. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) +
  112. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) +
  113. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) +
  114. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) +
  115. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) +
  116. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) +
  117. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) +
  118. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) +
  119. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) +
  120. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) +
  121. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) +
  122. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) +
  123. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) +
  124. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) +
  125. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) +
  126. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) +
  127. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) +
  128. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) +
  129. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) +
  130. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) +
  131. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) +
  132. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) +
  133. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) +
  134. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) +
  135. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) +
  136. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) +
  137. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) +
  138. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) +
  139. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) +
  140. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) +
  141. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) +
  142. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) +
  143. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) +
  144. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) +
  145. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) +
  146. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) +
  147. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) +
  148. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) +
  149. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) +
  150. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) +
  151. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei"))
  152. cn := bs.CN
  153. if d.Slave.Cn != "" {
  154. cn = d.Slave.Cn
  155. }
  156. str := fmt.Sprintf("st=%s;cn=%s;datatime=%s;cphh=&&tid=%s&%s&", bs.ST, cn, nt, d.Slave.NO, body)
  157. crc16 := calCRC16HJ212([]byte(str))
  158. str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n"
  159. array = append(array, str1)
  160. }
  161. return array, true
  162. }
  163. func packYcHj212Hx(val [15]float32, hall, base float32, baseStr string) string {
  164. ret := ""
  165. for i, v := range val {
  166. ret += fmt.Sprintf("h%d:%s,", i*2+1, getBmYzFloatValue(v))
  167. }
  168. ret += fmt.Sprintf("hall:%s,%s:%s", getBmYzFloatValue(hall), baseStr, getBmYzFloatValue(base))
  169. return ret
  170. }
  171. func getBmYzFloatValue(value float32) string {
  172. return strconv.FormatFloat(float64(value), 'f', 3, 32)
  173. }
  174. // HJ212 计算crc
  175. func calCRC16HJ212(data []byte) uint16 {
  176. var (
  177. crc uint16 = 0xFFFF
  178. iNum uint16 = 0
  179. )
  180. length := len(data)
  181. for i := 0; i < length; i++ {
  182. iNum = uint16(data[i])
  183. crc = (crc >> 8) & 0x00FF
  184. crc = crc ^ iNum
  185. for j := 0; j < 8; j++ {
  186. flag := crc % 2
  187. crc = crc >> 1
  188. if flag == 1 {
  189. crc = crc ^ 0xA001
  190. }
  191. }
  192. }
  193. return crc
  194. }