| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415 |
- package iotCollectProtocol
- import (
- "IotAdmin/core/tools/utils"
- iotInterface "IotAdmin/iot/interface"
- iotService "IotAdmin/iot/service/rtuService"
- iotStruct "IotAdmin/iot/struct"
- "IotAdmin/iot/struct/electric"
- "encoding/json"
- "fmt"
- "reflect"
- "runtime"
- )
- type adw300Meter struct {
- }
- func NewAdw300MeterHandler() iotInterface.MeterHandler {
- return &adw300Meter{}
- }
- var (
- adw300Collects = []iotStruct.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 iotService.RtuNetPgr, colData *iotStruct.CollectData) error {
- for _, v := range adw300Collects {
- if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil {
- colData.Logger.Errorf("ADW300 采集失败[%s] ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
- return err
- } else {
- colData.Logger.Infof("======》ADU:%v", adu)
- v.Method(adu, colData)
- }
- }
- return nil
- }
- // SetAddress 设置地址
- func (m *adw300Meter) SetAddress(w iotService.RtuNetPgr, addr int) (err error) {
- var buf []byte
- buf = append(buf, utils.HfWord2byte(addr)...)
- if _, err = w.SetHoldingRegs(0, 1, buf); err != nil {
- err = fmt.Errorf("ADW300 设置地址失败 ERROR:%v", err)
- return
- }
- return
- }
- // GetConfig 查询电表变比
- func (m *adw300Meter) GetConfig(w iotService.RtuNetPgr) (*map[string]interface{}, error) {
- if adu, err := w.GetHoldingRegs(0x0E, 2); err != nil {
- err = fmt.Errorf("ADW300 查询电表变比失败 ERROR:%v", err)
- return nil, err
- } else {
- cfg := &electric.MeterADW300Other{}
- index := 0
- m := int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
- cfg.PT = int(m)
- index += 2
- m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
- cfg.CT = int(m)
- mp, err := utils.ToMap(cfg)
- return &mp, err
- }
- }
- func (m *adw300Meter) VerifyConfig(data *string) (interface{}, error) {
- cfg := &electric.MeterADW300Other{}
- if err := json.Unmarshal([]byte(*data), cfg); err != nil {
- err = fmt.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败 ERROR:%v", err)
- return nil, err
- }
- return cfg, nil
- }
- // SetConfig 设置电表变比
- func (m *adw300Meter) SetConfig(w iotService.RtuNetPgr, data *string) error {
- c, err := m.VerifyConfig(data)
- if err != nil {
- return err
- }
- cfg := c.(*electric.MeterADW300Other)
- var buf []byte
- {
- k := utils.HfWord2byte(cfg.PT)
- buf = append(buf, k...)
- }
- {
- k := utils.HfWord2byte(cfg.CT)
- buf = append(buf, k...)
- }
- if _, err := w.SetHoldingRegs(0x0E, 2, buf); err != nil {
- err = fmt.Errorf("ADW300 设置电表变比失败 ERROR:%v", err)
- return err
- }
- return nil
- }
- func adw300A04C56(adu []byte, s *iotStruct.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
- }
- // 基波、谐波
- func adw300A12eC12(adu []byte, s *iotStruct.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 *iotStruct.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 *iotStruct.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 *iotStruct.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 *iotStruct.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)
- }
|