meter_pmc350b.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  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. "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, 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. // GetRatio 查询电表变比
  58. func (m *pmc350bMeter) GetRatio(w iotService.RtuNetPgr) (string, error) {
  59. if adu, err := w.GetHoldingRegs(6000, 10); err != nil {
  60. err = fmt.Errorf("PMC-350B 查询电表变比失败 ERROR:%v", err)
  61. return "", err
  62. } else {
  63. var (
  64. index = 0
  65. n int32
  66. )
  67. s := &electric.MeterPMC350BOther{}
  68. n = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  69. s.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. s.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. s.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. s.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. s.CurrentType = int(n)
  82. index += 4
  83. str, err := json.Marshal(s)
  84. if err != nil {
  85. err = fmt.Errorf("PMC-350B 变比序列化失败 ERROR:%v", err)
  86. return "", err
  87. }
  88. return string(str), nil
  89. }
  90. }
  91. // SetRatio 设置电表变比
  92. func (m *pmc350bMeter) SetRatio(w iotService.RtuNetPgr, data string) error {
  93. ratio := &electric.MeterPMC350BOther{}
  94. if err := json.Unmarshal([]byte(data), ratio); err != nil {
  95. err = fmt.Errorf("PMC-350B 设置电表变比失败,变比数据解析失败 ERROR:%v", err)
  96. return err
  97. }
  98. var buf []byte
  99. {
  100. k := utils.Word2byte(ratio.PrimaryVolt)
  101. buf = append(buf, k...)
  102. }
  103. {
  104. k := utils.Word2byte(ratio.SecondVolt)
  105. buf = append(buf, k...)
  106. }
  107. {
  108. k := utils.Word2byte(ratio.PrimaryCurrent)
  109. buf = append(buf, k...)
  110. }
  111. {
  112. k := utils.Word2byte(ratio.SecondCurrent)
  113. buf = append(buf, k...)
  114. }
  115. {
  116. k := utils.Word2byte(ratio.CurrentType)
  117. buf = append(buf, k...)
  118. }
  119. if _, err := w.SetHoldingRegs(6000, 10, buf); err != nil {
  120. err = fmt.Errorf("PMC-350B 设置电表变比失败 ERROR:%v", err)
  121. return err
  122. }
  123. return nil
  124. }
  125. func pmc350bUIP(adu []byte, s *iotStruct.CollectData) {
  126. var (
  127. index = 0
  128. m uint32
  129. )
  130. //ABC相电压
  131. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  132. s.Ua = math.Float32frombits(m)
  133. index += 4
  134. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  135. s.Ub = math.Float32frombits(m)
  136. index += 4
  137. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  138. s.Uc = math.Float32frombits(m)
  139. index += 4
  140. index += 4
  141. //ABC线电压
  142. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  143. index += 4
  144. s.Uab = math.Float32frombits(m)
  145. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  146. index += 4
  147. s.Ubc = math.Float32frombits(m)
  148. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  149. index += 4
  150. s.Uca = math.Float32frombits(m)
  151. index += 4
  152. //ABC电流
  153. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  154. index += 4
  155. s.Ia = math.Float32frombits(m)
  156. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  157. index += 4
  158. s.Ib = math.Float32frombits(m)
  159. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  160. index += 4
  161. s.Ic = math.Float32frombits(m)
  162. index += 4
  163. //ABC、总有功
  164. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  165. index += 4
  166. s.Pa = math.Float32frombits(m) * float32(0.001)
  167. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  168. index += 4
  169. s.Pb = math.Float32frombits(m) * float32(0.001)
  170. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  171. index += 4
  172. s.Pc = math.Float32frombits(m) * float32(0.001)
  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.P = math.Float32frombits(m) * float32(0.001)
  176. //ABC、总无功
  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.Qa = 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.Qb = math.Float32frombits(m) * float32(0.001)
  183. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  184. index += 4
  185. s.Qc = math.Float32frombits(m) * float32(0.001)
  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.Q = math.Float32frombits(m) * float32(0.001)
  189. //视在功率
  190. index += 16
  191. //ABC、总功率因素
  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.Pfa = math.Float32frombits(m)
  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.Pfb = math.Float32frombits(m)
  198. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  199. index += 4
  200. s.Pfc = math.Float32frombits(m)
  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.Pf = math.Float32frombits(m)
  204. //频率
  205. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  206. index += 4
  207. }
  208. func pmc350bTemperature(adu []byte, s *iotStruct.CollectData) {
  209. var (
  210. index = 0
  211. m uint32
  212. f float32
  213. )
  214. //温度
  215. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  216. f = math.Float32frombits(m)
  217. if math.IsNaN(float64(f)) {
  218. s.TemperatureA = float32(0)
  219. } else {
  220. s.TemperatureA = f
  221. }
  222. index += 4
  223. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  224. f = math.Float32frombits(m)
  225. if math.IsNaN(float64(f)) {
  226. s.TemperatureB = float32(0)
  227. } else {
  228. s.TemperatureB = f
  229. }
  230. index += 4
  231. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  232. f = math.Float32frombits(m)
  233. if math.IsNaN(float64(f)) {
  234. s.TemperatureC = float32(0)
  235. } else {
  236. s.TemperatureC = f
  237. }
  238. index += 4
  239. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  240. f = math.Float32frombits(m)
  241. if math.IsNaN(float64(f)) {
  242. s.TemperatureZ = float32(0)
  243. } else {
  244. s.TemperatureZ = f
  245. }
  246. index += 4
  247. }
  248. func pmc350bEnergy(adu []byte, s *iotStruct.CollectData) {
  249. var (
  250. index = 0
  251. m int32
  252. )
  253. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  254. s.Tps = float32(m) * float32(0.01)
  255. index += 4
  256. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  257. s.Fps = float32(m) * float32(0.01)
  258. index += 4
  259. index += 8
  260. m = int32(uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3]))
  261. s.Tqs = 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.Fqs = float32(m) * float32(0.01)
  265. index += 4
  266. }
  267. func pmc350bIHar(adu []byte, s *iotStruct.CollectData) {
  268. subHarAbc(adu, &s.IaHar, &s.IbHar, &s.IcHar)
  269. }
  270. func pmc350bUHar(adu []byte, s *iotStruct.CollectData) {
  271. subHarAbc(adu, &s.UaHar, &s.UbHar, &s.UcHar)
  272. }
  273. // ABC相畸变
  274. func subHarAbc(adu []byte, fa *float32, fb *float32, fc *float32) {
  275. var (
  276. index = 0
  277. m uint32
  278. )
  279. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  280. *fa = math.Float32frombits(m) * float32(10)
  281. index += 4
  282. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  283. *fb = math.Float32frombits(m) * float32(10)
  284. index += 4
  285. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  286. *fc = math.Float32frombits(m) * float32(10)
  287. index += 4
  288. }
  289. func pmc350bUIUnbalance(adu []byte, s *iotStruct.CollectData) {
  290. var (
  291. index = 0
  292. m uint32
  293. )
  294. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  295. s.UUnbalance = math.Float32frombits(m)
  296. index += 4
  297. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  298. s.IUnbalance = math.Float32frombits(m)
  299. index += 4
  300. }
  301. // 3-11
  302. func pmc350bHarmIAbc1(adu []byte, s *iotStruct.CollectData) {
  303. subHarmAbc(0, adu, &s.Hia, &s.Hib, &s.Hic)
  304. }
  305. // 13-21
  306. func pmc350bHarmIAbc2(adu []byte, s *iotStruct.CollectData) {
  307. subHarmAbc(5, adu, &s.Hia, &s.Hib, &s.Hic)
  308. }
  309. // 23-31
  310. func pmc350bHarmIAbc3(adu []byte, s *iotStruct.CollectData) {
  311. subHarmAbc(10, adu, &s.Hia, &s.Hib, &s.Hic)
  312. }
  313. // 3-11
  314. func pmc350bHarmUAbc1(adu []byte, s *iotStruct.CollectData) {
  315. subHarmAbc(0, adu, &s.Hua, &s.Hub, &s.Huc)
  316. }
  317. // 13-21
  318. func pmc350bHarmUAbc2(adu []byte, s *iotStruct.CollectData) {
  319. subHarmAbc(5, adu, &s.Hua, &s.Hub, &s.Huc)
  320. }
  321. // 23-31
  322. func pmc350bHarmUAbc3(adu []byte, s *iotStruct.CollectData) {
  323. subHarmAbc(10, adu, &s.Hua, &s.Hub, &s.Huc)
  324. }
  325. func subHarmAbc(orig int, adu []byte, fa *[15]float32, fb *[15]float32, fc *[15]float32) {
  326. var (
  327. index = 0
  328. m uint32
  329. )
  330. //ABC相3-11次谐波
  331. for i := 0; i < 5; i++ {
  332. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  333. index += 4
  334. fa[i+orig] = math.Float32frombits(m) * float32(10)
  335. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  336. index += 4
  337. fb[i+orig] = math.Float32frombits(m) * float32(10)
  338. m = uint32(adu[index])<<24 | uint32(adu[index+1])<<16 | uint32(adu[index+2])<<8 | uint32(adu[index+3])
  339. index += 4
  340. fc[i+orig] = math.Float32frombits(m) * float32(10)
  341. index += 12 //跳过偶次谐波
  342. }
  343. }