switch_ctrl.c 78 KB

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