el-adw300.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. package iotCollectProtocol
  2. import (
  3. "IotAdmin/core/tools/utils"
  4. iotInterface "IotAdmin/iot/interface"
  5. iotService "IotAdmin/iot/service/rtuService"
  6. iotStruct "IotAdmin/iot/struct"
  7. "IotAdmin/iot/struct/electric"
  8. "encoding/json"
  9. "fmt"
  10. "reflect"
  11. "runtime"
  12. )
  13. type adw300Meter struct {
  14. }
  15. func NewAdw300MeterHandler() iotInterface.MeterHandler {
  16. return &adw300Meter{}
  17. }
  18. var (
  19. adw300Collects = []iotStruct.ParsingDataConfig{
  20. {Origin: 0x0E, Amount: 56, Method: adw300A04C56},
  21. {Origin: 0x12E, Amount: 12, Method: adw300A12eC12},
  22. {Origin: 0x7A, Amount: 60, Method: adw300A7aC60},
  23. {Origin: 0xB6, Amount: 60, Method: adw300Ab6C60},
  24. {Origin: 0xF2, Amount: 60, Method: adw300Af2C60},
  25. {Origin: 0x15A, Amount: 13, Method: adw300A15aC13},
  26. }
  27. )
  28. // Collect 采集数据
  29. func (m *adw300Meter) Collect(w iotService.RtuNetPgr, colData *iotStruct.CollectData) error {
  30. for _, v := range adw300Collects {
  31. if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil {
  32. colData.Logger.Errorf("ADW300 采集失败[%s] ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
  33. return err
  34. } else {
  35. colData.Logger.Infof("======》ADU:%v", adu)
  36. v.Method(adu, colData)
  37. }
  38. }
  39. return nil
  40. }
  41. // SetAddress 设置地址
  42. func (m *adw300Meter) SetAddress(w iotService.RtuNetPgr, addr int) (err error) {
  43. var buf []byte
  44. buf = append(buf, utils.HfWord2byte(addr)...)
  45. if _, err = w.SetHoldingRegs(0, 1, buf); err != nil {
  46. err = fmt.Errorf("ADW300 设置地址失败 ERROR:%v", err)
  47. return
  48. }
  49. return
  50. }
  51. // GetConfig 查询电表变比
  52. func (m *adw300Meter) GetConfig(w iotService.RtuNetPgr) (*map[string]interface{}, error) {
  53. if adu, err := w.GetHoldingRegs(0x0E, 2); err != nil {
  54. err = fmt.Errorf("ADW300 查询电表变比失败 ERROR:%v", err)
  55. return nil, err
  56. } else {
  57. cfg := &electric.MeterADW300Other{}
  58. index := 0
  59. m := int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  60. cfg.PT = int(m)
  61. index += 2
  62. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  63. cfg.CT = int(m)
  64. mp, err := utils.ToMap(cfg)
  65. return &mp, err
  66. }
  67. }
  68. func (m *adw300Meter) VerifyConfig(data *string) (interface{}, error) {
  69. cfg := &electric.MeterADW300Other{}
  70. if err := json.Unmarshal([]byte(*data), cfg); err != nil {
  71. err = fmt.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败 ERROR:%v", err)
  72. return nil, err
  73. }
  74. return cfg, nil
  75. }
  76. // SetConfig 设置电表变比
  77. func (m *adw300Meter) SetConfig(w iotService.RtuNetPgr, data *string) error {
  78. c, err := m.VerifyConfig(data)
  79. if err != nil {
  80. return err
  81. }
  82. cfg := c.(*electric.MeterADW300Other)
  83. var buf []byte
  84. {
  85. k := utils.HfWord2byte(cfg.PT)
  86. buf = append(buf, k...)
  87. }
  88. {
  89. k := utils.HfWord2byte(cfg.CT)
  90. buf = append(buf, k...)
  91. }
  92. if _, err := w.SetHoldingRegs(0x0E, 2, buf); err != nil {
  93. err = fmt.Errorf("ADW300 设置电表变比失败 ERROR:%v", err)
  94. return err
  95. }
  96. return nil
  97. }
  98. func adw300A04C56(adu []byte, s *iotStruct.CollectData) {
  99. var (
  100. index = 0
  101. m int16
  102. u int32
  103. )
  104. // 电压变比
  105. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  106. s.PT = int(m)
  107. // 电流变比
  108. index += 2
  109. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  110. s.CT = int(m)
  111. index += 2
  112. //N相温度
  113. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  114. s.TemperatureZ = float32(m) * float32(0.1)
  115. index += 2
  116. index += 6
  117. //A相电压
  118. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  119. s.Ua = float32(m) * float32(0.1) * float32(s.PT)
  120. index += 2
  121. //B相电压
  122. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  123. s.Ub = float32(m) * float32(0.1) * float32(s.PT)
  124. index += 2
  125. //C相电压
  126. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  127. s.Uc = float32(m) * float32(0.1) * float32(s.PT)
  128. index += 2
  129. //AB线电压
  130. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  131. s.Uab = float32(m) * float32(0.1) * float32(s.PT)
  132. index += 2
  133. //BC线电压
  134. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  135. s.Ubc = float32(m) * float32(0.1) * float32(s.PT)
  136. index += 2
  137. //CA相电压
  138. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  139. s.Uca = float32(m) * float32(0.1) * float32(s.PT)
  140. index += 2
  141. //A相电流
  142. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  143. s.Ia = float32(m) * float32(0.01) * float32(s.CT)
  144. index += 2
  145. //B相电流
  146. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  147. s.Ib = float32(m) * float32(0.01) * float32(s.CT)
  148. index += 2
  149. //C相电流
  150. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  151. s.Ic = float32(m) * float32(0.01) * float32(s.CT)
  152. index += 2
  153. //三相电流矢量和
  154. index += 2
  155. //A相有功功率
  156. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  157. s.Pa = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  158. index += 4
  159. //B相有功功率
  160. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  161. s.Pb = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  162. index += 4
  163. //C相有功功率
  164. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  165. s.Pc = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  166. index += 4
  167. //总有功功率
  168. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  169. s.P = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  170. index += 4
  171. //A相无功功率
  172. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  173. s.Qa = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  174. index += 4
  175. //B相无功功率
  176. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  177. s.Qb = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  178. index += 4
  179. //C相无功功率
  180. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  181. s.Qc = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  182. index += 4
  183. //总无功功率
  184. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  185. s.Q = float32(u) * float32(0.001) * float32(s.CT) * float32(s.PT)
  186. index += 4
  187. //A相视在功率
  188. index += 4
  189. //B相视在功率
  190. index += 4
  191. //C相视在功率
  192. index += 4
  193. //总视在功率
  194. index += 4
  195. //A相功率因数
  196. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  197. s.Pfa = float32(m) * float32(0.001)
  198. index += 2
  199. //B相功率因数
  200. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  201. s.Pfb = float32(m) * float32(0.001)
  202. index += 2
  203. //C相功率因数
  204. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  205. s.Pfc = float32(m) * float32(0.001)
  206. index += 2
  207. //总功率因数
  208. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  209. s.Pf = float32(m) * float32(0.001)
  210. index += 2
  211. //DI
  212. index += 2
  213. //频率
  214. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  215. s.Freq = float32(m) * float32(0.01)
  216. index += 2
  217. //组合有功总电能
  218. index += 4
  219. //正向有功电能
  220. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  221. s.Tps = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT)
  222. index += 4
  223. //反向有功电能
  224. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  225. s.Fps = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT)
  226. index += 4
  227. //正向无功电能
  228. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  229. s.Tqs = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT)
  230. index += 4
  231. //反向无功电能
  232. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  233. s.Fqs = float32(u) * float32(0.01) * float32(s.CT) * float32(s.PT)
  234. //index += 4
  235. }
  236. // 基波、谐波
  237. func adw300A12eC12(adu []byte, s *iotStruct.CollectData) {
  238. var (
  239. index = 0
  240. m int16
  241. )
  242. //A相基波电压
  243. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  244. s.BaseUa = float32(m) * float32(0.1) * float32(s.PT)
  245. index += 2
  246. //B相基波电压
  247. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  248. s.BaseUb = float32(m) * float32(0.1) * float32(s.PT)
  249. index += 2
  250. //C相基波电压
  251. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  252. s.BaseUc = float32(m) * float32(0.1) * float32(s.PT)
  253. index += 2
  254. //A相谐波电压
  255. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  256. s.HarUa = float32(m) * float32(0.1) * float32(s.PT)
  257. index += 2
  258. //B相谐波电压
  259. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  260. s.HarUb = float32(m) * float32(0.1) * float32(s.PT)
  261. index += 2
  262. //C相谐波电压
  263. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  264. s.HarUc = float32(m) * float32(0.1) * float32(s.PT)
  265. index += 2
  266. //A相基波电流
  267. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  268. s.BaseIa = float32(m) * float32(0.01) * float32(s.CT)
  269. index += 2
  270. //B相基波电流
  271. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  272. s.BaseIb = float32(m) * float32(0.01) * float32(s.CT)
  273. index += 2
  274. //C相基波电流
  275. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  276. s.BaseIc = float32(m) * float32(0.01) * float32(s.CT)
  277. index += 2
  278. //A相谐波电流
  279. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  280. s.HarIa = float32(m) * float32(0.1) * float32(s.CT)
  281. index += 2
  282. //B相谐波电流
  283. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  284. s.HarIb = float32(m) * float32(0.1) * float32(s.CT)
  285. index += 2
  286. //C相谐波电流
  287. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  288. s.HarIc = float32(m) * float32(0.1) * float32(s.CT)
  289. }
  290. // 0x7A,60
  291. // A相电压分次谐波(2-31次)
  292. // B相电压分次谐波(2-31次)
  293. func adw300A7aC60(adu []byte, s *iotStruct.CollectData) {
  294. var (
  295. index = 2
  296. m int16
  297. )
  298. //A相电压分次谐波(2-31次)
  299. for i := 0; i < 15; i++ {
  300. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  301. s.Hua[i] = float32(m) * float32(0.01)
  302. index += 4
  303. }
  304. //B相电压分次谐波(2-31次)
  305. index = 2*30 + 2
  306. for i := 0; i < 15; i++ {
  307. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  308. s.Hub[i] = float32(m) * float32(0.01)
  309. index += 4
  310. }
  311. }
  312. // 0xB6,60
  313. // C相电压分次谐波(2-31次)
  314. // A相电流分次谐波(2-31次)
  315. func adw300Ab6C60(adu []byte, s *iotStruct.CollectData) {
  316. var (
  317. index = 2
  318. m int16
  319. )
  320. //C相电压分次谐波(2-31次)
  321. for i := 0; i < 15; i++ {
  322. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  323. s.Huc[i] = float32(m) * float32(0.01)
  324. index += 4
  325. }
  326. //A相电流分次谐波(2-31次)
  327. index = 2*30 + 2
  328. for i := 0; i < 15; i++ {
  329. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  330. s.Hia[i] = float32(m) * float32(0.01)
  331. index += 4
  332. }
  333. }
  334. // 0xF2,60
  335. // B相电流分次谐波(2-31次)
  336. // C相电流分次谐波(2-31次)
  337. func adw300Af2C60(adu []byte, s *iotStruct.CollectData) {
  338. var (
  339. index = 2
  340. m int16
  341. )
  342. //index = 2
  343. for i := 0; i < 15; i++ {
  344. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  345. s.Hub[i] = float32(m) * float32(0.01)
  346. index += 4
  347. }
  348. //C相电流分次谐波(2-31次)
  349. index = 2*30 + 2
  350. for i := 0; i < 15; i++ {
  351. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  352. s.Hic[i] = float32(m) * float32(0.01)
  353. index += 4
  354. }
  355. }
  356. func adw300A15aC13(adu []byte, data *iotStruct.CollectData) {
  357. var (
  358. index = 0
  359. m int16
  360. u int32
  361. )
  362. //当前正向有功需量
  363. u = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  364. data.Dp = float32(u) * float32(0.001) * float32(data.CT) * float32(data.PT)
  365. //当前反向有功需量
  366. index += 4
  367. //当前正向无功需量
  368. index += 4
  369. //当前反向无功需量
  370. index += 4
  371. //电压不平衡度
  372. index += 4
  373. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  374. data.UUnbalance = float32(m) * float32(0.01)
  375. //电流不平衡度
  376. index += 2
  377. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  378. data.IUnbalance = float32(m) * float32(0.01)
  379. //A相温度
  380. index += 2
  381. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  382. data.TemperatureA = float32(m) * float32(0.1)
  383. //B相温度
  384. index += 2
  385. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  386. data.TemperatureB = float32(m) * float32(0.1)
  387. //C相温度
  388. index += 2
  389. m = int16(uint16(adu[index])<<8 | uint16(adu[index+1]))
  390. data.TemperatureC = float32(m) * float32(0.1)
  391. }