meter_adw300.go 12 KB

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