package acrel import ( "MeterService/core/logger" "MeterService/core/utils" "MeterService/dataStruct" "MeterService/service/downStreamService/proto" "MeterService/service/rtuService" "encoding/json" "reflect" "runtime" ) type adw300Meter struct { } func NewAdw300MeterHandler() proto.MeterHandler { return &adw300Meter{} } var ( adw300Collects = []dataStruct.ParsingDataConfig{ {Origin: 0x0E, Amount: 56, Method: adw300A04C56}, {Origin: 0x12E, Amount: 12, Method: adw300A12eC12}, {Origin: 0x7A, Amount: 60, Method: adw300A7aC60}, {Origin: 0xB6, Amount: 60, Method: adw300Ab6C60}, {Origin: 0xF2, Amount: 60, Method: adw300Af2C60}, {Origin: 0x15A, Amount: 13, Method: adw300A15aC13}, } ) // Collect 采集数据 func (m *adw300Meter) Collect(w rtuService.RtuNetPgr, ref *dataStruct.MeterRef) (*dataStruct.CollectData, error) { colData := &dataStruct.CollectData{ MeterRef: ref, } for _, v := range adw300Collects { if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil { logger.Error("ADW300 采集失败[%s] ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err) return colData, err } else { logger.Debug("======》ADU:%v", adu) v.Method(adu, colData) } } return colData, nil } // SetAddress 设置地址 func (m *adw300Meter) SetAddress(w rtuService.RtuNetPgr, addr int) (result bool) { var buf []byte buf = append(buf, utils.HfWord2byte(addr)...) if _, err := w.SetHoldingRegs(0, 1, buf); err != nil { logger.Error("ADW300 设置地址失败 ERROR:%v", err) result = false } else { result = true } return } // GetRatio 查询电表变比 func (m *adw300Meter) GetRatio(w rtuService.RtuNetPgr) (string, bool) { if adu, err := w.GetHoldingRegs(0x0E, 2); err != nil { logger.Error("ADW300 查询电表变比失败 ERROR:%v", err) return "", false } else { ratio := &dataStruct.MeterRatio{} index := 0 m := int16(uint16(adu[index])<<8 | uint16(adu[index+1])) ratio.Pt = int(m) index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) ratio.Ct = int(m) str, err := json.Marshal(ratio) if err != nil { logger.Error("ADW300 查询电表变比失败 ERROR:%v", err) return "", false } return string(str), true } } // SetRatio 设置电表变比 func (m *adw300Meter) SetRatio(w rtuService.RtuNetPgr, data string) bool { ratio := &dataStruct.MeterRatio{} if err := json.Unmarshal([]byte(data), ratio); err != nil { logger.Error("ADW300 设置电表变比失败,变比数据解析失败 ERROR:%v", err) return false } var buf []byte { k := utils.HfWord2byte(ratio.Pt) buf = append(buf, k...) } { k := utils.HfWord2byte(ratio.Ct) buf = append(buf, k...) } if _, err := w.SetHoldingRegs(0x0E, 2, buf); err != nil { logger.Error("ADW300 设置电表变比失败 ERROR:%v", err) return false } return true } func adw300A04C56(adu []byte, s *dataStruct.CollectData) { var ( index = 0 m int16 u int32 ) // 电压变比 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.PT = int(m) // 电流变比 index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.CT = int(m) index += 2 //N相温度 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.TemperatureZ = float32(m) * float32(0.1) index += 2 index += 6 //A相电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ua = float32(m) * float32(0.1) * float32(s.PT) index += 2 //B相电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ub = float32(m) * float32(0.1) * float32(s.PT) index += 2 //C相电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Uc = float32(m) * float32(0.1) * float32(s.PT) index += 2 //AB线电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Uab = float32(m) * float32(0.1) * float32(s.PT) index += 2 //BC线电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ubc = float32(m) * float32(0.1) * float32(s.PT) index += 2 //CA相电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Uca = float32(m) * float32(0.1) * float32(s.PT) index += 2 //A相电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ia = float32(m) * float32(0.01) * float32(s.CT) index += 2 //B相电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ib = float32(m) * float32(0.01) * float32(s.CT) index += 2 //C相电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Ic = float32(m) * float32(0.01) * float32(s.CT) index += 2 //三相电流矢量和 index += 2 //A相有功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Pa = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //B相有功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Pb = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //C相有功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Pc = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //总有功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.P = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //A相无功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Qa = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //B相无功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Qb = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //C相无功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Qc = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //总无功功率 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Q = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT) index += 4 //A相视在功率 index += 4 //B相视在功率 index += 4 //C相视在功率 index += 4 //总视在功率 index += 4 //A相功率因数 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Pfa = float32(m) * float32(0.001) index += 2 //B相功率因数 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Pfb = float32(m) * float32(0.001) index += 2 //C相功率因数 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Pfc = float32(m) * float32(0.001) index += 2 //总功率因数 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Pf = float32(m) * float32(0.001) index += 2 //DI index += 2 //频率 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Freq = float32(m) * float32(0.01) index += 2 //组合有功总电能 index += 4 //正向有功电能 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Tps = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT) index += 4 //反向有功电能 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Fps = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT) index += 4 //正向无功电能 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Tqs = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT) index += 4 //反向无功电能 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) s.Fqs = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT) //index += 4 s.CalcDiff() } // 基波、谐波 func adw300A12eC12(adu []byte, s *dataStruct.CollectData) { var ( index = 0 m int16 ) //A相基波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseUa = float32(m) * float32(0.1) * float32(s.PT) index += 2 //B相基波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseUb = float32(m) * float32(0.1) * float32(s.PT) index += 2 //C相基波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseUc = float32(m) * float32(0.1) * float32(s.PT) index += 2 //A相谐波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarUa = float32(m) * float32(0.1) * float32(s.PT) index += 2 //B相谐波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarUb = float32(m) * float32(0.1) * float32(s.PT) index += 2 //C相谐波电压 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarUc = float32(m) * float32(0.1) * float32(s.PT) index += 2 //A相基波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseIa = float32(m) * float32(0.01) * float32(s.CT) index += 2 //B相基波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseIb = float32(m) * float32(0.01) * float32(s.CT) index += 2 //C相基波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.BaseIc = float32(m) * float32(0.01) * float32(s.CT) index += 2 //A相谐波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarIa = float32(m) * float32(0.1) * float32(s.CT) index += 2 //B相谐波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarIb = float32(m) * float32(0.1) * float32(s.CT) index += 2 //C相谐波电流 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.HarIc = float32(m) * float32(0.1) * float32(s.CT) } // 0x7A,60 // A相电压分次谐波(2-31次) // B相电压分次谐波(2-31次) func adw300A7aC60(adu []byte, s *dataStruct.CollectData) { var ( index = 2 m int16 ) //A相电压分次谐波(2-31次) for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Hua[i] = float32(m) * float32(0.01) index += 4 } //B相电压分次谐波(2-31次) index = 2*30 + 2 for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Hub[i] = float32(m) * float32(0.01) index += 4 } } // 0xB6,60 // C相电压分次谐波(2-31次) // A相电流分次谐波(2-31次) func adw300Ab6C60(adu []byte, s *dataStruct.CollectData) { var ( index = 2 m int16 ) //C相电压分次谐波(2-31次) for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Huc[i] = float32(m) * float32(0.01) index += 4 } //A相电流分次谐波(2-31次) index = 2*30 + 2 for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Hia[i] = float32(m) * float32(0.01) index += 4 } } // 0xF2,60 // B相电流分次谐波(2-31次) // C相电流分次谐波(2-31次) func adw300Af2C60(adu []byte, s *dataStruct.CollectData) { var ( index = 2 m int16 ) //index = 2 for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Hub[i] = float32(m) * float32(0.01) index += 4 } //C相电流分次谐波(2-31次) index = 2*30 + 2 for i := 0; i < 15; i++ { m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) s.Hic[i] = float32(m) * float32(0.01) index += 4 } } func adw300A15aC13(adu []byte, data *dataStruct.CollectData) { var ( index = 0 m int16 u int32 ) //当前正向有功需量 u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])) data.Dp = float32(u) * float32(0.001) * float32(data.CT) * float32(data.PT) //当前反向有功需量 index += 4 //当前正向无功需量 index += 4 //当前反向无功需量 index += 4 //电压不平衡度 index += 4 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) data.UUnbalance = float32(m) * float32(0.01) //电流不平衡度 index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) data.IUnbalance = float32(m) * float32(0.01) //A相温度 index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) data.TemperatureA = float32(m) * float32(0.1) //B相温度 index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) data.TemperatureB = float32(m) * float32(0.1) //C相温度 index += 2 m = int16(uint16(adu[index])<<8 | uint16(adu[index+1])) data.TemperatureC = float32(m) * float32(0.1) }