meter_pmc350b.go 12 KB

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