switch_ctrl.c 71 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038
  1. #include "switch_ctrl.h"
  2. #include "modbus_handle.h"
  3. #include "hlw8110_handle.h"
  4. #include "errno.h"
  5. /// @brief 获取继电器板类型以及通道
  6. /// @param manger
  7. /// @param saddr
  8. /// @param type
  9. /// @param chn
  10. /// @return
  11. int g_switch_get_type(void* manger,int saddr, int* type,int* chn,int nPowerType)
  12. {
  13. if(nPowerType==0) //交流无法使用需要
  14. {
  15. int ret = 0 ;
  16. unsigned short data_temp = 0 ;
  17. ret = g_modbus_read_reg(manger,saddr,_SWITCH_TYPE_CHN_INFO,&data_temp);
  18. //ret = g_modbus_read_reg(manger,saddr,_SWITCH_DCPDU_TYPE_CHN_INFO,&data_temp);
  19. if(ret!=TRUE)
  20. {
  21. log_w("%s",modbus_strerror(errno));
  22. return -1 ;
  23. }
  24. *type = (data_temp>>8)&0xFF;
  25. *chn = data_temp&0xFF;
  26. return 0;
  27. }
  28. else{
  29. //32位读取
  30. int ret = 0 ;
  31. unsigned short data_temp[4];
  32. memset(data_temp,0,sizeof(data_temp));
  33. // ret = g_modbus_read_reg(manger,saddr,_SWITCH_TYPE_CHN_INFO,&data_temp);
  34. // if(ret!=TRUE)
  35. ret = g_modbus_read_x_reg(manger,saddr,_SWITCH_DCPDU_TYPE_CHN_INFO, 2,&data_temp);
  36. log_d("ret:%d saddr:%d data:%d,%d.\n",ret,saddr,data_temp[1],data_temp[0]);
  37. if (ret<=0)
  38. {
  39. log_w("Modbus Error:%s\n",modbus_strerror(errno));
  40. }
  41. if(!ret)
  42. return -1 ;
  43. *type = (data_temp[0]>>8)&0xFF;
  44. *chn = data_temp[0]&0xFF;
  45. return 0;
  46. }
  47. }
  48. /// @brief 获取单相小电流继电器板信息
  49. /// @param manger
  50. /// @param saddr
  51. /// @param chn
  52. /// @param _power
  53. /// @return
  54. int g_switch_get_ac_single_s_cur_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  55. {
  56. int ret = 0 ;
  57. unsigned int offset = 0;
  58. unsigned int val = 0 ;
  59. unsigned short data_temp[12] = {0};
  60. unsigned short status_temp = 0 ;
  61. if(chn>=8)
  62. return -1;
  63. offset = _SWITCH_AC_SINGLE_S_CUR_INFO+chn*12;
  64. //读取12个寄存器
  65. ret = g_modbus_read_x_reg(manger,saddr,offset,12,data_temp);
  66. if(ret<=0)
  67. return -1 ;
  68. //解电压数据
  69. val = (data_temp[1]<<16)|data_temp[0];
  70. _power->voltage = val/1000.0;
  71. //解电流数据
  72. val = (data_temp[3]<<16)|data_temp[2];
  73. _power->current = val/1000.0;
  74. //解功率数据
  75. val = (data_temp[5]<<16)|data_temp[4];
  76. _power->power = val/1000.0;
  77. //解频率数据
  78. val = (data_temp[7]<<16)|data_temp[6];
  79. _power->freq = val/1000.0;
  80. //解耗电量数据
  81. val = (data_temp[9]<<16)|data_temp[8];
  82. _power->consumption = val/1000.0;
  83. //解功率因素数据
  84. val = (data_temp[11]<<16)|data_temp[10];
  85. _power->factor = val/1000.0;
  86. #if(0)
  87. printf("---------%d---------------\n",chn);
  88. printf("voltage:%0.2f\n", _power->voltage);
  89. printf("current:%0.2f\n", _power->current);
  90. printf("power:%0.2f\n", _power->power);
  91. printf("freq:%0.2f\n", _power->freq);
  92. printf("consumption:%0.2f\n", _power->consumption);
  93. printf("factor:%0.2f\n", _power->factor);
  94. printf("-----------------------\n");
  95. #endif
  96. //获取开关状态
  97. offset = _SWITCH_AC_SINGLE_S_STS_INFO+chn;
  98. ret = g_modbus_read_reg(manger,saddr,offset,&status_temp);
  99. if(ret!=TRUE)
  100. return -1 ;
  101. _power->status = status_temp & BIT_00;
  102. _warning->w_voltage_up = status_temp & WARNING_V_UP;
  103. _warning->w_voltage_down = status_temp & WARNING_V_DOWN;
  104. _warning->w_current = status_temp & WARNING_A_UP;
  105. _warning->w_power = status_temp & WARNING_W_UP;
  106. _warning->w_consumption = status_temp & WARNING_P_UP;
  107. return 0;
  108. }
  109. int g_switch_get_ac_single_s_all_cur_info(void* manger,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  110. {
  111. unsigned int offset = 0;
  112. unsigned int val = 0;
  113. unsigned short data_temp[96] = {0};
  114. unsigned int status_temp = 0;
  115. int ret = 0;
  116. offset = _SWITCH_AC_SINGLE_S_CUR_INFO;
  117. // 读取4个寄存器
  118. // 读取寄存器
  119. memset(data_temp, 0, sizeof(data_temp));
  120. ret = g_modbus_read_x_reg(manger, saddr, offset, 96, data_temp);
  121. if (ret < 0)
  122. {
  123. log_w("g_switch_get_s_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  124. // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  125. return ret;
  126. }
  127. // 解电压数据
  128. for (size_t i = 0; i < nNumb; i++)
  129. {
  130. int Index = i * 12;
  131. // 解电压数据
  132. val = (data_temp[1 + Index] << 16) | data_temp[0 + Index];
  133. _power[i].voltage = val / 1000.0;
  134. // 解电流数据
  135. val = (data_temp[3 + Index] << 16) | data_temp[2 + Index];
  136. _power[i].current = val / 1000.0;
  137. // 解功率数据
  138. val = (data_temp[5 + Index] << 16) | data_temp[4 + Index];
  139. _power[i].power = val / 1000.0;
  140. // 解频率数据
  141. val = (data_temp[7 + Index] << 16) | data_temp[6 + Index];
  142. _power[i].freq = val / 1000.0;
  143. // 解耗电量数据
  144. val = (data_temp[9 + Index] << 16) | data_temp[8 + Index];
  145. _power[i].consumption = val / 1000.0;
  146. // 解功率因素数据
  147. val = (data_temp[11 + Index] << 16) | data_temp[10 + Index];
  148. _power[i].factor = val / 1000.0;
  149. }
  150. offset = _SWITCH_AC_SINGLE_S_STS_INFO;
  151. memset(data_temp, 0,sizeof(data_temp));
  152. ret = g_modbus_read_x_reg(manger, saddr, offset, 8, data_temp);
  153. // 解控制数据
  154. if (ret < 0)
  155. {
  156. return ret;
  157. }
  158. for (size_t i = 0; i < nNumb; i++)
  159. {
  160. status_temp=data_temp[i];
  161. _power[i].status = status_temp & (BIT_00);
  162. _warning[i].w_voltage_up = status_temp & (WARNING_V_UP);
  163. _warning[i].w_voltage_down = status_temp & (WARNING_V_DOWN);
  164. _warning[i].w_current = status_temp & (WARNING_A_UP);
  165. _warning[i].w_power = status_temp & (WARNING_W_UP);
  166. _warning[i].w_consumption = status_temp & (WARNING_P_UP);
  167. }
  168. return 0;
  169. }
  170. /// @brief 获取单相大电流继电器板信息
  171. /// @param manger
  172. /// @param saddr
  173. /// @param chn
  174. /// @param _power
  175. /// @return
  176. int g_switch_get_ac_single_b_cur_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  177. {
  178. unsigned int offset = 0;
  179. unsigned int val = 0 ;
  180. unsigned short data_temp[12] = {0};
  181. unsigned short status_temp = 0 ;
  182. if(chn>=4)
  183. return -1;
  184. offset = _SWITCH_AC_SINGLE_B_CUR_INFO+chn*12;
  185. //读取12个寄存器
  186. g_modbus_read_x_reg(manger,saddr,offset,12,data_temp);
  187. //解电压数据
  188. val = (data_temp[0]<<16)|data_temp[1];
  189. _power->voltage = val;
  190. //解电流数据
  191. val = (data_temp[2]<<16)|data_temp[3];
  192. _power->current = val;
  193. //解功率数据
  194. val = (data_temp[4]<<16)|data_temp[5];
  195. _power->power = val;
  196. //解频率数据
  197. val = (data_temp[6]<<16)|data_temp[7];
  198. _power->freq = val;
  199. //解耗电量数据
  200. val = (data_temp[8]<<16)|data_temp[9];
  201. _power->consumption = val;
  202. //解功率因素数据
  203. val = (data_temp[10]<<16)|data_temp[11];
  204. _power->factor = val;
  205. //获取开关状态
  206. offset = _SWITCH_AC_SINGLE_B_STS_INFO+chn;
  207. g_modbus_read_reg(manger,saddr,offset,&status_temp);
  208. _power->status = status_temp & BIT_00;
  209. _warning->w_voltage_up = status_temp & WARNING_V_UP;
  210. _warning->w_voltage_down = status_temp & WARNING_V_DOWN;
  211. _warning->w_current = status_temp & WARNING_A_UP;
  212. _warning->w_power = status_temp & WARNING_W_UP;
  213. _warning->w_consumption = status_temp & WARNING_P_UP;
  214. return 0;
  215. }
  216. /// @brief 获取直流继电器一路输出信息
  217. /// @param manger
  218. /// @param saddr
  219. /// @param chn
  220. /// @param _power
  221. /// @return
  222. int g_switch_get_dc_out_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  223. {
  224. unsigned int offset = 0;
  225. unsigned int val = 0 ;
  226. unsigned short data_temp[12] = {0};
  227. unsigned short status_temp = 0 ;
  228. if(chn>=1)
  229. return -1;
  230. offset = _SWITCH_DC_OUT_INFO+chn*6;
  231. //读取12个寄存器
  232. g_modbus_read_x_reg(manger,saddr,offset,6,data_temp);
  233. //解电压数据
  234. val = (data_temp[0]<<16)|data_temp[1];
  235. _power->voltage = val;
  236. //解电流数据
  237. val = (data_temp[2]<<16)|data_temp[3];
  238. _power->current = val;
  239. //解功率数据
  240. val = (data_temp[4]<<16)|data_temp[5];
  241. _power->power = val;
  242. //获取开关状态
  243. offset = _SWITCH_DC_STS_INFO;
  244. g_modbus_read_reg(manger,saddr,offset,&status_temp);
  245. //_power->status = status_temp;
  246. _power->status = status_temp & BIT_00;
  247. _warning->w_voltage_up = status_temp & WARNING_V_UP;
  248. _warning->w_voltage_down = status_temp & WARNING_V_DOWN;
  249. _warning->w_current = status_temp & WARNING_A_UP;
  250. _warning->w_power = status_temp & WARNING_W_UP;
  251. _warning->w_consumption = status_temp & WARNING_P_UP;
  252. return 0;
  253. }
  254. /// @brief 获取直流总输入信息
  255. /// @param manger
  256. /// @param saddr
  257. /// @param _power
  258. /// @param _sensorVal
  259. /// @return
  260. int g_switch_get_dc_in_info(void* manger,int saddr,PowerInfo* _power,SenorTempVal* _sensorVal)
  261. {
  262. unsigned int offset = 0;
  263. unsigned int val = 0 ;
  264. unsigned short data_temp[12] = {0};
  265. offset = _SWITCH_DC_IN_INFO;
  266. //读取12个寄存器
  267. g_modbus_read_x_reg(manger,saddr,offset,8,data_temp);
  268. //解电压数据
  269. val = (data_temp[0]<<16)|data_temp[1];
  270. _power->voltage = val;
  271. //解电流数据
  272. val = (data_temp[2]<<16)|data_temp[3];
  273. _power->current = val;
  274. //解功率数据
  275. val = (data_temp[4]<<16)|data_temp[5];
  276. _power->power = val;
  277. //解温度数据
  278. val = data_temp[6];
  279. _sensorVal->temperature = val;
  280. //解湿度数据
  281. val = data_temp[7];
  282. _sensorVal->humidity = val;
  283. return 0;
  284. }
  285. /// @brief 设置AC单相小电流通道开启延时时间
  286. /// @param manger
  287. /// @param saddr
  288. /// @param chn
  289. /// @param time 单位ms
  290. /// @return
  291. int g_switch_set_ac_single_s_start_time_delay(void* manger,int saddr,unsigned char chn,unsigned int time)
  292. {
  293. unsigned int offset = 0;
  294. if(chn>=8)
  295. return -1;
  296. offset = _SWITCH_AC_SINGLE_S_START_DELAY_TIME+chn;
  297. int reg=g_modbus_write_reg(manger,saddr,offset,time);
  298. if (reg>=0)
  299. {
  300. log_d("StartDelayTime_Addr:%d OffSet:%d Time:%d Ret=%d",saddr,offset,time,reg);
  301. }
  302. else
  303. {
  304. log_w("StartDelayTime_Addr:%d OffSet:%d Time:%d Ret=%d:%s",saddr,offset,time,reg,modbus_strerror(errno));
  305. }
  306. return reg ;
  307. }
  308. /// @brief 设置AC单相小电流通道关闭延时时间
  309. /// @param manger
  310. /// @param saddr
  311. /// @param chn
  312. /// @param time 单位ms
  313. /// @return
  314. int g_switch_set_ac_single_s_stop_time_delay(void* manger,int saddr,unsigned char chn,unsigned int time)
  315. {
  316. unsigned int offset = 0;
  317. if(chn>=8)
  318. return -1;
  319. offset = _SWITCH_AC_SINGLE_S_STOP_DELAY_TIME+chn;
  320. int reg=g_modbus_write_reg(manger,saddr,offset,time);
  321. if (reg>=0)
  322. {
  323. log_d("StopDelayTime_Addr:%d OffSet:%d Time:%d Ret=%d",saddr,offset,time,reg);
  324. }
  325. else
  326. {
  327. log_w("StopDelayTime_Addr:%d OffSet:%d Time:%d Ret=%d:%s",saddr,offset,time,reg,modbus_strerror(errno));
  328. }
  329. return reg;
  330. }
  331. /// @brief 设置AC单相大电流通道开启延时时间
  332. /// @param manger
  333. /// @param saddr
  334. /// @param chn
  335. /// @param time
  336. /// @return
  337. int g_switch_set_ac_single_b_start_time_delay(void* manger,int saddr,unsigned char chn,unsigned int time)
  338. {
  339. unsigned int offset = 0;
  340. if(chn>=4)
  341. return -1;
  342. offset = _SWITCH_AC_SINGLE_B_START_DELAY_TIME+chn*2;
  343. return g_modbus_write_x_reg(manger,saddr,offset,2,&time);
  344. }
  345. /// @brief 设置AC单相大电流通道关闭延时时间
  346. /// @param manger
  347. /// @param saddr
  348. /// @param chn
  349. /// @param time
  350. /// @return
  351. int g_switch_set_ac_single_b_stop_time_delay(void* manger,int saddr,unsigned char chn,unsigned int time)
  352. {
  353. unsigned int offset = 0;
  354. if(chn>=4)
  355. return -1;
  356. offset = _SWITCH_AC_SINGLE_B_STOP_DELAY_TIME+chn*2;
  357. return g_modbus_write_x_reg(manger,saddr,offset,2,&time);
  358. }
  359. /// @brief 设置直流继电器控制板
  360. /// @param manger
  361. /// @param saddr
  362. /// @param time
  363. /// @return
  364. int g_switch_set_dc_start_time_delay(void* manger,int saddr,unsigned int time)
  365. {
  366. unsigned int offset = 0;
  367. offset = _SWITCH_DC_START_DELAY_TIME;
  368. return g_modbus_write_x_reg(manger,saddr,offset,2,&time) ;
  369. }
  370. /// @brief 设置直流继电器控制板
  371. /// @param manger
  372. /// @param saddr
  373. /// @param time
  374. /// @return
  375. int g_switch_set_dc_stop_time_delay(void* manger,int saddr,unsigned int time)
  376. {
  377. unsigned int offset = 0;
  378. offset = _SWITCH_DC_STOP_DELAY_TIME;
  379. return g_modbus_write_x_reg(manger,saddr,offset,2,&time);
  380. }
  381. /// @brief 设置单相小电流通道开关状态
  382. /// @param manger
  383. /// @param saddr
  384. /// @param chn
  385. /// @param sts
  386. /// @return
  387. int g_switch_set_ac_single_s_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  388. {
  389. unsigned int offset = 0;
  390. if(chn>=8)
  391. return -1;
  392. offset = _SWITCH_AC_SINGLE_S_CHN_STS+chn;
  393. return g_modbus_write_reg(manger,saddr,offset,sts);
  394. }
  395. /// @brief 设置单相小电流所有通道开关状态
  396. /// @param manger
  397. /// @param saddr
  398. /// @param sts
  399. /// @return
  400. int g_switch_set_ac_single_s_ctrl(void* manger,int saddr,unsigned short* sts)
  401. {
  402. unsigned int offset = 0;
  403. offset = _SWITCH_AC_SINGLE_S_CHN_STS;
  404. return g_modbus_write_x_reg(manger,saddr,offset,8,sts); ;
  405. }
  406. /// @brief 设置单相大电流通道开关状态
  407. /// @param manger
  408. /// @param saddr
  409. /// @param chn
  410. /// @param sts
  411. /// @return
  412. int g_switch_set_ac_single_b_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  413. {
  414. unsigned int offset = 0;
  415. if(chn>=4)
  416. return -1;
  417. offset = _SWITCH_AC_SINGLE_B_CHN_STS+chn;
  418. g_modbus_write_reg(manger,saddr,offset,offset);
  419. return 0 ;
  420. }
  421. /// @brief 设置单相大电流所有通道开关状态
  422. /// @param manger
  423. /// @param saddr
  424. /// @param sts
  425. /// @return
  426. int g_switch_set_ac_single_b_ctrl(void* manger,int saddr,unsigned short* sts)
  427. {
  428. unsigned int offset = 0;
  429. offset = _SWITCH_AC_SINGLE_B_CHN_STS;
  430. g_modbus_write_x_reg(manger,saddr,offset,4,sts);
  431. return 0 ;
  432. }
  433. /// @brief 设置直流所有通道开关状态
  434. /// @param manger
  435. /// @param saddr
  436. /// @param sts
  437. /// @return
  438. int g_switch_set_dc_ctrl(void* manger,int saddr,unsigned short sts)
  439. {
  440. unsigned int offset = 0;
  441. offset = _SWITCH_DC_STS;
  442. g_modbus_write_reg(manger,saddr,offset,sts);
  443. return 0 ;
  444. }
  445. /// @brief 设置单相小电流通道超限报警
  446. /// @param manger
  447. /// @param saddr
  448. /// @param chn
  449. /// @param _global_over_manager
  450. /// @return
  451. int g_switch_set_ac_single_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  452. {
  453. unsigned int offset = 0;
  454. unsigned int data_temp = 0 ;
  455. unsigned short data_buf[16] = {0};
  456. //电压上限
  457. data_temp = (_global_over_manager->product_vol_upper_threshold*1000);
  458. data_buf[0] = data_temp;
  459. data_buf[1] = data_temp>>16;
  460. //电压下限
  461. data_temp = (_global_over_manager->product_vol_lower_threshold*1000);
  462. data_buf[2] = data_temp;
  463. data_buf[3] = data_temp>>16;
  464. //电流上限
  465. data_temp = (_global_over_manager->product_cur_upper_threshold*1000);
  466. data_buf[4] = data_temp;
  467. data_buf[5] = data_temp>>16;
  468. //电流下限
  469. data_temp = (0);
  470. data_buf[6] = data_temp;
  471. data_buf[7] = data_temp>>16;
  472. //功率上限
  473. data_temp = (_global_over_manager->product_pwr_upper_threshold*1000);
  474. data_buf[8] = data_temp;
  475. data_buf[9] = data_temp>>16;
  476. //功率下限
  477. data_temp = 0;
  478. data_buf[10] = data_temp;
  479. data_buf[11] = data_temp>>16;
  480. //电能上限
  481. data_temp = (_global_over_manager->product_pwrcon_upper_threshold*1000);
  482. data_buf[12] = data_temp;
  483. data_buf[13] = data_temp>>16;
  484. //电能下限
  485. data_temp = 0;
  486. data_buf[14] = data_temp;
  487. data_buf[15] = data_temp>>16;
  488. offset = _SWITCH_AC_SINGLE_S_Threshold+chn*16;
  489. int ret= g_modbus_write_x_reg(manger,saddr,offset,16,data_buf);
  490. //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  491. return ret;
  492. }
  493. /// @brief 设置单相小电流通道KB
  494. /// @param manger
  495. /// @param saddr
  496. /// @param chn
  497. /// @param sts
  498. /// @return
  499. int g_switch_set_ac_single_s_kb_val(void* manger,int saddr,unsigned char chn,SwitchKbVal* _kb_val)
  500. {
  501. unsigned int offset = 0;
  502. unsigned int rval = 0 ;
  503. unsigned short data_temp[8] = {0};
  504. if(chn>=8)
  505. return -1;
  506. offset = _SWITCH_AC_SINGLE_S_KB_VAL+chn*8;
  507. data_temp[0] = (unsigned short)_kb_val->voltage_k;
  508. data_temp[1] = (unsigned short)((_kb_val->voltage_k-data_temp[0])*1000);
  509. data_temp[2] = (unsigned short)_kb_val->voltage_b;
  510. data_temp[3] = (unsigned short)((_kb_val->voltage_b-data_temp[2])*1000);
  511. data_temp[4] = (unsigned short)_kb_val->current_k;
  512. data_temp[5] = (unsigned short)((_kb_val->current_k-data_temp[4])*1000);
  513. data_temp[6] = (unsigned short)_kb_val->current_b;
  514. data_temp[7] = (unsigned short)((_kb_val->current_b-data_temp[6])*1000);
  515. g_modbus_write_x_reg(manger,saddr,offset,8,data_temp);
  516. return 0 ;
  517. }
  518. /// @brief 设置单相大电流通道KB
  519. /// @param manger
  520. /// @param saddr
  521. /// @param chn
  522. /// @param _kb_val
  523. /// @return
  524. int g_switch_set_ac_single_b_kb_val(void* manger,int saddr,unsigned char chn,SwitchKbVal* _kb_val)
  525. {
  526. unsigned int offset = 0;
  527. unsigned int rval = 0 ;
  528. unsigned short data_temp[8] = {0};
  529. if(chn>=4)
  530. return -1;
  531. offset = _SWITCH_AC_SINGLE_B_KB_VAL+chn*8;
  532. data_temp[0] = (unsigned short)_kb_val->voltage_k;
  533. data_temp[1] = (unsigned short)((_kb_val->voltage_k-data_temp[0])*1000);
  534. data_temp[2] = (unsigned short)_kb_val->voltage_b;
  535. data_temp[3] = (unsigned short)((_kb_val->voltage_b-data_temp[2])*1000);
  536. data_temp[4] = (unsigned short)_kb_val->current_k;
  537. data_temp[5] = (unsigned short)((_kb_val->current_k-data_temp[4])*1000);
  538. data_temp[6] = (unsigned short)_kb_val->current_b;
  539. data_temp[7] = (unsigned short)((_kb_val->current_b-data_temp[6])*1000);
  540. g_modbus_write_x_reg(manger,saddr,offset,8,data_temp);
  541. return 0 ;
  542. }
  543. /// @brief 设置直流KB值
  544. /// @param manger
  545. /// @param saddr
  546. /// @param _kb_val
  547. /// @return
  548. int g_switch_set_dc_kb_val(void* manger,int saddr,SwitchKbVal* _kb_val)
  549. {
  550. unsigned int offset = 0;
  551. unsigned short data_temp[8] = {0};
  552. offset = _SWITCH_DC_KB_VAL;
  553. data_temp[0] = (unsigned short)_kb_val->voltage_k;
  554. data_temp[1] = (unsigned short)((_kb_val->voltage_k-data_temp[0])*1000);
  555. data_temp[2] = (unsigned short)_kb_val->voltage_b;
  556. data_temp[3] = (unsigned short)((_kb_val->voltage_b-data_temp[2])*1000);
  557. data_temp[4] = (unsigned short)_kb_val->current_k;
  558. data_temp[5] = (unsigned short)((_kb_val->current_k-data_temp[4])*1000);
  559. data_temp[6] = (unsigned short)_kb_val->current_b;
  560. data_temp[7] = (unsigned short)((_kb_val->current_b-data_temp[6])*1000);
  561. g_modbus_write_reg(manger,saddr,offset,data_temp);
  562. return 0 ;
  563. }
  564. /// @brief 通用设置通道起始延时时间
  565. /// @param manger 管理类
  566. /// @param ntype 通道类型
  567. /// @param saddr 地址
  568. /// @param chn 偏移
  569. /// @param time 延时毫秒(ms)
  570. /// @return 0:成功 1失败
  571. int g_switch_set_all_start_time_delay(void* manger,int ntype,int saddr,unsigned char chn,unsigned int time)
  572. {
  573. switch (ntype)
  574. {
  575. case AC_SINGLE_S_TYPE:
  576. {
  577. return g_switch_set_ac_single_s_start_time_delay(manger,saddr,(chn-1),time);
  578. }
  579. break;
  580. case AC_SINGLE_B_TYPE:
  581. {
  582. return g_switch_set_ac_single_b_start_time_delay(manger,saddr,(chn-1),time);
  583. }
  584. break;
  585. case DC_OUT_TYPE:
  586. {
  587. //g_switch_set_dc_start_time_delay(manger,saddr,chn,time);
  588. }
  589. break;
  590. case DCPDU_TYPE:
  591. {
  592. return g_switch_set_dcpdu_start_time_delay(manger, saddr,(chn-1), time/1000);
  593. }
  594. break;
  595. case TREE_AC_TYPE:
  596. {
  597. return g_switch_set_t_ac_start_time_delay(manger, saddr,(chn-1), time/1000);
  598. }
  599. case AC_MULTI_S_TYPE:
  600. case AC_MULTI_B_TYPE:
  601. case DC_IN_TYPE:
  602. default:
  603. return 1;
  604. break;
  605. }
  606. return 1;
  607. }
  608. /// @brief 通用设置通道起始延时时间
  609. /// @param manger 管理类
  610. /// @param ntype 通道类型
  611. /// @param saddr 地址
  612. /// @param chn 偏移
  613. /// @param time 延时毫秒(ms)
  614. /// @return 0:成功 1失败
  615. int g_switch_set_all_stop_time_delay(void* manger,int ntype,int saddr,unsigned char chn,unsigned int time)
  616. {
  617. switch (ntype)
  618. {
  619. case AC_SINGLE_S_TYPE:
  620. {
  621. return g_switch_set_ac_single_s_stop_time_delay(manger,saddr,(chn-1),time);
  622. }
  623. break;
  624. case AC_SINGLE_B_TYPE:
  625. {
  626. return g_switch_set_ac_single_b_stop_time_delay(manger,saddr,(chn-1),time);
  627. }
  628. break;
  629. case DC_OUT_TYPE:
  630. {
  631. }
  632. break;
  633. case DCPDU_TYPE:
  634. {
  635. return g_switch_set_dcpdu_stop_time_delay(manger, saddr,(chn-1), time/1000);
  636. }
  637. break;
  638. case TREE_AC_TYPE:
  639. {
  640. return g_switch_set_t_ac_stop_time_delay(manger, saddr,(chn-1), time/1000);
  641. }
  642. case AC_MULTI_S_TYPE:
  643. case AC_MULTI_B_TYPE:
  644. case DC_IN_TYPE:
  645. default:
  646. return 1;
  647. break;
  648. }
  649. return 1;
  650. }
  651. /// @brief 通用设置通道控制
  652. /// @param manger 管理类
  653. /// @param ntype 通道类型
  654. /// @param saddr 地址
  655. /// @param chn 偏移
  656. /// @param sts open/close
  657. /// @return 0:成功 1失败
  658. int g_switch_set_all_chn_ctrl(void* manger,GlobalPowerManger* _globalPowerMangerTemp,int saddr,unsigned char chn,unsigned short sts,bool isgroup)
  659. {
  660. switch (_globalPowerMangerTemp->product_ch_type)
  661. {
  662. case AC_SINGLE_S_TYPE:
  663. {
  664. if (sts==1)
  665. {
  666. if(_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable==1)sts|=ENABLE_V_UP;
  667. if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable==1)sts|=ENABLE_V_DOWN;
  668. if(_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable==1)sts|=ENABLE_A_UP;
  669. if(_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable==1)sts|=ENABLE_W_UP;
  670. if(_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable==1)sts|=ENABLE_P_UP;
  671. }
  672. return g_switch_set_ac_single_s_chn_ctrl(manger,saddr,(chn-1),sts);
  673. }
  674. break;
  675. case AC_SINGLE_B_TYPE:
  676. {
  677. return g_switch_set_ac_single_b_chn_ctrl(manger,saddr,(chn-1),sts);
  678. }
  679. break;
  680. case DC_OUT_TYPE:
  681. {
  682. //return g_switch_set_dc_ctrl();
  683. }
  684. break;
  685. case DCPDU_TYPE:
  686. {
  687. return g_switch_set_dcpdu_chn_ctrl(manger,saddr,(chn-1),sts);
  688. }
  689. break;
  690. case TREE_AC_TYPE:
  691. {
  692. if (sts==1)
  693. {
  694. if(_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable==1)sts|=ENABLE_TAC_V_UP;
  695. if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable==1)sts|=ENABLE_TAC_V_DOWN;
  696. if(_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable==1)sts|=ENABLE_TAC_A_UP;
  697. if(_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable==1)sts|=ENABLE_TAC_W_UP;
  698. if(_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable==1)sts|=ENABLE_TAC_P_UP;
  699. }
  700. if (isgroup)
  701. {
  702. sts |= ENABLE_TAC_STIME;
  703. sts |= ENABLE_TAC_ETIME;
  704. }
  705. return g_switch_set_t_ac_chn_ctrl(manger, saddr, (chn - 1), sts);
  706. }
  707. break;
  708. case AC_MULTI_S_TYPE:
  709. case AC_MULTI_B_TYPE:
  710. case DC_IN_TYPE:
  711. default:
  712. return 1;
  713. break;
  714. }
  715. return 1;
  716. }
  717. int g_switch_set_all_ctrl(void* manger,int ntype,int saddr,unsigned short sts)
  718. {
  719. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  720. unsigned short switch_ctrl[AC_SINGLE_S_CUR_CHN_NUM] = {0};
  721. for (size_t i = 0; i < AC_SINGLE_S_CUR_CHN_NUM; i++)
  722. {
  723. switch_ctrl[i] = sts ;
  724. }
  725. switch (ntype)
  726. {
  727. case AC_SINGLE_S_TYPE:
  728. {
  729. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  730. {
  731. if(_globalPowerMangerTemp->product_saddr != saddr)continue;
  732. if(_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_V_UP;
  733. if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_V_DOWN;
  734. if(_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_A_UP;
  735. if(_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_W_UP;
  736. if(_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_P_UP;
  737. }
  738. return g_switch_set_ac_single_s_ctrl(manger, saddr, &switch_ctrl);
  739. }
  740. break;
  741. case AC_SINGLE_B_TYPE:
  742. {
  743. unsigned short switch_ctrl[AC_SINGLE_B_CUR_CHN_NUM] = {0};
  744. for (size_t i = 0; i < AC_SINGLE_B_CUR_CHN_NUM; i++)
  745. {
  746. switch_ctrl[i] = sts;
  747. }
  748. int nIndex = 0;
  749. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  750. {
  751. if(_globalPowerMangerTemp->product_saddr != saddr)continue;
  752. if(_globalPowerMangerTemp->global_over_manager->product_vol_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_V_UP;
  753. if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_V_DOWN;
  754. if(_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_A_UP;
  755. if(_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_W_UP;
  756. if(_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable==1)switch_ctrl[_globalPowerMangerTemp->product_ch_addr]|=ENABLE_P_UP;
  757. }
  758. return g_switch_set_ac_single_b_ctrl(manger,saddr,&switch_ctrl);
  759. }
  760. break;
  761. case DC_OUT_TYPE:
  762. {
  763. //return g_switch_set_dc_ctrl();
  764. }
  765. break;
  766. case DCPDU_TYPE:
  767. {
  768. return g_switch_set_dcpdu_ctrl(manger, saddr, &switch_ctrl);
  769. }
  770. break;
  771. case TREE_AC_TYPE:
  772. {
  773. return g_switch_set_t_ac_ctrl(manger, saddr,&switch_ctrl);
  774. }
  775. case AC_MULTI_S_TYPE:
  776. case AC_MULTI_B_TYPE:
  777. case DC_IN_TYPE:
  778. default:
  779. return 1;
  780. break;
  781. }
  782. return 1;
  783. }
  784. int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,GlobalOverManager* _global_over_manager)
  785. {
  786. int ret =0;
  787. if (chn == 0)
  788. {
  789. ret = g_switch_set_t_ac_in_threshold(manger, 1, _global_over_manager);
  790. }
  791. else
  792. {
  793. switch (ntype)
  794. {
  795. case AC_SINGLE_S_TYPE:
  796. {
  797. return g_switch_set_ac_single_threshold(manger, saddr, (chn - 1), _global_over_manager);
  798. }
  799. break;
  800. case AC_SINGLE_B_TYPE:
  801. {
  802. }
  803. break;
  804. case DC_OUT_TYPE:
  805. {
  806. // return g_switch_set_dc_ctrl();
  807. }
  808. break;
  809. case DCPDU_TYPE:
  810. {
  811. ret = g_switch_set_dcpdu_max_vol_threshold(manger, saddr, (chn - 1), _global_over_manager);
  812. ret = g_switch_set_dcpdu_min_vol_threshold(manger, saddr, (chn - 1), _global_over_manager);
  813. ret = g_switch_set_dcpdu_max_cur_threshold(manger, saddr, (chn - 1), _global_over_manager);
  814. return ret;
  815. }
  816. break;
  817. case TREE_AC_TYPE:
  818. {
  819. ret = g_switch_set_t_ac_max_vol_threshold(manger, saddr, (chn - 1), _global_over_manager);
  820. if (ret < 0)
  821. {
  822. log_e("Threshold Set Error=%s", modbus_strerror(errno));
  823. }
  824. ret = g_switch_set_t_ac_min_vol_threshold(manger, saddr, (chn - 1), _global_over_manager);
  825. if (ret < 0)
  826. {
  827. log_e("Threshold Set Error=%s", modbus_strerror(errno));
  828. }
  829. ret = g_switch_set_t_ac_max_cur_threshold(manger, saddr, (chn - 1), _global_over_manager);
  830. if (ret < 0)
  831. {
  832. log_e("Threshold Set Error=%s", modbus_strerror(errno));
  833. }
  834. ret = g_switch_set_t_ac_max_power_threshold(manger, saddr, (chn - 1), _global_over_manager);
  835. if (ret < 0)
  836. {
  837. log_e("Threshold Set Error=%s", modbus_strerror(errno));
  838. }
  839. ret = g_switch_set_t_ac_max_pwrcon_threshold(manger, saddr, (chn - 1), _global_over_manager);
  840. if (ret < 0)
  841. {
  842. log_e("Threshold Set Error=%s", modbus_strerror(errno));
  843. }
  844. return ret;
  845. }
  846. break;
  847. case AC_MULTI_S_TYPE:
  848. case AC_MULTI_B_TYPE:
  849. case DC_IN_TYPE:
  850. default:
  851. return 1;
  852. break;
  853. }
  854. }
  855. return 1;
  856. }
  857. int g_switch_get_all_out_info(void* manger,int ntype,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  858. {
  859. switch (ntype)
  860. {
  861. case AC_SINGLE_S_TYPE:
  862. {
  863. return g_switch_get_ac_single_s_all_cur_info(manger, saddr, nNumb, _power, _warning);
  864. }
  865. case DCPDU_TYPE:
  866. {
  867. return g_switch_get_dcpdu_all_out_info(manger, saddr, nNumb, _power, _warning);
  868. }
  869. break;
  870. case TREE_AC_TYPE:
  871. {
  872. return g_switch_get_t_ac_all_out_info(manger, saddr, nNumb, _power, _warning);
  873. }
  874. break;
  875. case RS485_Type:
  876. {
  877. _power->current = hlw8110_read_IA(__globalDeviceManage._RS485LowConfData);
  878. if(_power->current < 0.006)
  879. _power->current = 0;
  880. // log_d("get _power->current sucessful!!!\n");
  881. _power->voltage = hlw8110_read_UV(__globalDeviceManage._RS485LowConfData);
  882. if(_power->voltage < 2)
  883. _power->voltage = 0;
  884. // log_d("get _power->voltage sucessful!!!\n");
  885. _power->power = hwl8110_read_PA(__globalDeviceManage._RS485LowConfData);
  886. // log_d("get _power->power sucessful!!!\n");
  887. _power->factor = hwl8110_read_PF(__globalDeviceManage._RS485LowConfData);
  888. // log_d("get _power->factor sucessful!!!\n");
  889. _power->freq = hwl8110_read_LineFreq(__globalDeviceManage._RS485LowConfData);
  890. if(_power->voltage == 0)
  891. _power->freq = 0;
  892. //_power->a = hlw8110_read_Angle(__globalDeviceManage._RS485LowConfData);
  893. _power->consumption = hwl8110_read_EA(__globalDeviceManage._RS485LowConfData);
  894. __globalDeviceManage.for85_data.angle = (hlw8110_read_Angle(__globalDeviceManage._RS485LowConfData)*1000);
  895. // log_d("get _power->consumption sucessful!!!\n");
  896. int ret=hlw8110_read_Status(__globalDeviceManage._RS485LowConfData,&_power->status);
  897. if (ret==1)
  898. {
  899. log_d("error gpio ReadError");
  900. }
  901. // log_d("V:%0.3f,A:%0.3f,P:%0.3f,PF:%0.3f,F_consumption:%0.3f,F_Factor:%0.3f",_power->voltage,
  902. // _power->current,
  903. // _power->power,
  904. // _power->freq,
  905. // _power->consumption,
  906. // _power->factor);
  907. }
  908. break;
  909. case AC_MULTI_S_TYPE:
  910. case AC_MULTI_B_TYPE:
  911. case DC_IN_TYPE:
  912. default:
  913. return 1;
  914. break;
  915. }
  916. return 1;
  917. }
  918. int g_switch_get_dcpdu_out_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  919. {
  920. unsigned int offset = 0;
  921. unsigned int val = 0 ;
  922. unsigned short data_temp[12] = {0};
  923. unsigned int status_temp = 0 ;
  924. offset = _SWITCH_DCPDU_OUT_INFO + chn * 4;
  925. //读取4个寄存器
  926. int ret = g_modbus_read_x_reg(manger,saddr,offset,8,data_temp);
  927. //解电压数据
  928. float value = (data_temp[1] << 16) + data_temp[0];
  929. _power->voltage = value / 1000.0;
  930. //解电流数据
  931. value = (data_temp[3] << 16) + data_temp[2];
  932. _power->current = value / 1000.0;
  933. //解功率数据
  934. value = (data_temp[5] << 16) + data_temp[4];
  935. _power->power = value / 1000.0;
  936. value = (data_temp[7] << 16) + data_temp[6];
  937. _power->consumption = value / 1000.0;
  938. //获取开关状态
  939. offset = _SWITCH_DCPDU_STS_INFO;
  940. memset(data_temp,0,sizeof(data_temp));
  941. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  942. status_temp = (data_temp[1] << 16) + data_temp[0];
  943. _power->status = (status_temp >> chn) & 0x1;
  944. //获取故障状态
  945. offset = _SWITCH_DCPDU_STS_ERROR;
  946. memset(data_temp,0,sizeof(data_temp));
  947. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  948. status_temp = (data_temp[1] << 16) + data_temp[0];
  949. _warning->w_voltage_up = (status_temp >> chn) & 0x1;
  950. return ret;
  951. }
  952. int g_switch_get_dcpdu_all_out_info(void* manger,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  953. {
  954. unsigned int offset = 0;
  955. unsigned int value = 0;
  956. unsigned short data_temp[64] = {0};
  957. unsigned int status_temp = 0;
  958. int ret = 0;
  959. offset = _SWITCH_DCPDU_OUT_INFO;
  960. // 读取4个寄存器
  961. // 读取寄存器
  962. memset(data_temp, 0, sizeof(data_temp));
  963. ret = g_modbus_read_x_reg(manger, saddr, offset, 64, data_temp);
  964. if (ret < 0)
  965. {
  966. log_w("g_switch_get_t_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  967. // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  968. return ret;
  969. }
  970. // 解电压数据
  971. for (size_t i = 0; i < nNumb; i++)
  972. {
  973. int Index = i * 8;
  974. // 解电压数据
  975. float value = (data_temp[1 + Index] << 16) + data_temp[0 + Index];
  976. _power[i].voltage = value / 1000.0;
  977. // 解电流数据
  978. value = (data_temp[3 + Index] << 16) + data_temp[2 + Index];
  979. _power[i].current = value / 1000.0;
  980. // 解功率数据
  981. value = (data_temp[5 + Index] << 16) + data_temp[4 + Index];
  982. _power[i].power = value / 1000.0;
  983. value = (data_temp[7 + Index] << 16) + data_temp[6 + Index];
  984. _power[i].consumption = value / 1000.0;
  985. }
  986. offset = _SWITCH_DCPDU_STS_INFO;
  987. // 读取寄存器
  988. memset(data_temp, 0, sizeof(data_temp));
  989. ret = g_modbus_read_x_reg(manger, saddr, offset, 2, &data_temp);
  990. // 解控制数据
  991. if (ret < 0)
  992. {
  993. return ret;
  994. }
  995. for (size_t i = 0; i < nNumb; i++)
  996. {
  997. status_temp = (data_temp[1] << 16) + data_temp[0];
  998. _power[i].status = (status_temp >> i) & 0x1;
  999. }
  1000. // 获取故障状态
  1001. offset = _SWITCH_DCPDU_STS_ERROR;
  1002. memset(data_temp, 0, sizeof(data_temp));
  1003. ret = g_modbus_read_x_reg(manger, saddr, offset, 2, &data_temp);
  1004. if (ret < 0)
  1005. {
  1006. return ret;
  1007. }
  1008. for (size_t i = 0; i < nNumb; i++)
  1009. {
  1010. status_temp = (data_temp[1] << 16) + data_temp[0];
  1011. _warning[i].w_voltage_up = (status_temp >> i) & 0x1;
  1012. }
  1013. return 0;
  1014. }
  1015. int g_switch_get_dcpdu_in_info(void* manger,int saddr,PowerInfo* _power)
  1016. {
  1017. unsigned int offset = 0;
  1018. unsigned int value = 0 ;
  1019. unsigned short data_temp[18] = {0};
  1020. offset = _SWITCH_DCPDU_IN_INFO;
  1021. //读取4个寄存器
  1022. g_modbus_read_x_reg(manger,saddr,offset,16,data_temp);
  1023. //解电压数据
  1024. value = (data_temp[1] << 16) + data_temp[0];
  1025. _power->voltage = value / 1000.0;
  1026. //解电流数据
  1027. value = (data_temp[3] << 16) + data_temp[2];
  1028. _power->current = value / 1000.0;
  1029. //解功率数据
  1030. value = (data_temp[5] << 16) + data_temp[4];
  1031. _power->power = value / 1000.0;
  1032. value = (data_temp[7] << 16) + data_temp[6];
  1033. _power->consumption = value / 1000.0;
  1034. return 0;
  1035. }
  1036. int g_switch_get_dcpdu_start_time_delay(void* manger,int saddr,unsigned int* time)
  1037. {
  1038. unsigned int offset = 0;
  1039. unsigned short data_temp[16];
  1040. offset = _SWITCH_DCPDU_START_DELAY_TIME;
  1041. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1042. unsigned int value = 0;
  1043. for(int i = 0; i < 8; i++)
  1044. {
  1045. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1046. time[i] = value;
  1047. }
  1048. return ret;
  1049. }
  1050. int g_switch_get_dcpdu_stop_time_delay(void* manger,int saddr,unsigned int* time)
  1051. {
  1052. unsigned int offset = 0;
  1053. unsigned short data_temp[16];
  1054. offset = _SWITCH_DCPDU_STOP_DELAY_TIME;
  1055. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1056. unsigned int value = 0;
  1057. for(int i = 0; i < 8; i++)
  1058. {
  1059. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1060. time[i] = value;
  1061. }
  1062. return ret;
  1063. }
  1064. int g_switch_set_dcpdu_start_time_delay(void* manger,int saddr, int ch,unsigned int time)
  1065. {
  1066. unsigned int offset = 0;
  1067. unsigned short data_temp[4];
  1068. offset = _SWITCH_DCPDU_START_DELAY_TIME + ch ;
  1069. data_temp[0] = time & 0xFFFF;
  1070. data_temp[1] = (time >> 16) & 0XFFFF;
  1071. int reg = g_modbus_write_x_reg(manger,saddr,offset,2,data_temp);
  1072. if (reg>=0)
  1073. {
  1074. log_d("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1075. }
  1076. else
  1077. {
  1078. log_w("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1079. }
  1080. return reg;
  1081. }
  1082. int g_switch_set_dcpdu_stop_time_delay(void* manger,int saddr, int ch, unsigned int time)
  1083. {
  1084. unsigned int offset = 0;
  1085. unsigned short data_temp[4];
  1086. offset = _SWITCH_DCPDU_STOP_DELAY_TIME + ch;
  1087. data_temp[0] = time & 0XFFFF;
  1088. data_temp[1] = (time >> 16) & 0xFFFF;
  1089. int reg = g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1090. if (reg>=0)
  1091. {
  1092. log_d("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1093. }
  1094. else
  1095. {
  1096. log_w("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1097. }
  1098. return reg;
  1099. }
  1100. int g_switch_set_dcpdu_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  1101. {
  1102. unsigned int offset = 0;
  1103. if(chn > 8 || chn < 0) return -1;
  1104. offset = _SWITCH_DCPDU_STS_INFO;
  1105. unsigned short data_temp[2];
  1106. //memset(data_temp,0,sizeof(data_temp));
  1107. int ret=g_modbus_read_x_reg_delay(manger,saddr,offset,2, data_temp);
  1108. if (ret<0)
  1109. {
  1110. log_w("Ctrl Error Ret=%d:%s",ret,modbus_strerror(errno));
  1111. return -1;
  1112. }
  1113. log_w("Ctrl get addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1114. unsigned short mask = ~(1 << chn);
  1115. data_temp[0] &= mask;
  1116. data_temp[0] |= (sts << chn);
  1117. log_w("Ctrl set addr%d chn %d Mark=%d,%d",saddr,chn,data_temp[1],data_temp[0]);
  1118. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1119. }
  1120. //一次性刷新一个板子的数据
  1121. int g_switch_set_dcpdu_chns_ctrl(void* manger,int saddr,unsigned short sts,int nSet)
  1122. {
  1123. unsigned int offset = 0;
  1124. offset = _SWITCH_DCPDU_STS_INFO;
  1125. unsigned short data_temp[2];
  1126. //memset(data_temp,0,sizeof(data_temp));
  1127. int ret=g_modbus_read_x_reg_delay(manger,saddr,offset,2, data_temp);
  1128. if (ret<0)
  1129. {
  1130. log_w("Ctrl Error Ret=%d:%s",ret,modbus_strerror(errno));
  1131. return -1;
  1132. }
  1133. log_w("Ctrl get addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1134. if (nSet==0)
  1135. { //关闭
  1136. sts=~sts;
  1137. data_temp[0] &= sts;
  1138. }else{
  1139. //开启
  1140. data_temp[0] |= sts;
  1141. }
  1142. log_w("Ctrl set addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1143. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1144. }
  1145. int g_switch_set_dcpdu_ctrl(void* manger,int saddr,unsigned short* sts)
  1146. {
  1147. unsigned int offset = 0;
  1148. unsigned short data_temp[2];
  1149. if (sts[0] == 1)
  1150. {
  1151. offset = _SWITCH_DCPDU_ALL_OPEN_INFO;
  1152. data_temp[0] = 0xFFFF;
  1153. data_temp[1] = 0xFFFF;
  1154. }
  1155. else
  1156. {
  1157. offset = _SWITCH_DCPDU_ALL_CLOSE_INFO;
  1158. data_temp[0] = 0;
  1159. data_temp[1] = 0;
  1160. }
  1161. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1162. }
  1163. int g_switch_get_dcpdu_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1164. {
  1165. unsigned int offset = 0;
  1166. unsigned short data_temp[4];
  1167. memset(data_temp,0,sizeof(data_temp));
  1168. unsigned int value = 0;
  1169. offset = _SWITCH_DCPDU_MAX_VOL_THRESHOLD + chn;
  1170. int ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1171. value = (data_temp[1] << 16) + data_temp[0];
  1172. _global_over_manager->product_vol_upper_threshold = value / 1000.0;
  1173. offset = _SWITCH_DCPDU_MIN_VOL_THRESHOLD + chn;
  1174. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1175. value = (data_temp[1] << 16) + data_temp[0];
  1176. _global_over_manager->product_vol_lower_threshold = value / 1000.0;
  1177. offset = _SWITCH_DCPDU_MAX_CUR_THRESHOLD + chn;
  1178. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1179. value = (data_temp[1] << 16) + data_temp[0];
  1180. _global_over_manager->product_cur_upper_threshold = value / 1000.0;
  1181. offset = _SWITCH_DCPDU_MIN_CUR_THRESHOLD + chn;
  1182. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1183. value = (data_temp[1] << 16) + data_temp[0];
  1184. _global_over_manager->product_cur_lower_threshold = value / 1000.0;
  1185. return ret;
  1186. }
  1187. int g_switch_set_dcpdu_max_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1188. {
  1189. unsigned int offset = 0;
  1190. unsigned short data_temp[4];
  1191. memset(data_temp,0,sizeof(data_temp));
  1192. unsigned int value = 0;
  1193. offset = _SWITCH_DCPDU_MAX_VOL_THRESHOLD + chn;
  1194. value = _global_over_manager->product_vol_upper_threshold * 1000;
  1195. data_temp[0] = value & 0XFFFF;
  1196. data_temp[1] = (value >> 16) & 0xFFFF;
  1197. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1198. }
  1199. int g_switch_set_dcpdu_min_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1200. {
  1201. unsigned int offset = 0;
  1202. unsigned short data_temp[4];
  1203. memset(data_temp,0,sizeof(data_temp));
  1204. unsigned int value = 0;
  1205. offset = _SWITCH_DCPDU_MIN_VOL_THRESHOLD + chn;
  1206. value = _global_over_manager->product_vol_lower_threshold * 1000;
  1207. data_temp[0] = value & 0XFFFF;
  1208. data_temp[1] = (value >> 16) & 0xFFFF;
  1209. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1210. }
  1211. int g_switch_set_dcpdu_max_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1212. {
  1213. unsigned int offset = 0;
  1214. unsigned short data_temp[4];
  1215. memset(data_temp,0,sizeof(data_temp));
  1216. unsigned int value = 0;
  1217. offset = _SWITCH_DCPDU_MAX_CUR_THRESHOLD + chn;
  1218. value = _global_over_manager->product_cur_upper_threshold * 1000;
  1219. data_temp[0] = value & 0XFFFF;
  1220. data_temp[1] = (value >> 16) & 0xFFFF;
  1221. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1222. }
  1223. int g_switch_set_dcpdu_min_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1224. {
  1225. unsigned int offset = 0;
  1226. unsigned short data_temp[4];
  1227. memset(data_temp,0,sizeof(data_temp));
  1228. unsigned int value = 0;
  1229. offset = _SWITCH_DCPDU_MIN_CUR_THRESHOLD + chn;
  1230. value = _global_over_manager->product_cur_lower_threshold * 1000;
  1231. data_temp[0] = value & 0XFFFF;
  1232. data_temp[1] = (value >> 16) & 0xFFFF;
  1233. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1234. }
  1235. int g_switch_get_t_ac_out_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  1236. {
  1237. unsigned int offset = 0;
  1238. unsigned int val = 0 ;
  1239. unsigned short data_temp[16] = {0};
  1240. unsigned int status_temp = 0 ;
  1241. offset = _SWITCH_T_AC_OUT_INFO + chn * 8;
  1242. //读取4个寄存器
  1243. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,data_temp);
  1244. //解电压数据
  1245. float value = (data_temp[1] << 16) + data_temp[0];
  1246. _power->voltage = value / 1000.0;
  1247. //解电流数据
  1248. value = (data_temp[3] << 16) + data_temp[2];
  1249. _power->current = value / 1000.0;
  1250. //解功率数据
  1251. value = (data_temp[5] << 16) + data_temp[4];
  1252. _power->power = value / 1000.0;
  1253. //无功
  1254. value = (data_temp[7] << 16) + data_temp[6];
  1255. //视在功率
  1256. value = (data_temp[9] << 16) + data_temp[8];
  1257. //解频率数据
  1258. val = (data_temp[11]<<16)+data_temp[10];
  1259. _power->freq = val/1000.0;
  1260. //解耗电量数据
  1261. val = (data_temp[13]<<16)+data_temp[12];
  1262. _power->consumption = val/1000.0;
  1263. //解功率因素数据
  1264. val = (data_temp[15]<<16)+data_temp[14];
  1265. _power->factor = val/1000.0;
  1266. //获取开关状态
  1267. offset = _SWITCH_T_AC_OUT_ENABLE+ chn;
  1268. memset(data_temp,0,sizeof(data_temp));
  1269. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1270. _power->status = data_temp[0] & BIT_00;
  1271. //获取故障状态
  1272. offset = _SWITCH_T_AC_OUT_ERROR+ chn;
  1273. memset(data_temp,0,sizeof(data_temp));
  1274. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1275. _warning->w_voltage_up = data_temp[0] & ENABLE_TAC_V_UP;
  1276. _warning->w_voltage_down = data_temp[0] & ENABLE_TAC_V_DOWN;
  1277. _warning->w_current = data_temp[0] & ENABLE_TAC_A_UP;
  1278. _warning->w_power = data_temp[0] & ENABLE_TAC_W_UP;
  1279. _warning->w_consumption = data_temp[0] & ENABLE_TAC_P_UP;
  1280. return ret;
  1281. }
  1282. int g_switch_get_t_ac_all_out_info(void* manger,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  1283. {
  1284. unsigned int offset = 0;
  1285. unsigned int val = 0 ;
  1286. unsigned short data_temp[144] = {0};
  1287. unsigned int status_temp = 0 ;
  1288. offset = _SWITCH_T_AC_OUT_INFO;
  1289. //读取4个寄存器
  1290. int ret = g_modbus_read_x_reg(manger, saddr, offset, 80, data_temp);
  1291. if (ret < 0)
  1292. {
  1293. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1294. return ret;
  1295. }
  1296. offset = _SWITCH_T_AC_OUT_INFO+40;
  1297. unsigned short* DataTemp=data_temp+80;
  1298. ret = g_modbus_read_x_reg(manger, saddr, offset, 64, DataTemp);
  1299. if (ret < 0)
  1300. {
  1301. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1302. return ret;
  1303. }
  1304. for (size_t i = 0; i < nNumb; i++)
  1305. {
  1306. int Index = i * 16;
  1307. // 解电压数据
  1308. float value = (data_temp[1+Index] << 16) + data_temp[0+Index];
  1309. _power[i].voltage = value / 1000.0;
  1310. // 解电流数据
  1311. value = (data_temp[3+Index] << 16) + data_temp[2+Index];
  1312. _power[i].current = value / 1000.0;
  1313. // 解功率数据
  1314. value = (data_temp[5+Index] << 16) + data_temp[4+Index];
  1315. _power[i].power = value / 1000.0;
  1316. // 无功
  1317. value = (data_temp[7+Index] << 16) + data_temp[6+Index];
  1318. // 视在功率
  1319. value = (data_temp[9+Index] << 16) + data_temp[8+Index];
  1320. // 解频率数据
  1321. val = (data_temp[11+Index] << 16) + data_temp[10+Index];
  1322. _power[i].freq = val / 1000.0;
  1323. // 解耗电量数据
  1324. val = (data_temp[13+Index] << 16) + data_temp[12+Index];
  1325. _power[i].consumption = val / 1000.0;
  1326. // 解功率因素数据
  1327. val = (data_temp[15+Index] << 16) + data_temp[14+Index];
  1328. _power[i].factor = val / 1000.0;
  1329. }
  1330. //获取开关状态
  1331. offset = _SWITCH_T_AC_OUT_ENABLE;
  1332. memset(data_temp,0,sizeof(data_temp));
  1333. ret = g_modbus_read_x_reg(manger,saddr,offset, 18,data_temp);
  1334. if (ret < 0)
  1335. {
  1336. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1337. return ret;
  1338. }
  1339. for (size_t i = 0; i < nNumb; i++)
  1340. {
  1341. int Index = i * 2;
  1342. _power[i].status = data_temp[0+Index] & BIT_00;
  1343. }
  1344. //获取故障状态
  1345. offset = _SWITCH_T_AC_OUT_ERROR;
  1346. memset(data_temp,0,sizeof(data_temp));
  1347. ret = g_modbus_read_x_reg(manger,saddr,offset, 18,data_temp);
  1348. if (ret < 0)
  1349. {
  1350. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1351. return ret;
  1352. }
  1353. for (size_t i = 0; i < nNumb; i++)
  1354. {
  1355. int Index = i * 2;
  1356. _warning[i].w_voltage_up = data_temp[0+Index] & ENABLE_TAC_V_UP;
  1357. _warning[i].w_voltage_down = data_temp[0+Index] & ENABLE_TAC_V_DOWN;
  1358. _warning[i].w_current = data_temp[0+Index] & ENABLE_TAC_A_UP;
  1359. _warning[i].w_power = data_temp[0+Index] & ENABLE_TAC_W_UP;
  1360. _warning[i].w_consumption = data_temp[0+Index] & ENABLE_TAC_P_UP;
  1361. }
  1362. return ret;
  1363. }
  1364. int g_switch_get_t_ac_start_time_delay(void* manger,int saddr,unsigned int* time)
  1365. {
  1366. unsigned int offset = 0;
  1367. unsigned short data_temp[16];
  1368. offset = _SWITCH_T_AC_START_DELAY_TIME;
  1369. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1370. unsigned int value = 0;
  1371. for(int i = 0; i < 8; i++)
  1372. {
  1373. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1374. time[i] = value;
  1375. }
  1376. return ret;
  1377. }
  1378. int g_switch_get_t_ac_stop_time_delay(void* manger,int saddr,unsigned int* time)
  1379. {
  1380. unsigned int offset = 0;
  1381. unsigned short data_temp[16];
  1382. offset = _SWITCH_T_AC_STOP_DELAY_TIME;
  1383. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1384. unsigned int value = 0;
  1385. for(int i = 0; i < 8; i++)
  1386. {
  1387. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1388. time[i] = value;
  1389. }
  1390. return ret;
  1391. }
  1392. int g_switch_get_t_ac_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1393. {
  1394. unsigned int offset = 0;
  1395. unsigned short data_temp[4];
  1396. memset(data_temp,0,sizeof(data_temp));
  1397. unsigned int value = 0;
  1398. float fvalue=0.0;
  1399. offset = _SWITCH_T_AC_MAX_VOL_THRESHOLD + chn;
  1400. int ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1401. value = (data_temp[1] << 16) + data_temp[0];
  1402. fvalue=(float)value;
  1403. _global_over_manager->product_vol_upper_threshold = fvalue / 1000.0;
  1404. offset = _SWITCH_T_AC_MIN_VOL_THRESHOLD + chn;
  1405. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1406. value = (data_temp[1] << 16) + data_temp[0];
  1407. fvalue=(float)value;
  1408. _global_over_manager->product_vol_lower_threshold = fvalue / 1000.0;
  1409. offset = _SWITCH_T_AC_MAX_CUR_THRESHOLD + chn;
  1410. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1411. value = (data_temp[1] << 16) + data_temp[0];
  1412. fvalue=(float)value;
  1413. _global_over_manager->product_cur_upper_threshold = fvalue / 1000.0;
  1414. offset = _SWITCH_T_AC_MAX_PWR_THRESHOLD + chn;
  1415. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1416. value = (data_temp[1] << 16) + data_temp[0];
  1417. fvalue=(float)value;
  1418. _global_over_manager->product_pwr_upper_threshold = fvalue / 1000.0;
  1419. offset = _SWITCH_T_AC_MAX_PWRCON_THRESHOLD + chn;
  1420. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1421. value = (data_temp[1] << 16) + data_temp[0];
  1422. fvalue=(float)value;
  1423. _global_over_manager->product_pwrcon_upper_threshold = fvalue / 1000.0;
  1424. return ret;
  1425. }
  1426. int g_switch_set_t_ac_max_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1427. {
  1428. unsigned int offset = 0;
  1429. unsigned short data_temp[4];
  1430. memset(data_temp,0,sizeof(data_temp));
  1431. unsigned int value = 0;
  1432. offset = _SWITCH_T_AC_MAX_VOL_THRESHOLD + chn;
  1433. value = _global_over_manager->product_vol_upper_threshold * 1000;
  1434. data_temp[0] = value & 0XFFFF;
  1435. data_temp[1] = (value >> 16) & 0xFFFF;
  1436. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1437. }
  1438. int g_switch_set_t_ac_min_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1439. {
  1440. unsigned int offset = 0;
  1441. unsigned short data_temp[4];
  1442. memset(data_temp,0,sizeof(data_temp));
  1443. unsigned int value = 0;
  1444. offset = _SWITCH_T_AC_MIN_VOL_THRESHOLD + chn;
  1445. value = _global_over_manager->product_vol_lower_threshold * 1000;
  1446. data_temp[0] = value & 0XFFFF;
  1447. data_temp[1] = (value >> 16) & 0xFFFF;
  1448. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1449. }
  1450. int g_switch_set_t_ac_max_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1451. {
  1452. unsigned int offset = 0;
  1453. unsigned short data_temp[4];
  1454. memset(data_temp,0,sizeof(data_temp));
  1455. unsigned int value = 0;
  1456. offset = _SWITCH_T_AC_MAX_CUR_THRESHOLD + chn;
  1457. value = _global_over_manager->product_cur_upper_threshold * 1000;
  1458. data_temp[0] = value & 0XFFFF;
  1459. data_temp[1] = (value >> 16) & 0xFFFF;
  1460. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1461. }
  1462. int g_switch_set_t_ac_max_power_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1463. {
  1464. unsigned int offset = 0;
  1465. unsigned short data_temp[4];
  1466. memset(data_temp,0,sizeof(data_temp));
  1467. unsigned int value = 0;
  1468. offset = _SWITCH_T_AC_MAX_PWR_THRESHOLD + chn;
  1469. value = _global_over_manager->product_pwr_upper_threshold * 1000;
  1470. data_temp[0] = value & 0XFFFF;
  1471. data_temp[1] = (value >> 16) & 0xFFFF;
  1472. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1473. }
  1474. int g_switch_set_t_ac_max_pwrcon_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1475. {
  1476. unsigned int offset = 0;
  1477. unsigned short data_temp[4];
  1478. memset(data_temp,0,sizeof(data_temp));
  1479. unsigned int value = 0;
  1480. offset = _SWITCH_T_AC_MAX_PWRCON_THRESHOLD + chn;
  1481. value = _global_over_manager->product_pwrcon_upper_threshold * 1000;
  1482. data_temp[0] = value & 0XFFFF;
  1483. data_temp[1] = (value >> 16) & 0xFFFF;
  1484. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1485. }
  1486. int g_switch_set_t_ac_start_time_delay(void* manger,int saddr,int ch, unsigned int time)
  1487. {
  1488. unsigned int offset = 0;
  1489. unsigned short data_temp[4];
  1490. offset = _SWITCH_T_AC_START_DELAY_TIME + ch ;
  1491. data_temp[0] = time & 0xFFFF;
  1492. data_temp[1] = (time >> 16) & 0XFFFF;
  1493. int reg = g_modbus_write_x_reg(manger,saddr,offset,2,data_temp);
  1494. if (reg>=0)
  1495. {
  1496. log_d("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1497. }
  1498. else
  1499. {
  1500. log_w("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1501. }
  1502. return reg;
  1503. }
  1504. int g_switch_set_t_ac_stop_time_delay(void* manger,int saddr,int ch, unsigned int time)
  1505. {
  1506. unsigned int offset = 0;
  1507. unsigned short data_temp[4];
  1508. offset = _SWITCH_T_AC_STOP_DELAY_TIME + ch;
  1509. data_temp[0] = time & 0XFFFF;
  1510. data_temp[1] = (time >> 16) & 0xFFFF;
  1511. int reg = g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1512. if (reg>=0)
  1513. {
  1514. log_d("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1515. }
  1516. else
  1517. {
  1518. log_w("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1519. }
  1520. return reg;
  1521. }
  1522. int g_switch_set_t_ac_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  1523. {
  1524. unsigned int offset = 0;
  1525. if(chn > 9 || chn < 0) return -1;
  1526. unsigned short data_temp[2];
  1527. memset(data_temp,0,sizeof(data_temp));
  1528. if(chn>=9)
  1529. return -1;
  1530. offset = _SWITCH_T_AC_OUT_ENABLE+chn;
  1531. data_temp[0]=sts;
  1532. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1533. }
  1534. int g_switch_set_t_ac_ctrl(void* manger,int saddr,unsigned short* sts)
  1535. {
  1536. unsigned int offset = 0;
  1537. unsigned short data_temp[2];
  1538. if (sts[0] == 1)
  1539. {
  1540. offset = _SWITCH_T_AC_ALL_OPEN_INFO;
  1541. data_temp[0] = 0xFFFF;
  1542. data_temp[1] = 0xFFFF;
  1543. }
  1544. else
  1545. {
  1546. offset = _SWITCH_T_AC_ALL_CLOSE_INFO;
  1547. data_temp[0] = 0;
  1548. data_temp[1] = 0;
  1549. }
  1550. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1551. }
  1552. //输入状态及报警
  1553. int g_switch_get_t_ac_in_info(void* manger,int saddr,PowerInfo* _power,PowerWarningInfo *_warning)
  1554. {
  1555. unsigned int offset = 0;
  1556. unsigned int value = 0 ;
  1557. unsigned short data_temp[24] = {0};
  1558. int ret=0;
  1559. offset = _SWITCH_T_AC_IN_INFO;
  1560. //读取4个寄存器
  1561. //读取寄存器
  1562. memset(data_temp,0,sizeof(data_temp));
  1563. ret = g_modbus_read_x_reg(manger,saddr,offset,24,data_temp);
  1564. if (ret<0)
  1565. {
  1566. log_w("g_switch_get_t_ac_in_info:%d OffSet:%d Ret=%d:%s",saddr,offset,ret,modbus_strerror(errno));
  1567. //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1568. return ret;
  1569. }
  1570. //解电压数据
  1571. for (size_t i = 0; i < 3; i++)
  1572. {
  1573. int Index=i*2;
  1574. value = (data_temp[1+Index] << 16) + data_temp[0+Index];
  1575. _power[i].voltage = value / 1000.0;
  1576. //解电流数据
  1577. value = (data_temp[7+Index] << 16) + data_temp[6+Index];
  1578. _power[i].current = value / 1000.0;
  1579. //解功率数据
  1580. value = (data_temp[13+Index] << 16) + data_temp[12+Index];
  1581. _power[i].power = value / 1000.0;
  1582. value = (data_temp[19+Index] << 16) + data_temp[18+Index];
  1583. _power[i].consumption = value / 1000.0;
  1584. }
  1585. offset = _SWITCH_T_AC_IN_ERROR;
  1586. //读取寄存器
  1587. memset(data_temp,0,sizeof(data_temp));
  1588. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1589. //解报警数据
  1590. if (ret<0)
  1591. {
  1592. return ret;
  1593. }
  1594. for (size_t i = 0; i < 3; i++)
  1595. {
  1596. _warning[i].w_voltage_up = data_temp[0] & (BIT_00<<i);
  1597. _warning[i].w_voltage_down = data_temp[0] & (BIT_03<<i);
  1598. _warning[i].w_current = data_temp[0] & (BIT_06<<i);
  1599. _warning[i].w_power = data_temp[1] & (BIT_00<<i);
  1600. _warning[i].w_consumption = data_temp[1] & (BIT_03<<i);
  1601. //_warning[i].w_phase_loss = data_temp[1] & (BIT_06<<i);
  1602. }
  1603. return 0;
  1604. }
  1605. //阈值获取
  1606. int g_switch_get_t_ac_in_threshold(void* manger,int saddr,GlobalOverManager* _global_over_manager)
  1607. {
  1608. unsigned int offset = 0;
  1609. unsigned short data_temp[10] = {0};
  1610. memset(data_temp, 0, sizeof(data_temp));;
  1611. offset = _SWITCH_T_AC_SINGLE_IN_Threshold;
  1612. int ret= g_modbus_read_x_reg(manger,saddr,offset,10,data_temp);
  1613. unsigned int value = 0;
  1614. float fvalue=0.0;
  1615. //电压上限
  1616. value = (data_temp[1] << 16) + data_temp[0];
  1617. fvalue=(float)value;
  1618. _global_over_manager->product_vol_upper_threshold = fvalue / 1000.0;
  1619. //电压下限
  1620. value = (data_temp[3] << 16) + data_temp[2];
  1621. fvalue=(float)value;
  1622. _global_over_manager->product_vol_lower_threshold = fvalue / 1000.0;
  1623. //电流上限
  1624. value = (data_temp[5] << 16) + data_temp[4];
  1625. fvalue=(float)value;
  1626. _global_over_manager->product_cur_upper_threshold = fvalue / 1000.0;
  1627. //功率上限
  1628. value = (data_temp[7] << 16) + data_temp[6];
  1629. fvalue=(float)value;
  1630. _global_over_manager->product_pwr_upper_threshold = fvalue / 1000.0;
  1631. //电能上限
  1632. value = (data_temp[9] << 16) + data_temp[8];
  1633. fvalue=(float)value;
  1634. _global_over_manager->product_pwrcon_upper_threshold = fvalue / 1000.0;
  1635. //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1636. return ret;
  1637. }
  1638. //阈值设置
  1639. int g_switch_set_t_ac_in_threshold(void* manger,int saddr,GlobalOverManager* _global_over_manager)
  1640. {
  1641. unsigned int offset = 0;
  1642. unsigned int data_temp = 0 ;
  1643. unsigned short data_buf[10] = {0};
  1644. int ret= 0;
  1645. memset(data_buf, 0, sizeof(data_buf));;
  1646. offset = _SWITCH_T_AC_SINGLE_IN_Threshold;
  1647. //电压上限
  1648. data_temp = (_global_over_manager->product_vol_upper_threshold*1000);
  1649. data_buf[0] = data_temp;
  1650. data_buf[1] = data_temp>>16;
  1651. ret=g_modbus_write_x_reg(manger,saddr,offset,2,data_buf);
  1652. //电压下限
  1653. data_temp = (_global_over_manager->product_vol_lower_threshold*1000);
  1654. data_buf[0] = data_temp;
  1655. data_buf[1] = data_temp>>16;
  1656. ret=g_modbus_write_x_reg(manger,saddr,offset+1,2,data_buf);
  1657. //电流上限
  1658. data_temp = (_global_over_manager->product_cur_upper_threshold*1000);
  1659. data_buf[0] = data_temp;
  1660. data_buf[1] = data_temp>>16;
  1661. ret=g_modbus_write_x_reg(manger,saddr,offset+2,2,data_buf);
  1662. //功率上限
  1663. data_temp = (_global_over_manager->product_pwr_upper_threshold*1000);
  1664. data_buf[0] = data_temp;
  1665. data_buf[1] = data_temp>>16;
  1666. ret=g_modbus_write_x_reg(manger,saddr,offset+3,2,data_buf);
  1667. //电能上限
  1668. data_temp = (_global_over_manager->product_pwrcon_upper_threshold*1000);
  1669. data_buf[0] = data_temp;
  1670. data_buf[1] = data_temp>>16;
  1671. ret=g_modbus_write_x_reg(manger,saddr,offset+4,2,data_buf);
  1672. //int ret= g_modbus_write_x_reg(manger,saddr,offset,10,data_buf);
  1673. if (ret<0)
  1674. {
  1675. log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1676. return ret;
  1677. }
  1678. memset(data_buf, 0, sizeof(data_buf));;
  1679. if(_global_over_manager->product_vol_upper_enable==1)data_buf[0]|=ENABLE_TAC_V_UP;
  1680. if(_global_over_manager->product_vol_lower_enable==1)data_buf[0]|=ENABLE_TAC_V_DOWN;
  1681. if(_global_over_manager->product_cur_upper_enable==1)data_buf[0]|=ENABLE_TAC_A_UP;
  1682. if(_global_over_manager->product_pwr_upper_enable==1)data_buf[0]|=ENABLE_TAC_W_UP;
  1683. if(_global_over_manager->product_pwrcon_upper_enable==1)data_buf[0]|=ENABLE_TAC_P_UP;
  1684. offset = _SWITCH_T_AC_IN_ENABLE;
  1685. ret= g_modbus_write_x_reg(manger,saddr,offset,2,data_buf);
  1686. return ret;
  1687. }
  1688. int ResetChmData()
  1689. {
  1690. //搜索子地址
  1691. int ret=0;
  1692. int chn = 1;
  1693. int type=0;
  1694. __globalDeviceManage.useSlaveCount=0;
  1695. for (size_t i = 1; i <= MAX_CHN_COUNT; i++)
  1696. {
  1697. type = 0 ;
  1698. int nMaxChn=0;
  1699. ret = g_switch_get_type(&__globalDeviceManage._globalRelaySampManger,
  1700. i,
  1701. &type,
  1702. &nMaxChn,
  1703. __globalDeviceManage._global_device_info->product_pwr_type);
  1704. log_d("ret:%d saddr:%d type:%d ch_num:%d.\n",ret,i,type,nMaxChn);
  1705. //int i =1 ;
  1706. //type = AC_SINGLE_S_TYPE ;
  1707. //chn = i ;
  1708. if(ret==0)
  1709. {
  1710. //有效地址记录
  1711. __globalDeviceManage.useSlaveCount ++ ;
  1712. switch (type)
  1713. {
  1714. case AC_SINGLE_S_TYPE://AC单相小电流 8路继电器
  1715. {
  1716. log_i("Address=%d AC_SINGLE_S_TYPE!\n",i);
  1717. for (size_t j = 0; j < nMaxChn; j++)
  1718. {
  1719. bool isLoad=false ;
  1720. GlobalPowerManger* _globalPowerMangerTemp=NULL;
  1721. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  1722. {
  1723. if (_globalPowerMangerTemp->product_saddr==i&&_globalPowerMangerTemp->product_ch_addr==j+1)
  1724. {
  1725. isLoad=true;
  1726. break;
  1727. }
  1728. }
  1729. if (!isLoad)
  1730. {
  1731. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  1732. if (_globalPowerMangerTemp == NULL)
  1733. {
  1734. // log_e("_globalPowerManger malloc error.\n");
  1735. return -1;
  1736. }
  1737. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1738. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1739. if (_globalPowerMangerTemp->global_over_manager == NULL)
  1740. {
  1741. // log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1742. return -1;
  1743. }
  1744. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  1745. }
  1746. //查询是否由通道信息
  1747. ret = dev_get_power_manage_info(__globalDeviceManage.db,
  1748. __globalDeviceManage._global_device_info->product_id,i,
  1749. j+1, //1*8+j
  1750. _globalPowerMangerTemp);
  1751. //未查询到信息 则插入
  1752. if(ret==-1)
  1753. {
  1754. _globalPowerMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id;
  1755. _globalPowerMangerTemp->product_saddr = i ;
  1756. _globalPowerMangerTemp->product_ch_id = chn;
  1757. _globalPowerMangerTemp->product_ch_addr = j+1;
  1758. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1759. _globalPowerMangerTemp->product_ch_type = type;
  1760. _globalPowerMangerTemp->product_ch_status = 0;
  1761. _globalPowerMangerTemp->product_ch_start_delay = 1000;
  1762. _globalPowerMangerTemp->product_ch_stop_delay = 1000;
  1763. if(dev_insert_power_manage_info(__globalDeviceManage.db,
  1764. __globalDeviceManage._global_device_info->product_id,
  1765. _globalPowerMangerTemp->product_ch_id,
  1766. _globalPowerMangerTemp)!=0)
  1767. {
  1768. log_e("address %d chn %d data inserted error.\n",i,chn);
  1769. return 0;
  1770. }
  1771. /*
  1772. else
  1773. {
  1774. log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
  1775. }
  1776. */
  1777. }
  1778. _globalPowerMangerTemp->product_saddr = i ;
  1779. //添加到队尾
  1780. if (!isLoad)
  1781. {
  1782. list_add_tail(&_globalPowerMangerTemp->list,&__globalDeviceManage._globalPowerManger.list);
  1783. }
  1784. chn+=1;
  1785. }
  1786. }
  1787. break;
  1788. case AC_SINGLE_B_TYPE://AC单相大电流 4路继电器
  1789. {
  1790. }
  1791. break;
  1792. case AC_MULTI_S_TYPE://预留
  1793. {
  1794. }
  1795. break;
  1796. case AC_MULTI_B_TYPE://预留
  1797. {
  1798. }
  1799. break;
  1800. case DC_OUT_TYPE: //DC输出继电器 1路
  1801. {
  1802. }
  1803. break;
  1804. case DC_IN_TYPE: // DC采集
  1805. {
  1806. }
  1807. break;
  1808. case DCPDU_TYPE: // DCPDU
  1809. {
  1810. log_i("DCPDU_TYPE!\n");
  1811. for (size_t j = 0; j < nMaxChn; j++)
  1812. {
  1813. bool isLoad=false ;
  1814. GlobalPowerManger* _globalPowerMangerTemp=NULL;
  1815. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  1816. {
  1817. if (_globalPowerMangerTemp->product_saddr==i&&_globalPowerMangerTemp->product_ch_addr==j+1)
  1818. {
  1819. isLoad=true;
  1820. break;
  1821. }
  1822. }
  1823. if (!isLoad)
  1824. {
  1825. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  1826. if (_globalPowerMangerTemp == NULL)
  1827. {
  1828. log_e("_globalPowerManger malloc error.\n");
  1829. return -1;
  1830. }
  1831. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1832. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1833. if (_globalPowerMangerTemp->global_over_manager == NULL)
  1834. {
  1835. // log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1836. return -1;
  1837. }
  1838. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  1839. }
  1840. //查询是否由通道信息
  1841. ret = dev_get_power_manage_info(__globalDeviceManage.db,
  1842. __globalDeviceManage._global_device_info->product_id,i,
  1843. j+1, //1*8+j
  1844. _globalPowerMangerTemp);
  1845. _globalPowerMangerTemp->product_ch_addr = j+1;
  1846. //未查询到信息 则插入
  1847. if(ret==-1)
  1848. {
  1849. _globalPowerMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id;
  1850. _globalPowerMangerTemp->product_saddr = i ;
  1851. _globalPowerMangerTemp->product_ch_id = chn;
  1852. _globalPowerMangerTemp->product_ch_addr = j+1;
  1853. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1854. _globalPowerMangerTemp->product_ch_type = type;
  1855. _globalPowerMangerTemp->product_ch_status = 0;
  1856. _globalPowerMangerTemp->product_ch_start_delay = 1000;
  1857. _globalPowerMangerTemp->product_ch_stop_delay = 1000;
  1858. if(dev_insert_power_manage_info(__globalDeviceManage.db,
  1859. __globalDeviceManage._global_device_info->product_id,
  1860. _globalPowerMangerTemp->product_ch_id,
  1861. _globalPowerMangerTemp)!=0)
  1862. {
  1863. log_e("address %d chn %d data inserted error.\n",i,chn);
  1864. return 0;
  1865. }
  1866. }
  1867. _globalPowerMangerTemp->product_saddr = i ;
  1868. _globalPowerMangerTemp->product_ch_type = type;
  1869. if (dev_update_power_manage_genera_info(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id,chn,_globalPowerMangerTemp) != 0)
  1870. {
  1871. log_e("update pwr general data err.");
  1872. }
  1873. //添加到队尾
  1874. if (!isLoad)
  1875. {
  1876. list_add_tail(&_globalPowerMangerTemp->list,&__globalDeviceManage._globalPowerManger.list);
  1877. }
  1878. chn+=1;
  1879. }
  1880. }
  1881. break;
  1882. }
  1883. }
  1884. else
  1885. break;
  1886. }
  1887. }