| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package report
- import (
- "MeterService/core/logger"
- "MeterService/data"
- "MeterService/dataStruct"
- "MeterService/database/meterCalcParam"
- "MeterService/service/downStreamService/proto"
- "MeterService/service/reportService"
- "fmt"
- "strconv"
- "time"
- )
- type ycHj212 struct {
- }
- func NewYcHj212ReportHandler() proto.ReportHandler {
- return &ycHj212{}
- }
- func (*ycHj212) Adapter(colDataArray *[]*dataStruct.CollectData) {
- for _, colData := range *colDataArray {
- processData(colData)
- }
- }
- func processData(colData *dataStruct.CollectData) {
- // 从机的配置需要保存到采集数据中,上报需要使用配置
- cfg := colData.Slave
- // 计算电表数据
- logger.Debug("计算电表数据: %s", cfg.NO)
- calc := &dataStruct.MeterCalcParam{}
- now := time.Now()
- today, _ := strconv.Atoi(now.Format("20060102"))
- tms := int64(today)
- if x, ok := data.CalcParam.Get(cfg.NO); ok {
- calc = x.(*dataStruct.MeterCalcParam)
- //logger.Debug("[%s][%d] 查询到电表计算参数: [%v]", cfg.NO, today, calc)
- if calc.Time != tms {
- calc.ClearDayEnergy()
- }
- } else {
- logger.Debug("[%s][%d] 没有查询到电表计算参数。", cfg.NO, today)
- calc.ClearDayEnergy()
- }
- // 计算电表数据
- logger.Debug("[%d]计算前: [%v]", today, *calc)
- calc.Time = tms
- colData.CalcWithParam(calc)
- logger.Debug("[%d]计算后: [%v]", today, *calc)
- // 更新电表计算参数
- data.CalcParam.Add(cfg.NO, calc)
- db := meterCalcParam.NewMeterCalcParamDb()
- if db != nil {
- calcEt := &meterCalcParam.MeterCalcParam{
- Id: cfg.NO,
- Time: tms,
- SumPower: calc.PowerRate.SumPower,
- MaxPower: calc.PowerRate.MaxPower,
- Count: calc.PowerRate.Count,
- Tps: calc.TotalEnergy.Tp,
- Tqs: calc.TotalEnergy.Tq,
- Fps: calc.TotalEnergy.Fp,
- Fqs: calc.TotalEnergy.Fq,
- Tpe: calc.DayTotalEnergy.Tp,
- Tqe: calc.DayTotalEnergy.Tq,
- Fpe: calc.DayTotalEnergy.Fp,
- Fqe: calc.DayTotalEnergy.Fq,
- }
- err := db.AddOrUpdate(calcEt)
- if err != nil {
- logger.Error("更新电表计算参数失败: %s", err.Error())
- }
- }
- }
- func (*ycHj212) Report(dataArray *[]*dataStruct.CollectData, config *dataStruct.DtuConfig) {
- bs := &dataStruct.HJBaseInfo{
- Host: config.IP,
- ST: config.St,
- CN: config.Cn,
- PW: config.Pw,
- MN: config.Mn,
- Port: strconv.Itoa(config.Port),
- }
- if strArray, ok := packYcHj212(bs, dataArray); ok {
- for _, str := range strArray {
- if receive, err := reportService.UpToServer(bs.Host, bs.Port, str); err != nil {
- logger.Error("[%s:%s]上报数据失败: [ %s ] %s", bs.Host, bs.Port, str, err.Error())
- } else {
- logger.Debug("上报数据 SEND -> %s", str)
- logger.Info("上报数据 RECE <- %s", receive)
- }
- }
- }
- }
- func packYcHj212(bs *dataStruct.HJBaseInfo, dataArray *[]*dataStruct.CollectData) ([]string, bool) {
- array := make([]string, 0)
- if len(*dataArray) == 0 {
- return array, false
- }
- now := time.Now()
- nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())
- for _, d := range *dataArray {
- body := fmt.Sprintf("%s=%s", d.Slave.GetBmYzKey("p"), getBmYzFloatValue(d.P)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) +
- fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei"))
- cn := bs.CN
- if d.Slave.Cn != "" {
- cn = d.Slave.Cn
- }
- str := fmt.Sprintf("st=%s;cn=%s;datatime=%s;cphh=&&tid=%s&%s&", bs.ST, cn, nt, d.Slave.NO, body)
- crc16 := calCRC16HJ212([]byte(str))
- str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n"
- array = append(array, str1)
- }
- return array, true
- }
- func packYcHj212Hx(val [15]float32, hall, base float32, baseStr string) string {
- ret := ""
- for i, v := range val {
- ret += fmt.Sprintf("h%d:%s,", i*2+1, getBmYzFloatValue(v))
- }
- ret += fmt.Sprintf("hall:%s,%s:%s", getBmYzFloatValue(hall), baseStr, getBmYzFloatValue(base))
- return ret
- }
- func getBmYzFloatValue(value float32) string {
- return strconv.FormatFloat(float64(value), 'f', 3, 32)
- }
- // HJ212 计算crc
- func calCRC16HJ212(data []byte) uint16 {
- var (
- crc uint16 = 0xFFFF
- iNum uint16 = 0
- )
- length := len(data)
- for i := 0; i < length; i++ {
- iNum = uint16(data[i])
- crc = (crc >> 8) & 0x00FF
- crc = crc ^ iNum
- for j := 0; j < 8; j++ {
- flag := crc % 2
- crc = crc >> 1
- if flag == 1 {
- crc = crc ^ 0xA001
- }
- }
- }
- return crc
- }
|