el-pmc350b.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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. "math"
  11. "reflect"
  12. "runtime"
  13. )
  14. type pmc350bMeter struct {
  15. }
  16. var (
  17. pmc350bCollects = []iotStruct.ParsingDataConfig{
  18. {Origin: 0, Amount: 58, Method: pmc350bUIP},
  19. {Origin: 86, Amount: 8, Method: pmc350bTemperature},
  20. {Origin: 500, Amount: 12, Method: pmc350bEnergy},
  21. {Origin: 1400, Amount: 6, Method: pmc350bIHar},
  22. {Origin: 1600, Amount: 6, Method: pmc350bUHar},
  23. {Origin: 1330, Amount: 4, Method: pmc350bUIUnbalance},
  24. {Origin: 1400 + 24, Amount: 54, Method: pmc350bHarmIAbc1},
  25. {Origin: 1400 + 84, Amount: 54, Method: pmc350bHarmIAbc2},
  26. {Origin: 1400 + 144, Amount: 54, Method: pmc350bHarmIAbc3},
  27. {Origin: 1600 + 24, Amount: 54, Method: pmc350bHarmUAbc1},
  28. {Origin: 1600 + 84, Amount: 54, Method: pmc350bHarmUAbc2},
  29. {Origin: 1600 + 144, Amount: 54, Method: pmc350bHarmUAbc3},
  30. }
  31. )
  32. func NewPmc350bMeterHandler() iotInterface.MeterHandler {
  33. return &pmc350bMeter{}
  34. }
  35. func (m *pmc350bMeter) Collect(w iotService.RtuNetPgr, colData *iotStruct.CollectData) error {
  36. for _, v := range pmc350bCollects {
  37. if adu, err := w.GetHoldingRegs(v.Origin, v.Amount); err != nil {
  38. colData.Logger.Errorf("PMC-350B 采集失败[%s] ERROR:%v", runtime.FuncForPC(reflect.ValueOf(v.Method).Pointer()).Name(), err)
  39. return err
  40. } else {
  41. colData.Logger.Infof("======》ADU:%v", adu)
  42. v.Method(adu, colData)
  43. }
  44. }
  45. return nil
  46. }
  47. // SetAddress 设置地址
  48. func (m *pmc350bMeter) SetAddress(w iotService.RtuNetPgr, addr int) (err error) {
  49. var buf []byte
  50. buf = append(buf, utils.HfWord2byte(addr)...)
  51. if _, err = w.SetHoldingRegs(6401, 1, buf); err != nil {
  52. err = fmt.Errorf("PMC-350B 设置地址失败 ERROR:%v", err)
  53. return
  54. }
  55. return
  56. }
  57. // GetConfig 查询电表变比
  58. func (m *pmc350bMeter) GetConfig(w iotService.RtuNetPgr) (*map[string]interface{}, error) {
  59. if adu, err := w.GetHoldingRegs(6000, 10); err != nil {
  60. err = fmt.Errorf("PMC-350B 查询电表变比失败 ERROR:%v", err)
  61. return nil, err
  62. } else {
  63. var (
  64. index = 0
  65. n int32
  66. )
  67. cfg := &electric.MeterPMC350BOther{}
  68. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  69. cfg.PrimaryVolt = int(n)
  70. index += 4
  71. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  72. cfg.SecondVolt = int(n)
  73. index += 4
  74. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  75. cfg.PrimaryCurrent = int(n)
  76. index += 4
  77. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  78. cfg.SecondCurrent = int(n)
  79. index += 4
  80. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  81. cfg.CurrentType = int(n)
  82. index += 4
  83. //str, err := json.Marshal(cfg)
  84. //if err != nil {
  85. // err = fmt.Errorf("PMC-350B 变比序列化失败 ERROR:%v", err)
  86. // return "", err
  87. //}
  88. mp, err := utils.ToMap(cfg)
  89. return &mp, err
  90. }
  91. }
  92. func (m *pmc350bMeter) VerifyConfig(data *string) (interface{}, error) {
  93. cfg := &electric.MeterPMC350BOther{}
  94. if err := json.Unmarshal([]byte(*data), cfg); err != nil {
  95. err = fmt.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败 ERROR:%v", err)
  96. return nil, err
  97. }
  98. return cfg, nil
  99. }
  100. // SetConfig 设置电表变比
  101. func (m *pmc350bMeter) SetConfig(w iotService.RtuNetPgr, data *string) error {
  102. c, err := m.VerifyConfig(data)
  103. if err != nil {
  104. return err
  105. }
  106. cfg := c.(*electric.MeterPMC350BOther)
  107. var buf []byte
  108. {
  109. k := utils.Word2byte(cfg.PrimaryVolt)
  110. buf = append(buf, k...)
  111. }
  112. {
  113. k := utils.Word2byte(cfg.SecondVolt)
  114. buf = append(buf, k...)
  115. }
  116. {
  117. k := utils.Word2byte(cfg.PrimaryCurrent)
  118. buf = append(buf, k...)
  119. }
  120. {
  121. k := utils.Word2byte(cfg.SecondCurrent)
  122. buf = append(buf, k...)
  123. }
  124. {
  125. k := utils.Word2byte(cfg.CurrentType)
  126. buf = append(buf, k...)
  127. }
  128. if _, err := w.SetHoldingRegs(6000, 10, buf); err != nil {
  129. err = fmt.Errorf("PMC-350B 设置电表变比失败 ERROR:%v", err)
  130. return err
  131. }
  132. return nil
  133. }
  134. func pmc350bUIP(adu []byte, s *iotStruct.CollectData) {
  135. var (
  136. index = 0
  137. m uint32
  138. )
  139. //ABC相电压
  140. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  141. s.Ua = math.Float32frombits(m)
  142. index += 4
  143. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  144. s.Ub = math.Float32frombits(m)
  145. index += 4
  146. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  147. s.Uc = math.Float32frombits(m)
  148. index += 4
  149. index += 4
  150. //ABC线电压
  151. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  152. index += 4
  153. s.Uab = math.Float32frombits(m)
  154. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  155. index += 4
  156. s.Ubc = math.Float32frombits(m)
  157. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  158. index += 4
  159. s.Uca = math.Float32frombits(m)
  160. index += 4
  161. //ABC电流
  162. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  163. index += 4
  164. s.Ia = math.Float32frombits(m)
  165. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  166. index += 4
  167. s.Ib = math.Float32frombits(m)
  168. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  169. index += 4
  170. s.Ic = math.Float32frombits(m)
  171. index += 4
  172. //ABC、总有功
  173. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  174. index += 4
  175. s.Pa = math.Float32frombits(m) * float32(0.001)
  176. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  177. index += 4
  178. s.Pb = math.Float32frombits(m) * float32(0.001)
  179. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  180. index += 4
  181. s.Pc = math.Float32frombits(m) * float32(0.001)
  182. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  183. index += 4
  184. s.P = math.Float32frombits(m) * float32(0.001)
  185. //ABC、总无功
  186. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  187. index += 4
  188. s.Qa = math.Float32frombits(m) * float32(0.001)
  189. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  190. index += 4
  191. s.Qb = math.Float32frombits(m) * float32(0.001)
  192. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  193. index += 4
  194. s.Qc = math.Float32frombits(m) * float32(0.001)
  195. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  196. index += 4
  197. s.Q = math.Float32frombits(m) * float32(0.001)
  198. //视在功率
  199. index += 16
  200. //ABC、总功率因素
  201. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  202. index += 4
  203. s.Pfa = math.Float32frombits(m)
  204. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  205. index += 4
  206. s.Pfb = math.Float32frombits(m)
  207. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  208. index += 4
  209. s.Pfc = math.Float32frombits(m)
  210. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  211. index += 4
  212. s.Pf = math.Float32frombits(m)
  213. //频率
  214. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  215. index += 4
  216. }
  217. func pmc350bTemperature(adu []byte, s *iotStruct.CollectData) {
  218. var (
  219. index = 0
  220. m uint32
  221. f float32
  222. )
  223. //温度
  224. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  225. f = math.Float32frombits(m)
  226. if math.IsNaN(float64(f)) {
  227. s.TemperatureA = float32(0)
  228. } else {
  229. s.TemperatureA = f
  230. }
  231. index += 4
  232. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  233. f = math.Float32frombits(m)
  234. if math.IsNaN(float64(f)) {
  235. s.TemperatureB = float32(0)
  236. } else {
  237. s.TemperatureB = f
  238. }
  239. index += 4
  240. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  241. f = math.Float32frombits(m)
  242. if math.IsNaN(float64(f)) {
  243. s.TemperatureC = float32(0)
  244. } else {
  245. s.TemperatureC = f
  246. }
  247. index += 4
  248. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  249. f = math.Float32frombits(m)
  250. if math.IsNaN(float64(f)) {
  251. s.TemperatureZ = float32(0)
  252. } else {
  253. s.TemperatureZ = f
  254. }
  255. index += 4
  256. }
  257. func pmc350bEnergy(adu []byte, s *iotStruct.CollectData) {
  258. var (
  259. index = 0
  260. m int32
  261. )
  262. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  263. s.Tps = float32(m) * float32(0.01)
  264. index += 4
  265. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  266. s.Fps = float32(m) * float32(0.01)
  267. index += 4
  268. index += 8
  269. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  270. s.Tqs = float32(m) * float32(0.01)
  271. index += 4
  272. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  273. s.Fqs = float32(m) * float32(0.01)
  274. index += 4
  275. }
  276. func pmc350bIHar(adu []byte, s *iotStruct.CollectData) {
  277. subHarAbc(adu, &s.IaHar, &s.IbHar, &s.IcHar)
  278. }
  279. func pmc350bUHar(adu []byte, s *iotStruct.CollectData) {
  280. subHarAbc(adu, &s.UaHar, &s.UbHar, &s.UcHar)
  281. }
  282. // ABC相畸变
  283. func subHarAbc(adu []byte, fa *float32, fb *float32, fc *float32) {
  284. var (
  285. index = 0
  286. m uint32
  287. )
  288. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  289. *fa = math.Float32frombits(m) * float32(10)
  290. index += 4
  291. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  292. *fb = math.Float32frombits(m) * float32(10)
  293. index += 4
  294. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  295. *fc = math.Float32frombits(m) * float32(10)
  296. index += 4
  297. }
  298. func pmc350bUIUnbalance(adu []byte, s *iotStruct.CollectData) {
  299. var (
  300. index = 0
  301. m uint32
  302. )
  303. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  304. s.UUnbalance = math.Float32frombits(m)
  305. index += 4
  306. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  307. s.IUnbalance = math.Float32frombits(m)
  308. index += 4
  309. }
  310. // 3-11
  311. func pmc350bHarmIAbc1(adu []byte, s *iotStruct.CollectData) {
  312. subHarmAbc(0, adu, &s.Hia, &s.Hib, &s.Hic)
  313. }
  314. // 13-21
  315. func pmc350bHarmIAbc2(adu []byte, s *iotStruct.CollectData) {
  316. subHarmAbc(5, adu, &s.Hia, &s.Hib, &s.Hic)
  317. }
  318. // 23-31
  319. func pmc350bHarmIAbc3(adu []byte, s *iotStruct.CollectData) {
  320. subHarmAbc(10, adu, &s.Hia, &s.Hib, &s.Hic)
  321. }
  322. // 3-11
  323. func pmc350bHarmUAbc1(adu []byte, s *iotStruct.CollectData) {
  324. subHarmAbc(0, adu, &s.Hua, &s.Hub, &s.Huc)
  325. }
  326. // 13-21
  327. func pmc350bHarmUAbc2(adu []byte, s *iotStruct.CollectData) {
  328. subHarmAbc(5, adu, &s.Hua, &s.Hub, &s.Huc)
  329. }
  330. // 23-31
  331. func pmc350bHarmUAbc3(adu []byte, s *iotStruct.CollectData) {
  332. subHarmAbc(10, adu, &s.Hua, &s.Hub, &s.Huc)
  333. }
  334. func subHarmAbc(orig int, adu []byte, fa *[15]float32, fb *[15]float32, fc *[15]float32) {
  335. var (
  336. index = 0
  337. m uint32
  338. )
  339. //ABC相3-11次谐波
  340. for i := 0; i < 5; i++ {
  341. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  342. index += 4
  343. fa[i+orig] = math.Float32frombits(m) * float32(10)
  344. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  345. index += 4
  346. fb[i+orig] = math.Float32frombits(m) * float32(10)
  347. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  348. index += 4
  349. fc[i+orig] = math.Float32frombits(m) * float32(10)
  350. index += 12 //跳过偶次谐波
  351. }
  352. }