switch_ctrl.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037
  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. // log_d("get _power->consumption sucessful!!!\n");
  895. int ret=hlw8110_read_Status(__globalDeviceManage._RS485LowConfData,&_power->status);
  896. if (ret==1)
  897. {
  898. log_d("error gpio ReadError");
  899. }
  900. // log_d("V:%0.3f,A:%0.3f,P:%0.3f,PF:%0.3f,F_consumption:%0.3f,F_Factor:%0.3f",_power->voltage,
  901. // _power->current,
  902. // _power->power,
  903. // _power->freq,
  904. // _power->consumption,
  905. // _power->factor);
  906. }
  907. break;
  908. case AC_MULTI_S_TYPE:
  909. case AC_MULTI_B_TYPE:
  910. case DC_IN_TYPE:
  911. default:
  912. return 1;
  913. break;
  914. }
  915. return 1;
  916. }
  917. int g_switch_get_dcpdu_out_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  918. {
  919. unsigned int offset = 0;
  920. unsigned int val = 0 ;
  921. unsigned short data_temp[12] = {0};
  922. unsigned int status_temp = 0 ;
  923. offset = _SWITCH_DCPDU_OUT_INFO + chn * 4;
  924. //读取4个寄存器
  925. int ret = g_modbus_read_x_reg(manger,saddr,offset,8,data_temp);
  926. //解电压数据
  927. float value = (data_temp[1] << 16) + data_temp[0];
  928. _power->voltage = value / 1000.0;
  929. //解电流数据
  930. value = (data_temp[3] << 16) + data_temp[2];
  931. _power->current = value / 1000.0;
  932. //解功率数据
  933. value = (data_temp[5] << 16) + data_temp[4];
  934. _power->power = value / 1000.0;
  935. value = (data_temp[7] << 16) + data_temp[6];
  936. _power->consumption = value / 1000.0;
  937. //获取开关状态
  938. offset = _SWITCH_DCPDU_STS_INFO;
  939. memset(data_temp,0,sizeof(data_temp));
  940. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  941. status_temp = (data_temp[1] << 16) + data_temp[0];
  942. _power->status = (status_temp >> chn) & 0x1;
  943. //获取故障状态
  944. offset = _SWITCH_DCPDU_STS_ERROR;
  945. memset(data_temp,0,sizeof(data_temp));
  946. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  947. status_temp = (data_temp[1] << 16) + data_temp[0];
  948. _warning->w_voltage_up = (status_temp >> chn) & 0x1;
  949. return ret;
  950. }
  951. int g_switch_get_dcpdu_all_out_info(void* manger,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  952. {
  953. unsigned int offset = 0;
  954. unsigned int value = 0;
  955. unsigned short data_temp[64] = {0};
  956. unsigned int status_temp = 0;
  957. int ret = 0;
  958. offset = _SWITCH_DCPDU_OUT_INFO;
  959. // 读取4个寄存器
  960. // 读取寄存器
  961. memset(data_temp, 0, sizeof(data_temp));
  962. ret = g_modbus_read_x_reg(manger, saddr, offset, 64, data_temp);
  963. if (ret < 0)
  964. {
  965. log_w("g_switch_get_t_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  966. // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  967. return ret;
  968. }
  969. // 解电压数据
  970. for (size_t i = 0; i < nNumb; i++)
  971. {
  972. int Index = i * 8;
  973. // 解电压数据
  974. float value = (data_temp[1 + Index] << 16) + data_temp[0 + Index];
  975. _power[i].voltage = value / 1000.0;
  976. // 解电流数据
  977. value = (data_temp[3 + Index] << 16) + data_temp[2 + Index];
  978. _power[i].current = value / 1000.0;
  979. // 解功率数据
  980. value = (data_temp[5 + Index] << 16) + data_temp[4 + Index];
  981. _power[i].power = value / 1000.0;
  982. value = (data_temp[7 + Index] << 16) + data_temp[6 + Index];
  983. _power[i].consumption = value / 1000.0;
  984. }
  985. offset = _SWITCH_DCPDU_STS_INFO;
  986. // 读取寄存器
  987. memset(data_temp, 0, sizeof(data_temp));
  988. ret = g_modbus_read_x_reg(manger, saddr, offset, 2, &data_temp);
  989. // 解控制数据
  990. if (ret < 0)
  991. {
  992. return ret;
  993. }
  994. for (size_t i = 0; i < nNumb; i++)
  995. {
  996. status_temp = (data_temp[1] << 16) + data_temp[0];
  997. _power[i].status = (status_temp >> i) & 0x1;
  998. }
  999. // 获取故障状态
  1000. offset = _SWITCH_DCPDU_STS_ERROR;
  1001. memset(data_temp, 0, sizeof(data_temp));
  1002. ret = g_modbus_read_x_reg(manger, saddr, offset, 2, &data_temp);
  1003. if (ret < 0)
  1004. {
  1005. return ret;
  1006. }
  1007. for (size_t i = 0; i < nNumb; i++)
  1008. {
  1009. status_temp = (data_temp[1] << 16) + data_temp[0];
  1010. _warning[i].w_voltage_up = (status_temp >> i) & 0x1;
  1011. }
  1012. return 0;
  1013. }
  1014. int g_switch_get_dcpdu_in_info(void* manger,int saddr,PowerInfo* _power)
  1015. {
  1016. unsigned int offset = 0;
  1017. unsigned int value = 0 ;
  1018. unsigned short data_temp[18] = {0};
  1019. offset = _SWITCH_DCPDU_IN_INFO;
  1020. //读取4个寄存器
  1021. g_modbus_read_x_reg(manger,saddr,offset,16,data_temp);
  1022. //解电压数据
  1023. value = (data_temp[1] << 16) + data_temp[0];
  1024. _power->voltage = value / 1000.0;
  1025. //解电流数据
  1026. value = (data_temp[3] << 16) + data_temp[2];
  1027. _power->current = value / 1000.0;
  1028. //解功率数据
  1029. value = (data_temp[5] << 16) + data_temp[4];
  1030. _power->power = value / 1000.0;
  1031. value = (data_temp[7] << 16) + data_temp[6];
  1032. _power->consumption = value / 1000.0;
  1033. return 0;
  1034. }
  1035. int g_switch_get_dcpdu_start_time_delay(void* manger,int saddr,unsigned int* time)
  1036. {
  1037. unsigned int offset = 0;
  1038. unsigned short data_temp[16];
  1039. offset = _SWITCH_DCPDU_START_DELAY_TIME;
  1040. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1041. unsigned int value = 0;
  1042. for(int i = 0; i < 8; i++)
  1043. {
  1044. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1045. time[i] = value;
  1046. }
  1047. return ret;
  1048. }
  1049. int g_switch_get_dcpdu_stop_time_delay(void* manger,int saddr,unsigned int* time)
  1050. {
  1051. unsigned int offset = 0;
  1052. unsigned short data_temp[16];
  1053. offset = _SWITCH_DCPDU_STOP_DELAY_TIME;
  1054. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1055. unsigned int value = 0;
  1056. for(int i = 0; i < 8; i++)
  1057. {
  1058. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1059. time[i] = value;
  1060. }
  1061. return ret;
  1062. }
  1063. int g_switch_set_dcpdu_start_time_delay(void* manger,int saddr, int ch,unsigned int time)
  1064. {
  1065. unsigned int offset = 0;
  1066. unsigned short data_temp[4];
  1067. offset = _SWITCH_DCPDU_START_DELAY_TIME + ch ;
  1068. data_temp[0] = time & 0xFFFF;
  1069. data_temp[1] = (time >> 16) & 0XFFFF;
  1070. int reg = g_modbus_write_x_reg(manger,saddr,offset,2,data_temp);
  1071. if (reg>=0)
  1072. {
  1073. log_d("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1074. }
  1075. else
  1076. {
  1077. log_w("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1078. }
  1079. return reg;
  1080. }
  1081. int g_switch_set_dcpdu_stop_time_delay(void* manger,int saddr, int ch, unsigned int time)
  1082. {
  1083. unsigned int offset = 0;
  1084. unsigned short data_temp[4];
  1085. offset = _SWITCH_DCPDU_STOP_DELAY_TIME + ch;
  1086. data_temp[0] = time & 0XFFFF;
  1087. data_temp[1] = (time >> 16) & 0xFFFF;
  1088. int reg = g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1089. if (reg>=0)
  1090. {
  1091. log_d("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1092. }
  1093. else
  1094. {
  1095. log_w("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1096. }
  1097. return reg;
  1098. }
  1099. int g_switch_set_dcpdu_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  1100. {
  1101. unsigned int offset = 0;
  1102. if(chn > 8 || chn < 0) return -1;
  1103. offset = _SWITCH_DCPDU_STS_INFO;
  1104. unsigned short data_temp[2];
  1105. //memset(data_temp,0,sizeof(data_temp));
  1106. int ret=g_modbus_read_x_reg_delay(manger,saddr,offset,2, data_temp);
  1107. if (ret<0)
  1108. {
  1109. log_w("Ctrl Error Ret=%d:%s",ret,modbus_strerror(errno));
  1110. return -1;
  1111. }
  1112. log_w("Ctrl get addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1113. unsigned short mask = ~(1 << chn);
  1114. data_temp[0] &= mask;
  1115. data_temp[0] |= (sts << chn);
  1116. log_w("Ctrl set addr%d chn %d Mark=%d,%d",saddr,chn,data_temp[1],data_temp[0]);
  1117. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1118. }
  1119. //一次性刷新一个板子的数据
  1120. int g_switch_set_dcpdu_chns_ctrl(void* manger,int saddr,unsigned short sts,int nSet)
  1121. {
  1122. unsigned int offset = 0;
  1123. offset = _SWITCH_DCPDU_STS_INFO;
  1124. unsigned short data_temp[2];
  1125. //memset(data_temp,0,sizeof(data_temp));
  1126. int ret=g_modbus_read_x_reg_delay(manger,saddr,offset,2, data_temp);
  1127. if (ret<0)
  1128. {
  1129. log_w("Ctrl Error Ret=%d:%s",ret,modbus_strerror(errno));
  1130. return -1;
  1131. }
  1132. log_w("Ctrl get addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1133. if (nSet==0)
  1134. { //关闭
  1135. sts=~sts;
  1136. data_temp[0] &= sts;
  1137. }else{
  1138. //开启
  1139. data_temp[0] |= sts;
  1140. }
  1141. log_w("Ctrl set addr%d Mark=%d,%d",saddr,data_temp[1],data_temp[0]);
  1142. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1143. }
  1144. int g_switch_set_dcpdu_ctrl(void* manger,int saddr,unsigned short* sts)
  1145. {
  1146. unsigned int offset = 0;
  1147. unsigned short data_temp[2];
  1148. if (sts[0] == 1)
  1149. {
  1150. offset = _SWITCH_DCPDU_ALL_OPEN_INFO;
  1151. data_temp[0] = 0xFFFF;
  1152. data_temp[1] = 0xFFFF;
  1153. }
  1154. else
  1155. {
  1156. offset = _SWITCH_DCPDU_ALL_CLOSE_INFO;
  1157. data_temp[0] = 0;
  1158. data_temp[1] = 0;
  1159. }
  1160. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1161. }
  1162. int g_switch_get_dcpdu_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1163. {
  1164. unsigned int offset = 0;
  1165. unsigned short data_temp[4];
  1166. memset(data_temp,0,sizeof(data_temp));
  1167. unsigned int value = 0;
  1168. offset = _SWITCH_DCPDU_MAX_VOL_THRESHOLD + chn;
  1169. int ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1170. value = (data_temp[1] << 16) + data_temp[0];
  1171. _global_over_manager->product_vol_upper_threshold = value / 1000.0;
  1172. offset = _SWITCH_DCPDU_MIN_VOL_THRESHOLD + chn;
  1173. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1174. value = (data_temp[1] << 16) + data_temp[0];
  1175. _global_over_manager->product_vol_lower_threshold = value / 1000.0;
  1176. offset = _SWITCH_DCPDU_MAX_CUR_THRESHOLD + chn;
  1177. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1178. value = (data_temp[1] << 16) + data_temp[0];
  1179. _global_over_manager->product_cur_upper_threshold = value / 1000.0;
  1180. offset = _SWITCH_DCPDU_MIN_CUR_THRESHOLD + chn;
  1181. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1182. value = (data_temp[1] << 16) + data_temp[0];
  1183. _global_over_manager->product_cur_lower_threshold = value / 1000.0;
  1184. return ret;
  1185. }
  1186. int g_switch_set_dcpdu_max_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1187. {
  1188. unsigned int offset = 0;
  1189. unsigned short data_temp[4];
  1190. memset(data_temp,0,sizeof(data_temp));
  1191. unsigned int value = 0;
  1192. offset = _SWITCH_DCPDU_MAX_VOL_THRESHOLD + chn;
  1193. value = _global_over_manager->product_vol_upper_threshold * 1000;
  1194. data_temp[0] = value & 0XFFFF;
  1195. data_temp[1] = (value >> 16) & 0xFFFF;
  1196. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1197. }
  1198. int g_switch_set_dcpdu_min_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1199. {
  1200. unsigned int offset = 0;
  1201. unsigned short data_temp[4];
  1202. memset(data_temp,0,sizeof(data_temp));
  1203. unsigned int value = 0;
  1204. offset = _SWITCH_DCPDU_MIN_VOL_THRESHOLD + chn;
  1205. value = _global_over_manager->product_vol_lower_threshold * 1000;
  1206. data_temp[0] = value & 0XFFFF;
  1207. data_temp[1] = (value >> 16) & 0xFFFF;
  1208. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1209. }
  1210. int g_switch_set_dcpdu_max_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1211. {
  1212. unsigned int offset = 0;
  1213. unsigned short data_temp[4];
  1214. memset(data_temp,0,sizeof(data_temp));
  1215. unsigned int value = 0;
  1216. offset = _SWITCH_DCPDU_MAX_CUR_THRESHOLD + chn;
  1217. value = _global_over_manager->product_cur_upper_threshold * 1000;
  1218. data_temp[0] = value & 0XFFFF;
  1219. data_temp[1] = (value >> 16) & 0xFFFF;
  1220. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1221. }
  1222. int g_switch_set_dcpdu_min_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1223. {
  1224. unsigned int offset = 0;
  1225. unsigned short data_temp[4];
  1226. memset(data_temp,0,sizeof(data_temp));
  1227. unsigned int value = 0;
  1228. offset = _SWITCH_DCPDU_MIN_CUR_THRESHOLD + chn;
  1229. value = _global_over_manager->product_cur_lower_threshold * 1000;
  1230. data_temp[0] = value & 0XFFFF;
  1231. data_temp[1] = (value >> 16) & 0xFFFF;
  1232. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1233. }
  1234. int g_switch_get_t_ac_out_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning)
  1235. {
  1236. unsigned int offset = 0;
  1237. unsigned int val = 0 ;
  1238. unsigned short data_temp[16] = {0};
  1239. unsigned int status_temp = 0 ;
  1240. offset = _SWITCH_T_AC_OUT_INFO + chn * 8;
  1241. //读取4个寄存器
  1242. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,data_temp);
  1243. //解电压数据
  1244. float value = (data_temp[1] << 16) + data_temp[0];
  1245. _power->voltage = value / 1000.0;
  1246. //解电流数据
  1247. value = (data_temp[3] << 16) + data_temp[2];
  1248. _power->current = value / 1000.0;
  1249. //解功率数据
  1250. value = (data_temp[5] << 16) + data_temp[4];
  1251. _power->power = value / 1000.0;
  1252. //无功
  1253. value = (data_temp[7] << 16) + data_temp[6];
  1254. //视在功率
  1255. value = (data_temp[9] << 16) + data_temp[8];
  1256. //解频率数据
  1257. val = (data_temp[11]<<16)+data_temp[10];
  1258. _power->freq = val/1000.0;
  1259. //解耗电量数据
  1260. val = (data_temp[13]<<16)+data_temp[12];
  1261. _power->consumption = val/1000.0;
  1262. //解功率因素数据
  1263. val = (data_temp[15]<<16)+data_temp[14];
  1264. _power->factor = val/1000.0;
  1265. //获取开关状态
  1266. offset = _SWITCH_T_AC_OUT_ENABLE+ chn;
  1267. memset(data_temp,0,sizeof(data_temp));
  1268. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1269. _power->status = data_temp[0] & BIT_00;
  1270. //获取故障状态
  1271. offset = _SWITCH_T_AC_OUT_ERROR+ chn;
  1272. memset(data_temp,0,sizeof(data_temp));
  1273. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1274. _warning->w_voltage_up = data_temp[0] & ENABLE_TAC_V_UP;
  1275. _warning->w_voltage_down = data_temp[0] & ENABLE_TAC_V_DOWN;
  1276. _warning->w_current = data_temp[0] & ENABLE_TAC_A_UP;
  1277. _warning->w_power = data_temp[0] & ENABLE_TAC_W_UP;
  1278. _warning->w_consumption = data_temp[0] & ENABLE_TAC_P_UP;
  1279. return ret;
  1280. }
  1281. int g_switch_get_t_ac_all_out_info(void* manger,int saddr,int nNumb,PowerInfo* _power,PowerWarningInfo* _warning)
  1282. {
  1283. unsigned int offset = 0;
  1284. unsigned int val = 0 ;
  1285. unsigned short data_temp[144] = {0};
  1286. unsigned int status_temp = 0 ;
  1287. offset = _SWITCH_T_AC_OUT_INFO;
  1288. //读取4个寄存器
  1289. int ret = g_modbus_read_x_reg(manger, saddr, offset, 80, data_temp);
  1290. if (ret < 0)
  1291. {
  1292. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1293. return ret;
  1294. }
  1295. offset = _SWITCH_T_AC_OUT_INFO+40;
  1296. unsigned short* DataTemp=data_temp+80;
  1297. ret = g_modbus_read_x_reg(manger, saddr, offset, 64, DataTemp);
  1298. if (ret < 0)
  1299. {
  1300. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1301. return ret;
  1302. }
  1303. for (size_t i = 0; i < nNumb; i++)
  1304. {
  1305. int Index = i * 16;
  1306. // 解电压数据
  1307. float value = (data_temp[1+Index] << 16) + data_temp[0+Index];
  1308. _power[i].voltage = value / 1000.0;
  1309. // 解电流数据
  1310. value = (data_temp[3+Index] << 16) + data_temp[2+Index];
  1311. _power[i].current = value / 1000.0;
  1312. // 解功率数据
  1313. value = (data_temp[5+Index] << 16) + data_temp[4+Index];
  1314. _power[i].power = value / 1000.0;
  1315. // 无功
  1316. value = (data_temp[7+Index] << 16) + data_temp[6+Index];
  1317. // 视在功率
  1318. value = (data_temp[9+Index] << 16) + data_temp[8+Index];
  1319. // 解频率数据
  1320. val = (data_temp[11+Index] << 16) + data_temp[10+Index];
  1321. _power[i].freq = val / 1000.0;
  1322. // 解耗电量数据
  1323. val = (data_temp[13+Index] << 16) + data_temp[12+Index];
  1324. _power[i].consumption = val / 1000.0;
  1325. // 解功率因素数据
  1326. val = (data_temp[15+Index] << 16) + data_temp[14+Index];
  1327. _power[i].factor = val / 1000.0;
  1328. }
  1329. //获取开关状态
  1330. offset = _SWITCH_T_AC_OUT_ENABLE;
  1331. memset(data_temp,0,sizeof(data_temp));
  1332. ret = g_modbus_read_x_reg(manger,saddr,offset, 18,data_temp);
  1333. if (ret < 0)
  1334. {
  1335. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1336. return ret;
  1337. }
  1338. for (size_t i = 0; i < nNumb; i++)
  1339. {
  1340. int Index = i * 2;
  1341. _power[i].status = data_temp[0+Index] & BIT_00;
  1342. }
  1343. //获取故障状态
  1344. offset = _SWITCH_T_AC_OUT_ERROR;
  1345. memset(data_temp,0,sizeof(data_temp));
  1346. ret = g_modbus_read_x_reg(manger,saddr,offset, 18,data_temp);
  1347. if (ret < 0)
  1348. {
  1349. log_w("g_switch_get_T_ac_in_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
  1350. return ret;
  1351. }
  1352. for (size_t i = 0; i < nNumb; i++)
  1353. {
  1354. int Index = i * 2;
  1355. _warning[i].w_voltage_up = data_temp[0+Index] & ENABLE_TAC_V_UP;
  1356. _warning[i].w_voltage_down = data_temp[0+Index] & ENABLE_TAC_V_DOWN;
  1357. _warning[i].w_current = data_temp[0+Index] & ENABLE_TAC_A_UP;
  1358. _warning[i].w_power = data_temp[0+Index] & ENABLE_TAC_W_UP;
  1359. _warning[i].w_consumption = data_temp[0+Index] & ENABLE_TAC_P_UP;
  1360. }
  1361. return ret;
  1362. }
  1363. int g_switch_get_t_ac_start_time_delay(void* manger,int saddr,unsigned int* time)
  1364. {
  1365. unsigned int offset = 0;
  1366. unsigned short data_temp[16];
  1367. offset = _SWITCH_T_AC_START_DELAY_TIME;
  1368. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1369. unsigned int value = 0;
  1370. for(int i = 0; i < 8; i++)
  1371. {
  1372. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1373. time[i] = value;
  1374. }
  1375. return ret;
  1376. }
  1377. int g_switch_get_t_ac_stop_time_delay(void* manger,int saddr,unsigned int* time)
  1378. {
  1379. unsigned int offset = 0;
  1380. unsigned short data_temp[16];
  1381. offset = _SWITCH_T_AC_STOP_DELAY_TIME;
  1382. int ret = g_modbus_read_x_reg(manger,saddr,offset,16,&data_temp);
  1383. unsigned int value = 0;
  1384. for(int i = 0; i < 8; i++)
  1385. {
  1386. value = (data_temp[i * 2 + 1] << 16) + data_temp[i * 2];
  1387. time[i] = value;
  1388. }
  1389. return ret;
  1390. }
  1391. int g_switch_get_t_ac_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1392. {
  1393. unsigned int offset = 0;
  1394. unsigned short data_temp[4];
  1395. memset(data_temp,0,sizeof(data_temp));
  1396. unsigned int value = 0;
  1397. float fvalue=0.0;
  1398. offset = _SWITCH_T_AC_MAX_VOL_THRESHOLD + chn;
  1399. int ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1400. value = (data_temp[1] << 16) + data_temp[0];
  1401. fvalue=(float)value;
  1402. _global_over_manager->product_vol_upper_threshold = fvalue / 1000.0;
  1403. offset = _SWITCH_T_AC_MIN_VOL_THRESHOLD + chn;
  1404. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1405. value = (data_temp[1] << 16) + data_temp[0];
  1406. fvalue=(float)value;
  1407. _global_over_manager->product_vol_lower_threshold = fvalue / 1000.0;
  1408. offset = _SWITCH_T_AC_MAX_CUR_THRESHOLD + chn;
  1409. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1410. value = (data_temp[1] << 16) + data_temp[0];
  1411. fvalue=(float)value;
  1412. _global_over_manager->product_cur_upper_threshold = fvalue / 1000.0;
  1413. offset = _SWITCH_T_AC_MAX_PWR_THRESHOLD + chn;
  1414. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1415. value = (data_temp[1] << 16) + data_temp[0];
  1416. fvalue=(float)value;
  1417. _global_over_manager->product_pwr_upper_threshold = fvalue / 1000.0;
  1418. offset = _SWITCH_T_AC_MAX_PWRCON_THRESHOLD + chn;
  1419. ret = g_modbus_read_x_reg(manger,saddr,offset,2,&data_temp);
  1420. value = (data_temp[1] << 16) + data_temp[0];
  1421. fvalue=(float)value;
  1422. _global_over_manager->product_pwrcon_upper_threshold = fvalue / 1000.0;
  1423. return ret;
  1424. }
  1425. int g_switch_set_t_ac_max_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1426. {
  1427. unsigned int offset = 0;
  1428. unsigned short data_temp[4];
  1429. memset(data_temp,0,sizeof(data_temp));
  1430. unsigned int value = 0;
  1431. offset = _SWITCH_T_AC_MAX_VOL_THRESHOLD + chn;
  1432. value = _global_over_manager->product_vol_upper_threshold * 1000;
  1433. data_temp[0] = value & 0XFFFF;
  1434. data_temp[1] = (value >> 16) & 0xFFFF;
  1435. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1436. }
  1437. int g_switch_set_t_ac_min_vol_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1438. {
  1439. unsigned int offset = 0;
  1440. unsigned short data_temp[4];
  1441. memset(data_temp,0,sizeof(data_temp));
  1442. unsigned int value = 0;
  1443. offset = _SWITCH_T_AC_MIN_VOL_THRESHOLD + chn;
  1444. value = _global_over_manager->product_vol_lower_threshold * 1000;
  1445. data_temp[0] = value & 0XFFFF;
  1446. data_temp[1] = (value >> 16) & 0xFFFF;
  1447. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1448. }
  1449. int g_switch_set_t_ac_max_cur_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1450. {
  1451. unsigned int offset = 0;
  1452. unsigned short data_temp[4];
  1453. memset(data_temp,0,sizeof(data_temp));
  1454. unsigned int value = 0;
  1455. offset = _SWITCH_T_AC_MAX_CUR_THRESHOLD + chn;
  1456. value = _global_over_manager->product_cur_upper_threshold * 1000;
  1457. data_temp[0] = value & 0XFFFF;
  1458. data_temp[1] = (value >> 16) & 0xFFFF;
  1459. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1460. }
  1461. int g_switch_set_t_ac_max_power_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1462. {
  1463. unsigned int offset = 0;
  1464. unsigned short data_temp[4];
  1465. memset(data_temp,0,sizeof(data_temp));
  1466. unsigned int value = 0;
  1467. offset = _SWITCH_T_AC_MAX_PWR_THRESHOLD + chn;
  1468. value = _global_over_manager->product_pwr_upper_threshold * 1000;
  1469. data_temp[0] = value & 0XFFFF;
  1470. data_temp[1] = (value >> 16) & 0xFFFF;
  1471. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1472. }
  1473. int g_switch_set_t_ac_max_pwrcon_threshold(void* manger,int saddr,char chn,GlobalOverManager* _global_over_manager)
  1474. {
  1475. unsigned int offset = 0;
  1476. unsigned short data_temp[4];
  1477. memset(data_temp,0,sizeof(data_temp));
  1478. unsigned int value = 0;
  1479. offset = _SWITCH_T_AC_MAX_PWRCON_THRESHOLD + chn;
  1480. value = _global_over_manager->product_pwrcon_upper_threshold * 1000;
  1481. data_temp[0] = value & 0XFFFF;
  1482. data_temp[1] = (value >> 16) & 0xFFFF;
  1483. return g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1484. }
  1485. int g_switch_set_t_ac_start_time_delay(void* manger,int saddr,int ch, unsigned int time)
  1486. {
  1487. unsigned int offset = 0;
  1488. unsigned short data_temp[4];
  1489. offset = _SWITCH_T_AC_START_DELAY_TIME + ch ;
  1490. data_temp[0] = time & 0xFFFF;
  1491. data_temp[1] = (time >> 16) & 0XFFFF;
  1492. int reg = g_modbus_write_x_reg(manger,saddr,offset,2,data_temp);
  1493. if (reg>=0)
  1494. {
  1495. log_d("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1496. }
  1497. else
  1498. {
  1499. log_w("StartDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1500. }
  1501. return reg;
  1502. }
  1503. int g_switch_set_t_ac_stop_time_delay(void* manger,int saddr,int ch, unsigned int time)
  1504. {
  1505. unsigned int offset = 0;
  1506. unsigned short data_temp[4];
  1507. offset = _SWITCH_T_AC_STOP_DELAY_TIME + ch;
  1508. data_temp[0] = time & 0XFFFF;
  1509. data_temp[1] = (time >> 16) & 0xFFFF;
  1510. int reg = g_modbus_write_x_reg(manger,saddr,offset,2, data_temp);
  1511. if (reg>=0)
  1512. {
  1513. log_d("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d",saddr,ch,offset,time,reg);
  1514. }
  1515. else
  1516. {
  1517. log_w("StopDelayTime_Addr:%d ch:%d OffSet:%d Time:%d Ret=%d:%s",saddr,ch,offset,time,reg,modbus_strerror(errno));
  1518. }
  1519. return reg;
  1520. }
  1521. int g_switch_set_t_ac_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts)
  1522. {
  1523. unsigned int offset = 0;
  1524. if(chn > 9 || chn < 0) return -1;
  1525. unsigned short data_temp[2];
  1526. memset(data_temp,0,sizeof(data_temp));
  1527. if(chn>=9)
  1528. return -1;
  1529. offset = _SWITCH_T_AC_OUT_ENABLE+chn;
  1530. data_temp[0]=sts;
  1531. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1532. }
  1533. int g_switch_set_t_ac_ctrl(void* manger,int saddr,unsigned short* sts)
  1534. {
  1535. unsigned int offset = 0;
  1536. unsigned short data_temp[2];
  1537. if (sts[0] == 1)
  1538. {
  1539. offset = _SWITCH_T_AC_ALL_OPEN_INFO;
  1540. data_temp[0] = 0xFFFF;
  1541. data_temp[1] = 0xFFFF;
  1542. }
  1543. else
  1544. {
  1545. offset = _SWITCH_T_AC_ALL_CLOSE_INFO;
  1546. data_temp[0] = 0;
  1547. data_temp[1] = 0;
  1548. }
  1549. return g_modbus_write_x_reg(manger,saddr,offset, 2, data_temp);
  1550. }
  1551. //输入状态及报警
  1552. int g_switch_get_t_ac_in_info(void* manger,int saddr,PowerInfo* _power,PowerWarningInfo *_warning)
  1553. {
  1554. unsigned int offset = 0;
  1555. unsigned int value = 0 ;
  1556. unsigned short data_temp[24] = {0};
  1557. int ret=0;
  1558. offset = _SWITCH_T_AC_IN_INFO;
  1559. //读取4个寄存器
  1560. //读取寄存器
  1561. memset(data_temp,0,sizeof(data_temp));
  1562. ret = g_modbus_read_x_reg(manger,saddr,offset,24,data_temp);
  1563. if (ret<0)
  1564. {
  1565. log_w("g_switch_get_t_ac_in_info:%d OffSet:%d Ret=%d:%s",saddr,offset,ret,modbus_strerror(errno));
  1566. //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1567. return ret;
  1568. }
  1569. //解电压数据
  1570. for (size_t i = 0; i < 3; i++)
  1571. {
  1572. int Index=i*2;
  1573. value = (data_temp[1+Index] << 16) + data_temp[0+Index];
  1574. _power[i].voltage = value / 1000.0;
  1575. //解电流数据
  1576. value = (data_temp[7+Index] << 16) + data_temp[6+Index];
  1577. _power[i].current = value / 1000.0;
  1578. //解功率数据
  1579. value = (data_temp[13+Index] << 16) + data_temp[12+Index];
  1580. _power[i].power = value / 1000.0;
  1581. value = (data_temp[19+Index] << 16) + data_temp[18+Index];
  1582. _power[i].consumption = value / 1000.0;
  1583. }
  1584. offset = _SWITCH_T_AC_IN_ERROR;
  1585. //读取寄存器
  1586. memset(data_temp,0,sizeof(data_temp));
  1587. ret = g_modbus_read_x_reg(manger,saddr,offset, 2,&data_temp);
  1588. //解报警数据
  1589. if (ret<0)
  1590. {
  1591. return ret;
  1592. }
  1593. for (size_t i = 0; i < 3; i++)
  1594. {
  1595. _warning[i].w_voltage_up = data_temp[0] & (BIT_00<<i);
  1596. _warning[i].w_voltage_down = data_temp[0] & (BIT_03<<i);
  1597. _warning[i].w_current = data_temp[0] & (BIT_06<<i);
  1598. _warning[i].w_power = data_temp[1] & (BIT_00<<i);
  1599. _warning[i].w_consumption = data_temp[1] & (BIT_03<<i);
  1600. //_warning[i].w_phase_loss = data_temp[1] & (BIT_06<<i);
  1601. }
  1602. return 0;
  1603. }
  1604. //阈值获取
  1605. int g_switch_get_t_ac_in_threshold(void* manger,int saddr,GlobalOverManager* _global_over_manager)
  1606. {
  1607. unsigned int offset = 0;
  1608. unsigned short data_temp[10] = {0};
  1609. memset(data_temp, 0, sizeof(data_temp));;
  1610. offset = _SWITCH_T_AC_SINGLE_IN_Threshold;
  1611. int ret= g_modbus_read_x_reg(manger,saddr,offset,10,data_temp);
  1612. unsigned int value = 0;
  1613. float fvalue=0.0;
  1614. //电压上限
  1615. value = (data_temp[1] << 16) + data_temp[0];
  1616. fvalue=(float)value;
  1617. _global_over_manager->product_vol_upper_threshold = fvalue / 1000.0;
  1618. //电压下限
  1619. value = (data_temp[3] << 16) + data_temp[2];
  1620. fvalue=(float)value;
  1621. _global_over_manager->product_vol_lower_threshold = fvalue / 1000.0;
  1622. //电流上限
  1623. value = (data_temp[5] << 16) + data_temp[4];
  1624. fvalue=(float)value;
  1625. _global_over_manager->product_cur_upper_threshold = fvalue / 1000.0;
  1626. //功率上限
  1627. value = (data_temp[7] << 16) + data_temp[6];
  1628. fvalue=(float)value;
  1629. _global_over_manager->product_pwr_upper_threshold = fvalue / 1000.0;
  1630. //电能上限
  1631. value = (data_temp[9] << 16) + data_temp[8];
  1632. fvalue=(float)value;
  1633. _global_over_manager->product_pwrcon_upper_threshold = fvalue / 1000.0;
  1634. //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1635. return ret;
  1636. }
  1637. //阈值设置
  1638. int g_switch_set_t_ac_in_threshold(void* manger,int saddr,GlobalOverManager* _global_over_manager)
  1639. {
  1640. unsigned int offset = 0;
  1641. unsigned int data_temp = 0 ;
  1642. unsigned short data_buf[10] = {0};
  1643. int ret= 0;
  1644. memset(data_buf, 0, sizeof(data_buf));;
  1645. offset = _SWITCH_T_AC_SINGLE_IN_Threshold;
  1646. //电压上限
  1647. data_temp = (_global_over_manager->product_vol_upper_threshold*1000);
  1648. data_buf[0] = data_temp;
  1649. data_buf[1] = data_temp>>16;
  1650. ret=g_modbus_write_x_reg(manger,saddr,offset,2,data_buf);
  1651. //电压下限
  1652. data_temp = (_global_over_manager->product_vol_lower_threshold*1000);
  1653. data_buf[0] = data_temp;
  1654. data_buf[1] = data_temp>>16;
  1655. ret=g_modbus_write_x_reg(manger,saddr,offset+1,2,data_buf);
  1656. //电流上限
  1657. data_temp = (_global_over_manager->product_cur_upper_threshold*1000);
  1658. data_buf[0] = data_temp;
  1659. data_buf[1] = data_temp>>16;
  1660. ret=g_modbus_write_x_reg(manger,saddr,offset+2,2,data_buf);
  1661. //功率上限
  1662. data_temp = (_global_over_manager->product_pwr_upper_threshold*1000);
  1663. data_buf[0] = data_temp;
  1664. data_buf[1] = data_temp>>16;
  1665. ret=g_modbus_write_x_reg(manger,saddr,offset+3,2,data_buf);
  1666. //电能上限
  1667. data_temp = (_global_over_manager->product_pwrcon_upper_threshold*1000);
  1668. data_buf[0] = data_temp;
  1669. data_buf[1] = data_temp>>16;
  1670. ret=g_modbus_write_x_reg(manger,saddr,offset+4,2,data_buf);
  1671. //int ret= g_modbus_write_x_reg(manger,saddr,offset,10,data_buf);
  1672. if (ret<0)
  1673. {
  1674. log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
  1675. return ret;
  1676. }
  1677. memset(data_buf, 0, sizeof(data_buf));;
  1678. if(_global_over_manager->product_vol_upper_enable==1)data_buf[0]|=ENABLE_TAC_V_UP;
  1679. if(_global_over_manager->product_vol_lower_enable==1)data_buf[0]|=ENABLE_TAC_V_DOWN;
  1680. if(_global_over_manager->product_cur_upper_enable==1)data_buf[0]|=ENABLE_TAC_A_UP;
  1681. if(_global_over_manager->product_pwr_upper_enable==1)data_buf[0]|=ENABLE_TAC_W_UP;
  1682. if(_global_over_manager->product_pwrcon_upper_enable==1)data_buf[0]|=ENABLE_TAC_P_UP;
  1683. offset = _SWITCH_T_AC_IN_ENABLE;
  1684. ret= g_modbus_write_x_reg(manger,saddr,offset,2,data_buf);
  1685. return ret;
  1686. }
  1687. int ResetChmData()
  1688. {
  1689. //搜索子地址
  1690. int ret=0;
  1691. int chn = 1;
  1692. int type=0;
  1693. __globalDeviceManage.useSlaveCount=0;
  1694. for (size_t i = 1; i <= MAX_CHN_COUNT; i++)
  1695. {
  1696. type = 0 ;
  1697. int nMaxChn=0;
  1698. ret = g_switch_get_type(&__globalDeviceManage._globalRelaySampManger,
  1699. i,
  1700. &type,
  1701. &nMaxChn,
  1702. __globalDeviceManage._global_device_info->product_pwr_type);
  1703. log_d("ret:%d saddr:%d type:%d ch_num:%d.\n",ret,i,type,nMaxChn);
  1704. //int i =1 ;
  1705. //type = AC_SINGLE_S_TYPE ;
  1706. //chn = i ;
  1707. if(ret==0)
  1708. {
  1709. //有效地址记录
  1710. __globalDeviceManage.useSlaveCount ++ ;
  1711. switch (type)
  1712. {
  1713. case AC_SINGLE_S_TYPE://AC单相小电流 8路继电器
  1714. {
  1715. log_i("Address=%d AC_SINGLE_S_TYPE!\n",i);
  1716. for (size_t j = 0; j < nMaxChn; j++)
  1717. {
  1718. bool isLoad=false ;
  1719. GlobalPowerManger* _globalPowerMangerTemp=NULL;
  1720. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  1721. {
  1722. if (_globalPowerMangerTemp->product_saddr==i&&_globalPowerMangerTemp->product_ch_addr==j+1)
  1723. {
  1724. isLoad=true;
  1725. break;
  1726. }
  1727. }
  1728. if (!isLoad)
  1729. {
  1730. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  1731. if (_globalPowerMangerTemp == NULL)
  1732. {
  1733. // log_e("_globalPowerManger malloc error.\n");
  1734. return -1;
  1735. }
  1736. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1737. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1738. if (_globalPowerMangerTemp->global_over_manager == NULL)
  1739. {
  1740. // log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1741. return -1;
  1742. }
  1743. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  1744. }
  1745. //查询是否由通道信息
  1746. ret = dev_get_power_manage_info(__globalDeviceManage.db,
  1747. __globalDeviceManage._global_device_info->product_id,i,
  1748. j+1, //1*8+j
  1749. _globalPowerMangerTemp);
  1750. //未查询到信息 则插入
  1751. if(ret==-1)
  1752. {
  1753. _globalPowerMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id;
  1754. _globalPowerMangerTemp->product_saddr = i ;
  1755. _globalPowerMangerTemp->product_ch_id = chn;
  1756. _globalPowerMangerTemp->product_ch_addr = j+1;
  1757. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1758. _globalPowerMangerTemp->product_ch_type = type;
  1759. _globalPowerMangerTemp->product_ch_status = 0;
  1760. _globalPowerMangerTemp->product_ch_start_delay = 1000;
  1761. _globalPowerMangerTemp->product_ch_stop_delay = 1000;
  1762. if(dev_insert_power_manage_info(__globalDeviceManage.db,
  1763. __globalDeviceManage._global_device_info->product_id,
  1764. _globalPowerMangerTemp->product_ch_id,
  1765. _globalPowerMangerTemp)!=0)
  1766. {
  1767. log_e("address %d chn %d data inserted error.\n",i,chn);
  1768. return 0;
  1769. }
  1770. /*
  1771. else
  1772. {
  1773. log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
  1774. }
  1775. */
  1776. }
  1777. _globalPowerMangerTemp->product_saddr = i ;
  1778. //添加到队尾
  1779. if (!isLoad)
  1780. {
  1781. list_add_tail(&_globalPowerMangerTemp->list,&__globalDeviceManage._globalPowerManger.list);
  1782. }
  1783. chn+=1;
  1784. }
  1785. }
  1786. break;
  1787. case AC_SINGLE_B_TYPE://AC单相大电流 4路继电器
  1788. {
  1789. }
  1790. break;
  1791. case AC_MULTI_S_TYPE://预留
  1792. {
  1793. }
  1794. break;
  1795. case AC_MULTI_B_TYPE://预留
  1796. {
  1797. }
  1798. break;
  1799. case DC_OUT_TYPE: //DC输出继电器 1路
  1800. {
  1801. }
  1802. break;
  1803. case DC_IN_TYPE: // DC采集
  1804. {
  1805. }
  1806. break;
  1807. case DCPDU_TYPE: // DCPDU
  1808. {
  1809. log_i("DCPDU_TYPE!\n");
  1810. for (size_t j = 0; j < nMaxChn; j++)
  1811. {
  1812. bool isLoad=false ;
  1813. GlobalPowerManger* _globalPowerMangerTemp=NULL;
  1814. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  1815. {
  1816. if (_globalPowerMangerTemp->product_saddr==i&&_globalPowerMangerTemp->product_ch_addr==j+1)
  1817. {
  1818. isLoad=true;
  1819. break;
  1820. }
  1821. }
  1822. if (!isLoad)
  1823. {
  1824. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  1825. if (_globalPowerMangerTemp == NULL)
  1826. {
  1827. log_e("_globalPowerManger malloc error.\n");
  1828. return -1;
  1829. }
  1830. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1831. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1832. if (_globalPowerMangerTemp->global_over_manager == NULL)
  1833. {
  1834. // log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1835. return -1;
  1836. }
  1837. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  1838. }
  1839. //查询是否由通道信息
  1840. ret = dev_get_power_manage_info(__globalDeviceManage.db,
  1841. __globalDeviceManage._global_device_info->product_id,i,
  1842. j+1, //1*8+j
  1843. _globalPowerMangerTemp);
  1844. _globalPowerMangerTemp->product_ch_addr = j+1;
  1845. //未查询到信息 则插入
  1846. if(ret==-1)
  1847. {
  1848. _globalPowerMangerTemp->product_id = __globalDeviceManage._global_device_info->product_id;
  1849. _globalPowerMangerTemp->product_saddr = i ;
  1850. _globalPowerMangerTemp->product_ch_id = chn;
  1851. _globalPowerMangerTemp->product_ch_addr = j+1;
  1852. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1853. _globalPowerMangerTemp->product_ch_type = type;
  1854. _globalPowerMangerTemp->product_ch_status = 0;
  1855. _globalPowerMangerTemp->product_ch_start_delay = 1000;
  1856. _globalPowerMangerTemp->product_ch_stop_delay = 1000;
  1857. if(dev_insert_power_manage_info(__globalDeviceManage.db,
  1858. __globalDeviceManage._global_device_info->product_id,
  1859. _globalPowerMangerTemp->product_ch_id,
  1860. _globalPowerMangerTemp)!=0)
  1861. {
  1862. log_e("address %d chn %d data inserted error.\n",i,chn);
  1863. return 0;
  1864. }
  1865. }
  1866. _globalPowerMangerTemp->product_saddr = i ;
  1867. _globalPowerMangerTemp->product_ch_type = type;
  1868. if (dev_update_power_manage_genera_info(__globalDeviceManage.db,__globalDeviceManage._global_device_info->product_id,chn,_globalPowerMangerTemp) != 0)
  1869. {
  1870. log_e("update pwr general data err.");
  1871. }
  1872. //添加到队尾
  1873. if (!isLoad)
  1874. {
  1875. list_add_tail(&_globalPowerMangerTemp->list,&__globalDeviceManage._globalPowerManger.list);
  1876. }
  1877. chn+=1;
  1878. }
  1879. }
  1880. break;
  1881. }
  1882. }
  1883. else
  1884. break;
  1885. }
  1886. }