app.c 135 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445
  1. #include "app.h"
  2. #include "common.h"
  3. #include "switch_ctrl.h"
  4. #include "appweb_handle.h"
  5. #include "modbus_handle.h"
  6. #include "sqlite_handle.h"
  7. #include <sys/time.h>
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. #include "elog.h"
  11. #include "sensor_handle.h"
  12. #include "websocket_handle.h"
  13. #include "paras.h"
  14. #include "thread.h"
  15. #include "cascade.h"
  16. #include "upg.h"
  17. #include "sys.h"
  18. #include "cfg.h"
  19. #include "lock.h"
  20. #include "netswitch.h"
  21. #include "breaker_detection.h"
  22. #include <sys/mman.h>
  23. #include <string.h>
  24. #include <fcntl.h>
  25. #include <sys/stat.h>
  26. #include <sys/types.h>
  27. #include <unistd.h>
  28. static int keep_running;
  29. RETSIGTYPE stop_server(int __attribute__((unused)) a)
  30. {
  31. keep_running = 0;
  32. }
  33. /// @brief 电源数据采集线程
  34. /// @param arg
  35. /// @return
  36. void* power_thread(void* arg)
  37. {
  38. int ret = 0 ;
  39. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  40. GlobalPowerInfo _globalPowerInfo ;
  41. GlobalPowerInfo _globalTotalPowerInfo ; //总电源信息
  42. GlobalTreeACManager* pTreeAPowerInfo; //三相子电源信息
  43. GlobalTreeACManager* _pTreeACPowerMangerTemp = NULL ;
  44. PowerWarningInfo _globalPowerWarningInfo ;
  45. PowerWarningInfo _globalTACWarningInfo;
  46. float Vavg[3]={0.0,0.0,0.0};
  47. int VavgTimes[3]={0,0,0};
  48. struct tm* t ;
  49. struct timeval tv;
  50. struct timezone tz ;
  51. int nSaveIndex =0;
  52. char strPower[] = "Table_PowerInfo";
  53. char strTacPower[] = "Table_PhasePowerInfo";
  54. int nSaveTacIndex = 0;
  55. thread_handle_t *h=(thread_handle_t*)arg;
  56. GlobalDeviceManager* _globalDeviceManager = (GlobalDeviceManager*)h->arg;
  57. _PowerDSManage_t* _powerDsManageTemp = NULL ;
  58. dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strPower); // 查询日志最大点
  59. dev_search_last_Index(_globalDeviceManager->db, &nSaveTacIndex, strTacPower); // 查询日志最大点
  60. _globalDeviceManager->_global_alarmLanguage=create_hash_table(500);
  61. InitHashTable(_globalDeviceManager->_global_alarmLanguage);
  62. unsigned int samp_time = _globalDeviceManager->_globalDevInfo.product_samp_time;
  63. unsigned int usleepTime = samp_time*1000;
  64. unsigned int sSaveTime = _globalDeviceManager->_globalDevInfo.product_save_time;
  65. log_d("samp_time:%dms save_time:%dms\n", samp_time,sSaveTime);
  66. int nMaxIndex=2000000000;
  67. int nDeleteNumber=1000/sSaveTime*3600*24*30*10;
  68. bool isErrorBreak=false;
  69. _globalDeviceManager->_ReloadChm_flag=false;
  70. list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
  71. {
  72. ret = g_switch_set_all_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr,_globalPowerMangerTemp->product_ch_start_delay);
  73. if (ret<0)
  74. {
  75. //usleep(300000);
  76. g_switch_set_all_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr,_globalPowerMangerTemp->product_ch_start_delay);
  77. }
  78. //usleep(300000);
  79. ret=g_switch_set_all_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr,_globalPowerMangerTemp->product_ch_stop_delay);
  80. if (ret<0)
  81. {
  82. // usleep(300000);
  83. g_switch_set_all_stop_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr,_globalPowerMangerTemp->product_ch_stop_delay);
  84. }
  85. //usleep(300000);
  86. }
  87. //采集线程
  88. while (h->quit==0)
  89. {
  90. if (_globalDeviceManager->_ReloadChm_flag)
  91. {
  92. sleep(1);
  93. continue;
  94. }
  95. if (nSaveIndex>nMaxIndex/2)
  96. {
  97. dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strPower);
  98. }
  99. if (nSaveTacIndex > nMaxIndex / 2)
  100. {
  101. dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strTacPower);
  102. }
  103. #if (1)
  104. memset(&_globalTotalPowerInfo, 0, sizeof(GlobalPowerInfo));
  105. memset(&_globalPowerWarningInfo, 0, sizeof(PowerWarningInfo));
  106. for (size_t i = 0; i < MAX_CHN_COUNT; i++)
  107. {
  108. if (_globalDeviceManager->_all_ctrl_board[i].product_saddr == 0)
  109. {
  110. continue;
  111. }
  112. ret=g_switch_get_all_out_info(&_globalDeviceManager->_globalRelaySampManger,
  113. _globalDeviceManager->_all_ctrl_board[i].product_type,
  114. _globalDeviceManager->_all_ctrl_board[i].product_saddr,
  115. _globalDeviceManager->_all_ctrl_board[i].product_number,
  116. _globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
  117. _globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
  118. if (ret<0)
  119. {
  120. usleep(usleepTime);
  121. ret = g_switch_get_all_out_info(&_globalDeviceManager->_globalRelaySampManger,
  122. _globalDeviceManager->_all_ctrl_board[i].product_type,
  123. _globalDeviceManager->_all_ctrl_board[i].product_saddr,
  124. _globalDeviceManager->_all_ctrl_board[i].product_number,
  125. _globalDeviceManager->_all_ctrl_board[i]._PowerInfo,
  126. _globalDeviceManager->_all_ctrl_board[i]._PowerWarninginfo);
  127. }
  128. // 输入总信息(三相)(后续应同步所有类型)
  129. if (_globalDeviceManager->_all_ctrl_board[i].product_saddr != 0 && _globalDeviceManager->_all_ctrl_board[i].product_type == TREE_AC_TYPE)
  130. {
  131. usleep(usleepTime);
  132. ret = g_switch_get_t_ac_in_info(&_globalDeviceManager->_globalRelaySampManger,
  133. _globalDeviceManager->_all_ctrl_board[i].product_saddr, // saadr
  134. _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
  135. _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
  136. if (ret < 0)
  137. {
  138. usleep(usleepTime);
  139. ret = g_switch_get_t_ac_in_info(&_globalDeviceManager->_globalRelaySampManger,
  140. _globalDeviceManager->_all_ctrl_board[i].product_saddr, // saadr
  141. _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo,
  142. _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerWarninginfo);
  143. }
  144. }
  145. //usleep(usleepTime);
  146. }
  147. bool SaveDBFlag=false; //数据库存储记录,只要有通道存,就存一次总通道数据
  148. int _chn = 0;
  149. memset(Vavg,0.0,sizeof(Vavg));
  150. memset(VavgTimes,0,sizeof(VavgTimes));
  151. //数据刷新
  152. pthread_mutex_lock(&__globalDeviceManage._power_update);
  153. //清空三项总数据
  154. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  155. {
  156. list_for_each_entry(pTreeAPowerInfo, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  157. {
  158. int nTreeACType = pTreeAPowerInfo->product_ph_type;
  159. if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
  160. {
  161. continue;
  162. }
  163. memset(&pTreeAPowerInfo->_PowerInfo, 0, sizeof(PowerInfo));
  164. }
  165. }
  166. list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
  167. {
  168. //获取通道类型
  169. if (!(_globalPowerMangerTemp->product_saddr < MAX_CHN_COUNT && _globalPowerMangerTemp->product_saddr > 0))
  170. {
  171. continue;
  172. }
  173. if (!(_globalPowerMangerTemp->product_ch_addr < AC_SINGLE_S_MAX_CHN_NUM && _globalPowerMangerTemp->product_ch_addr > 0))
  174. {
  175. continue;
  176. }
  177. //log_d("ch%d cpy address:%d,chraddr:%d.\n",_globalPowerMangerTemp->product_ch_id,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr);
  178. memcpy(&_globalPowerInfo._power_info,
  179. &_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[(int)_globalPowerMangerTemp->product_ch_addr-1],
  180. sizeof(PowerInfo));
  181. if(_globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  182. _globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_DC)
  183. {
  184. if (_chn<64)
  185. {
  186. _globalDeviceManager->single_mmap->all_ch[_chn].consumption = _globalPowerInfo._power_info.consumption * 1000;
  187. _globalDeviceManager->single_mmap->all_ch[_chn].voltage = _globalPowerInfo._power_info.voltage * 1000;
  188. _globalDeviceManager->single_mmap->all_ch[_chn].factor = _globalPowerInfo._power_info.factor * 1000;
  189. _globalDeviceManager->single_mmap->all_ch[_chn].freq = _globalPowerInfo._power_info.freq * 1000;
  190. _globalDeviceManager->single_mmap->all_ch[_chn].power = _globalPowerInfo._power_info.power * 1000;
  191. _globalDeviceManager->single_mmap->all_ch[_chn].current = _globalPowerInfo._power_info.current * 1000;
  192. _globalDeviceManager->single_mmap->chn_status[_chn] = _globalPowerInfo._power_info.status;
  193. _globalDeviceManager->single_mmap->open_delay[_chn] = _globalPowerMangerTemp->product_ch_start_delay;
  194. _globalDeviceManager->single_mmap->close_delay[_chn] = _globalPowerMangerTemp->product_ch_stop_delay;
  195. }
  196. }
  197. memcpy(&_globalPowerWarningInfo,
  198. &_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[(int)_globalPowerMangerTemp->product_ch_addr-1],
  199. sizeof(PowerInfo));
  200. switch (_globalPowerMangerTemp->product_ch_type)
  201. {
  202. case AC_SINGLE_S_TYPE:
  203. case AC_SINGLE_B_TYPE:
  204. {
  205. //累加总电源信息
  206. _globalTotalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  207. _globalTotalPowerInfo.product_ch_id = 0 ; //总电源通道信息为0
  208. _globalTotalPowerInfo.product_status = 0 ;
  209. _globalTotalPowerInfo._power_info.voltage = _globalTotalPowerInfo._power_info.voltage > _globalPowerInfo._power_info.voltage ? _globalTotalPowerInfo._power_info.voltage : _globalPowerInfo._power_info.voltage;
  210. _globalTotalPowerInfo._power_info.current += _globalPowerInfo._power_info.current ;
  211. _globalTotalPowerInfo._power_info.power += _globalPowerInfo._power_info.power ;
  212. _globalTotalPowerInfo._power_info.freq = _globalTotalPowerInfo._power_info.freq > _globalPowerInfo._power_info.freq ? _globalTotalPowerInfo._power_info.freq : _globalPowerInfo._power_info.freq;
  213. _globalTotalPowerInfo._power_info.consumption += _globalPowerInfo._power_info.consumption ;
  214. _globalTotalPowerInfo._power_info.factor = _globalTotalPowerInfo._power_info.factor > _globalPowerInfo._power_info.factor ? _globalTotalPowerInfo._power_info.factor : _globalPowerInfo._power_info.factor;
  215. //补全信息
  216. _globalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  217. _globalPowerInfo.product_ch_id = _globalPowerMangerTemp->product_ch_id ;
  218. _globalPowerInfo.product_status = _globalPowerInfo._power_info.status ;
  219. gettimeofday(&tv, NULL);
  220. //t = localtime(&tv.tv_sec);
  221. time_t now;
  222. time(&now);
  223. t = localtime(&now);
  224. char buffer[80];
  225. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  226. memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
  227. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  228. sprintf(buffer,".%03ld",tv.tv_usec/1000);
  229. strcat(_globalPowerInfo.samp_time,buffer);
  230. if (difftime(now,_globalPowerMangerTemp->product_log_time)>(sSaveTime/1000))
  231. {
  232. _globalPowerMangerTemp->product_log_time=now;
  233. SaveDBFlag=true;
  234. /* code */
  235. //插入数据库
  236. if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&nSaveIndex)!=0)
  237. {
  238. log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
  239. }
  240. }
  241. //判断阈值状态
  242. if (_globalPowerWarningInfo.w_voltage_up!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up)
  243. {
  244. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up=_globalPowerWarningInfo.w_voltage_up;
  245. /*高电压 */
  246. if (_globalPowerWarningInfo.w_voltage_up) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_UP);
  247. }
  248. if (_globalPowerWarningInfo.w_voltage_down!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down)
  249. {
  250. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down=_globalPowerWarningInfo.w_voltage_down;
  251. /*低电压 */
  252. if(_globalPowerWarningInfo.w_voltage_down) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_DOWN);
  253. }
  254. if (_globalPowerWarningInfo.w_current!=_globalPowerMangerTemp->_PowerWarninginfo.w_current)
  255. {
  256. _globalPowerMangerTemp->_PowerWarninginfo.w_current=_globalPowerWarningInfo.w_current;
  257. /*高电流 */
  258. if(_globalPowerWarningInfo.w_current) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_A_UP);
  259. }
  260. if (_globalPowerWarningInfo.w_power!=_globalPowerMangerTemp->_PowerWarninginfo.w_power)
  261. {
  262. _globalPowerMangerTemp->_PowerWarninginfo.w_power=_globalPowerWarningInfo.w_power;
  263. /*高功率 */
  264. if(_globalPowerWarningInfo.w_power) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_W_UP);
  265. }
  266. if (_globalPowerWarningInfo.w_consumption!=_globalPowerMangerTemp->_PowerWarninginfo.w_consumption)
  267. {
  268. _globalPowerMangerTemp->_PowerWarninginfo.w_consumption=_globalPowerWarningInfo.w_consumption;
  269. /*高耗电 */
  270. if(_globalPowerWarningInfo.w_consumption)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_P_UP);
  271. }
  272. //动作
  273. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  274. {
  275. GlobalTreeACManager *_pTreeACPowerPhData = NULL;
  276. memset(&_globalPowerInfo._power_info, 0, sizeof(_globalPowerInfo._power_info));
  277. int k = 0;
  278. list_for_each_entry(_pTreeACPowerMangerTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  279. {
  280. //筛选控制中的数据
  281. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B && _pTreeACPowerMangerTemp->product_ph_outputStatus == 2)
  282. {
  283. continue;
  284. }
  285. memcpy(&_pTreeACPowerMangerTemp->_PowerInfo, &_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerInfo[_pTreeACPowerMangerTemp->product_ch_addr - 1], sizeof(PowerInfo));
  286. memcpy(&_pTreeACPowerMangerTemp->_PowerWarninginfo, &_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerWarninginfo[_pTreeACPowerMangerTemp->product_ch_addr - 1], sizeof(PowerWarningInfo));
  287. gettimeofday(&tv, NULL);
  288. // t = localtime(&tv.tv_sec);
  289. // 计算总三项总数据
  290. _globalPowerInfo._power_info.voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage;
  291. _globalPowerInfo._power_info.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
  292. _globalPowerInfo._power_info.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
  293. _globalPowerInfo._power_info.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
  294. _globalPowerInfo._power_info.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
  295. _globalPowerInfo._power_info.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
  296. //
  297. pTreeAPowerInfo = NULL;
  298. list_for_each_entry(pTreeAPowerInfo, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  299. {
  300. int nTreeACType = pTreeAPowerInfo->product_ph_type;
  301. if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
  302. {
  303. continue;
  304. }
  305. if (nTreeACType == _pTreeACPowerMangerTemp->product_ph_type)
  306. {
  307. if (_pTreeACPowerMangerTemp->_PowerInfo.voltage > 0)
  308. {
  309. if (VavgTimes[nTreeACType] == 0)
  310. {
  311. Vavg[nTreeACType] = _pTreeACPowerMangerTemp->_PowerInfo.voltage;
  312. }
  313. else
  314. {
  315. Vavg[nTreeACType] = (Vavg[nTreeACType] * VavgTimes[nTreeACType] + _pTreeACPowerMangerTemp->_PowerInfo.voltage) / (VavgTimes[nTreeACType] + 1);
  316. }
  317. pTreeAPowerInfo->_PowerInfo.voltage = Vavg[nTreeACType];
  318. pTreeAPowerInfo->_PowerInfo.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
  319. pTreeAPowerInfo->_PowerInfo.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
  320. pTreeAPowerInfo->_PowerInfo.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
  321. pTreeAPowerInfo->_PowerInfo.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
  322. pTreeAPowerInfo->_PowerInfo.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
  323. VavgTimes[nTreeACType] += 1;
  324. }
  325. }
  326. }
  327. if (__globalDeviceManage.triphasic_mmap)
  328. {
  329. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption * 1000;
  330. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_current = _pTreeACPowerMangerTemp->_PowerInfo.current * 1000;
  331. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_power = _pTreeACPowerMangerTemp->_PowerInfo.power * 1000;
  332. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage * 1000;
  333. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_type = _pTreeACPowerMangerTemp->product_ph_type;
  334. }
  335. if (_globalPowerInfo._power_info.status == 0)
  336. {
  337. _globalPowerInfo._power_info.status = _pTreeACPowerMangerTemp->_PowerInfo.status;
  338. }
  339. else
  340. {
  341. _globalPowerInfo._power_info.status = 0;
  342. }
  343. if (__globalDeviceManage.triphasic_mmap)
  344. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_status = _globalPowerInfo._power_info.status;
  345. time_t now;
  346. time(&now);
  347. t = localtime(&now);
  348. char buffer[80];
  349. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  350. memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
  351. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  352. sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  353. strcat(_globalPowerInfo.samp_time, buffer);
  354. if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
  355. {
  356. _pTreeACPowerMangerTemp->product_log_time = now;
  357. /* code */
  358. // 插入数据库
  359. if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex, _globalPowerInfo.samp_time) != 0)
  360. {
  361. log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
  362. }
  363. }
  364. }
  365. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_consumption = _globalTotalPowerInfo._power_info.consumption * 1000;
  366. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_freq = _globalTotalPowerInfo._power_info.freq * 1000;
  367. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_power = _globalTotalPowerInfo._power_info.power * 1000;
  368. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_factor = _globalTotalPowerInfo._power_info.factor * 1000;
  369. _globalDeviceManager->triphasic_mmap->chn_status[_chn] = _globalPowerInfo._power_info.status;
  370. _globalDeviceManager->triphasic_mmap->open_delay[_chn] = _globalPowerMangerTemp->product_ch_start_delay;
  371. _globalDeviceManager->triphasic_mmap->close_delay[_chn] = _globalPowerMangerTemp->product_ch_stop_delay;
  372. }
  373. }
  374. break;
  375. case DC_OUT_TYPE:
  376. {
  377. }
  378. break;
  379. case DC_IN_TYPE:
  380. {
  381. }
  382. break;
  383. case DCPDU_TYPE:
  384. {
  385. /*
  386. memset(&_globalPowerInfo,0,sizeof(GlobalPowerInfo));
  387. //拿数据
  388. ret = g_switch_get_dcpdu_out_info(&_globalDeviceManager->_globalRelaySampManger,
  389. _globalPowerMangerTemp->product_saddr,//saadr
  390. (_globalPowerMangerTemp->product_ch_addr-1), //考虑多通道编码 %8
  391. &_globalPowerInfo._power_info,&_globalPowerWarningInfo);
  392. if(ret<0)
  393. {
  394. log_d("ch%d get data error.\n",_globalPowerMangerTemp->product_ch_id);
  395. isErrorBreak=true;
  396. break;
  397. }*/
  398. _globalTotalPowerInfo._power_info.voltage = _globalTotalPowerInfo._power_info.voltage > _globalPowerInfo._power_info.voltage ? _globalTotalPowerInfo._power_info.voltage : _globalPowerInfo._power_info.voltage;
  399. _globalTotalPowerInfo._power_info.current += _globalPowerInfo._power_info.current ;
  400. _globalTotalPowerInfo._power_info.power += _globalPowerInfo._power_info.power ;
  401. _globalTotalPowerInfo._power_info.freq = _globalTotalPowerInfo._power_info.freq;
  402. _globalTotalPowerInfo._power_info.consumption += _globalPowerInfo._power_info.consumption ;
  403. _globalTotalPowerInfo._power_info.factor = _globalPowerInfo._power_info.factor ;
  404. _globalPowerInfo.product_status = _globalPowerInfo._power_info.status ;
  405. _globalPowerMangerTemp->product_ch_status = _globalPowerInfo._power_info.status ;
  406. //累加总电源信息
  407. _globalTotalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  408. _globalTotalPowerInfo.product_ch_id = 0 ; //总电源通道信息为0
  409. _globalTotalPowerInfo.product_status = 0 ;
  410. //补全信息
  411. _globalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  412. _globalPowerInfo.product_ch_id = _globalPowerMangerTemp->product_ch_id ;
  413. gettimeofday(&tv, NULL);
  414. //t = localtime(&tv.tv_sec);
  415. time_t now;
  416. time(&now);
  417. t = localtime(&now);
  418. char buffer[80];
  419. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  420. memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
  421. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  422. sprintf(buffer,".%03ld",tv.tv_usec/1000);
  423. strcat(_globalPowerInfo.samp_time,buffer);
  424. // sprintf(_globalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03d",
  425. // t->tm_year+1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec,tv.tv_usec/1000);
  426. if (difftime(now,_globalPowerMangerTemp->product_log_time)>(sSaveTime/1000))
  427. {
  428. _globalPowerMangerTemp->product_log_time=now;
  429. SaveDBFlag=true;
  430. /* code */
  431. //插入数据库
  432. if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&nSaveIndex)!=0)
  433. {
  434. log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
  435. }
  436. }
  437. //插入数据库
  438. if (_globalPowerWarningInfo.w_voltage_up!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up)
  439. {
  440. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up=_globalPowerWarningInfo.w_voltage_up;
  441. /*未知故障 */
  442. if(_globalPowerWarningInfo.w_voltage_up) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_UP);
  443. }
  444. if (_globalPowerWarningInfo.w_voltage_down!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down)
  445. {
  446. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down=_globalPowerWarningInfo.w_voltage_down;
  447. /*低电压 */
  448. if(_globalPowerWarningInfo.w_voltage_down) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_DOWN);
  449. }
  450. if (_globalPowerWarningInfo.w_current!=_globalPowerMangerTemp->_PowerWarninginfo.w_current)
  451. {
  452. _globalPowerMangerTemp->_PowerWarninginfo.w_current=_globalPowerWarningInfo.w_current;
  453. /*高电流 */
  454. if(_globalPowerWarningInfo.w_current)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_A_UP);
  455. }
  456. if (_globalPowerWarningInfo.w_power!=_globalPowerMangerTemp->_PowerWarninginfo.w_power)
  457. {
  458. _globalPowerMangerTemp->_PowerWarninginfo.w_power=_globalPowerWarningInfo.w_power;
  459. /*高功率 */
  460. if(_globalPowerWarningInfo.w_power)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_W_UP);
  461. }
  462. if (_globalPowerWarningInfo.w_consumption!=_globalPowerMangerTemp->_PowerWarninginfo.w_consumption)
  463. {
  464. _globalPowerMangerTemp->_PowerWarninginfo.w_consumption=_globalPowerWarningInfo.w_consumption;
  465. /*高耗电 */
  466. if(_globalPowerWarningInfo.w_consumption)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_P_UP);
  467. }
  468. //else
  469. //log_i("%s ch%d insert data ok status:%d.\n",_globalPowerInfo.samp_time,_globalPowerMangerTemp->product_ch_id,_globalPowerInfo.product_status);
  470. //判断阈值状态
  471. //unsigned int start_delay[8], stop_delay[8];
  472. //ret = g_switch_get_dcpdu_start_time_delay(&_globalDeviceManager->_globalRelaySampManger, _globalPowerMangerTemp->product_saddr, start_delay);
  473. //if (ret == 0) _globalPowerMangerTemp->product_ch_start_delay = start_delay[_globalPowerMangerTemp->product_ch_addr - 1] * 1000;
  474. //ret = g_switch_get_dcpdu_stop_time_delay(&_globalDeviceManager->_globalRelaySampManger, _globalPowerMangerTemp->product_saddr, stop_delay);
  475. //if (ret == 0) _globalPowerMangerTemp->product_ch_stop_delay = stop_delay[_globalPowerMangerTemp->product_ch_addr - 1] * 1000;
  476. //GlobalOverManager overmanager;
  477. //memset(&overmanager, 0, sizeof(overmanager));
  478. //memcpy(_globalPowerMangerTemp->global_over_manager, &overmanager, sizeof(overmanager));
  479. //ret = g_switch_get_dcpdu_threshold(&_globalDeviceManager->_globalRelaySampManger, _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr-1), &overmanager);
  480. //_globalPowerMangerTemp->global_over_manager->product_vol_upper_threshold = overmanager.product_vol_upper_threshold;
  481. //_globalPowerMangerTemp->global_over_manager->product_vol_lower_threshold = overmanager.product_vol_lower_threshold;
  482. //_globalPowerMangerTemp->global_over_manager->product_cur_upper_threshold = overmanager.product_cur_upper_threshold;
  483. //_globalPowerMangerTemp->global_over_manager->product_cur_lower_threshold = overmanager.product_cur_lower_threshold;
  484. //动作
  485. }
  486. break;
  487. case TREE_AC_TYPE:
  488. {
  489. GlobalTreeACManager* _pTreeACPowerPhData = NULL ;
  490. memset(&_globalPowerInfo._power_info, 0, sizeof(_globalPowerInfo._power_info));
  491. int k = 0;
  492. list_for_each_entry(_pTreeACPowerMangerTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
  493. {
  494. if (__globalDeviceManage._globalDevInfo.product_pwr_type==SmartPDU_Tree_AC_One&&_pTreeACPowerMangerTemp->product_ph_outputStatus==2)
  495. {
  496. continue;
  497. }
  498. memcpy(&_pTreeACPowerMangerTemp->_PowerInfo,&_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerInfo[_pTreeACPowerMangerTemp->product_ch_addr - 1],sizeof(PowerInfo));
  499. memcpy(&_globalTACWarningInfo,&_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerWarninginfo[_pTreeACPowerMangerTemp->product_ch_addr - 1],sizeof(PowerWarningInfo));
  500. gettimeofday(&tv, NULL);
  501. // t = localtime(&tv.tv_sec);
  502. //计算总三项总数据
  503. _globalPowerInfo._power_info.voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage;
  504. _globalPowerInfo._power_info.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
  505. _globalPowerInfo._power_info.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
  506. _globalPowerInfo._power_info.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
  507. _globalPowerInfo._power_info.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
  508. _globalPowerInfo._power_info.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
  509. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption * 1000;
  510. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_current = _pTreeACPowerMangerTemp->_PowerInfo.current * 1000;
  511. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_power = _pTreeACPowerMangerTemp->_PowerInfo.power * 1000;
  512. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage * 1000;
  513. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_type = _pTreeACPowerMangerTemp->product_ph_type;
  514. if(_globalPowerInfo._power_info.status==0)
  515. {
  516. _globalPowerInfo._power_info.status=_pTreeACPowerMangerTemp->_PowerInfo.status;
  517. }
  518. else
  519. {
  520. _globalPowerInfo._power_info.status=0;
  521. }
  522. __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_status = _globalPowerInfo._power_info.status;
  523. _globalPowerInfo._power_info.NF_status=_pTreeACPowerMangerTemp->_PowerInfo.NF_status;
  524. k=k+1;
  525. time_t now;
  526. time(&now);
  527. t = localtime(&now);
  528. char buffer[80];
  529. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  530. memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
  531. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  532. sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  533. strcat(_globalPowerInfo.samp_time, buffer);
  534. if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
  535. {
  536. _pTreeACPowerMangerTemp->product_log_time = now;
  537. /* code */
  538. // 插入数据库
  539. if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex,_globalPowerInfo.samp_time) != 0)
  540. {
  541. log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
  542. }
  543. }
  544. // 判断阈值状态
  545. if (_globalTACWarningInfo.w_voltage_up != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_voltage_up )
  546. {
  547. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_voltage_up = _globalTACWarningInfo.w_voltage_up;
  548. /*高电压 */
  549. if( _globalTACWarningInfo.w_voltage_up) dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_V_UP);
  550. }
  551. if (_globalTACWarningInfo.w_voltage_down != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_voltage_down )
  552. {
  553. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_voltage_down = _globalTACWarningInfo.w_voltage_down;
  554. /*低电压 */
  555. if( _globalTACWarningInfo.w_voltage_down)dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_V_DOWN);
  556. }
  557. if (_globalTACWarningInfo.w_current != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_current )
  558. {
  559. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_current = _globalTACWarningInfo.w_current;
  560. /*高电流 */
  561. if( _globalTACWarningInfo.w_current)dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_A_UP);
  562. }
  563. if (_globalTACWarningInfo.w_power != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_power )
  564. {
  565. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_power = _globalTACWarningInfo.w_power;
  566. /*高功率 */
  567. if( _globalTACWarningInfo.w_power)dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_W_UP);
  568. }
  569. if (_globalTACWarningInfo.w_consumption != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_consumption)
  570. {
  571. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_consumption = _globalTACWarningInfo.w_consumption;
  572. /*高耗电 */
  573. if(_globalTACWarningInfo.w_consumption)dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_P_UP);
  574. }
  575. if (_globalTACWarningInfo.w_phase_loss != _pTreeACPowerMangerTemp->_PowerWarninginfo.w_phase_loss )
  576. {
  577. _pTreeACPowerMangerTemp->_PowerWarninginfo.w_phase_loss = _globalTACWarningInfo.w_phase_loss;
  578. /*缺项 */
  579. if( _globalTACWarningInfo.w_phase_loss)dev_Alarm_T_AC_message(_globalDeviceManager, _pTreeACPowerMangerTemp, ENABLE_TAC_STIME);
  580. }
  581. }
  582. _globalTotalPowerInfo._power_info.voltage = _globalPowerInfo._power_info.voltage ;
  583. _globalTotalPowerInfo._power_info.current += _globalPowerInfo._power_info.current ;
  584. _globalTotalPowerInfo._power_info.power += _globalPowerInfo._power_info.power ;
  585. _globalTotalPowerInfo._power_info.freq = _globalPowerInfo._power_info.freq;
  586. _globalTotalPowerInfo._power_info.consumption += _globalPowerInfo._power_info.consumption ;
  587. _globalTotalPowerInfo._power_info.factor = _globalPowerInfo._power_info.factor ;
  588. _globalPowerInfo.product_status = _globalPowerInfo._power_info.status ;
  589. _globalPowerMangerTemp->product_ch_status = _globalPowerInfo._power_info.status ;
  590. _globalPowerMangerTemp->product_ch_NF_status = _globalPowerInfo._power_info.NF_status ;
  591. // tong dao zong ti xin xi
  592. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_consumption = _globalTotalPowerInfo._power_info.consumption * 1000;
  593. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_freq = _globalTotalPowerInfo._power_info.freq * 1000;
  594. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_power = _globalTotalPowerInfo._power_info.power * 1000;
  595. __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_factor = _globalTotalPowerInfo._power_info.factor * 1000;
  596. _globalDeviceManager->triphasic_mmap->chn_status[_chn] = _globalPowerInfo._power_info.status;
  597. _globalDeviceManager->triphasic_mmap->open_delay[_chn] = _globalPowerMangerTemp->product_ch_start_delay;
  598. _globalDeviceManager->triphasic_mmap->close_delay[_chn] = _globalPowerMangerTemp->product_ch_stop_delay;
  599. //累加总电源信息
  600. _globalTotalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  601. _globalTotalPowerInfo.product_ch_id = 0 ; //总电源通道信息为0
  602. _globalTotalPowerInfo.product_status = 0 ;
  603. //补全信息
  604. _globalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  605. _globalPowerInfo.product_ch_id = _globalPowerMangerTemp->product_ch_id ;
  606. gettimeofday(&tv, NULL);
  607. //t = localtime(&tv.tv_sec);
  608. time_t now;
  609. time(&now);
  610. t = localtime(&now);
  611. char buffer[80];
  612. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  613. memset(_globalPowerInfo.samp_time,0,sizeof(_globalPowerInfo.samp_time));
  614. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  615. sprintf(buffer,".%03ld",tv.tv_usec/1000);
  616. strcat(_globalPowerInfo.samp_time,buffer);
  617. // sprintf(_globalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03d",
  618. // t->tm_year+1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec,tv.tv_usec/1000);
  619. if (difftime(now,_globalPowerMangerTemp->product_log_time)>(sSaveTime/1000))
  620. {
  621. _globalPowerMangerTemp->product_log_time=now;
  622. SaveDBFlag=true;
  623. /* code */
  624. //插入数据库
  625. if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&nSaveIndex)!=0)
  626. {
  627. log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
  628. }
  629. }
  630. //判断阈值状态
  631. if (_globalPowerWarningInfo.w_voltage_up!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up)
  632. {
  633. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_up=_globalPowerWarningInfo.w_voltage_up;
  634. /*高电压 */
  635. if(_globalPowerWarningInfo.w_voltage_up) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_UP);
  636. }
  637. if (_globalPowerWarningInfo.w_voltage_down!=_globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down)
  638. {
  639. _globalPowerMangerTemp->_PowerWarninginfo.w_voltage_down=_globalPowerWarningInfo.w_voltage_down;
  640. /*低电压 */
  641. if(_globalPowerWarningInfo.w_voltage_down) dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_V_DOWN);
  642. }
  643. if (_globalPowerWarningInfo.w_current!=_globalPowerMangerTemp->_PowerWarninginfo.w_current)
  644. {
  645. _globalPowerMangerTemp->_PowerWarninginfo.w_current=_globalPowerWarningInfo.w_current;
  646. /*高电流 */
  647. if(_globalPowerWarningInfo.w_current)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_A_UP);
  648. }
  649. if (_globalPowerWarningInfo.w_power!=_globalPowerMangerTemp->_PowerWarninginfo.w_power)
  650. {
  651. _globalPowerMangerTemp->_PowerWarninginfo.w_power=_globalPowerWarningInfo.w_power;
  652. /*高功率 */
  653. if(_globalPowerWarningInfo.w_power)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_W_UP);
  654. }
  655. if (_globalPowerWarningInfo.w_consumption!=_globalPowerMangerTemp->_PowerWarninginfo.w_consumption)
  656. {
  657. _globalPowerMangerTemp->_PowerWarninginfo.w_consumption=_globalPowerWarningInfo.w_consumption;
  658. /*高耗电 */
  659. if(_globalPowerWarningInfo.w_consumption)dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_P_UP);
  660. }
  661. /*
  662. GlobalOverManager overmanager;
  663. memset(&overmanager, 0, sizeof(overmanager));
  664. //memcpy(_globalPowerMangerTemp->global_over_manager, &overmanager, sizeof(overmanager));
  665. ret = g_switch_get_t_ac_threshold(&_globalDeviceManager->_globalRelaySampManger, _globalPowerMangerTemp->product_saddr, (_globalPowerMangerTemp->product_ch_addr-1), &overmanager);
  666. if (ret >= 0)
  667. {
  668. _globalPowerMangerTemp->global_over_manager->product_vol_upper_threshold = overmanager.product_vol_upper_threshold;
  669. _globalPowerMangerTemp->global_over_manager->product_vol_lower_threshold = overmanager.product_vol_lower_threshold;
  670. _globalPowerMangerTemp->global_over_manager->product_cur_upper_threshold = overmanager.product_cur_upper_threshold;
  671. _globalPowerMangerTemp->global_over_manager->product_pwr_upper_threshold = overmanager.product_pwr_upper_threshold;
  672. _globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_threshold = overmanager.product_pwrcon_upper_threshold;
  673. }
  674. */
  675. }
  676. break;
  677. }
  678. _chn+=1;
  679. //nanosleep(&reqSleep, NULL);
  680. //usleep(usleepTime);
  681. #endif
  682. //全局记录一份数据
  683. if (!isErrorBreak)
  684. {
  685. memcpy(&_globalPowerMangerTemp->_PowerInfo,&_globalPowerInfo._power_info,sizeof(PowerInfo));
  686. memcpy(&_globalPowerMangerTemp->_PowerWarninginfo,&_globalPowerWarningInfo,sizeof(PowerWarningInfo));
  687. }
  688. isErrorBreak=false;
  689. //判断是否存在定时需要触发
  690. time_t now;
  691. time(&now);
  692. t = localtime(&now);
  693. char buffer[80];
  694. int nNowt=t->tm_hour*3600+t->tm_min*60+t->tm_sec;
  695. int nDst=0,nHours=0,nMin=0,nSecond=0;
  696. strftime(buffer, sizeof(buffer), "%Y-%m-%d", t);
  697. list_for_each_entry(_powerDsManageTemp, &_globalPowerMangerTemp->list_DS, list)
  698. {
  699. if (strcmp(_powerDsManageTemp->ds_date, buffer) == 0&&_powerDsManageTemp->ds_is_triggered==0)
  700. {
  701. sscanf(_powerDsManageTemp->ds_time, "%d:%d:%d", &nHours, &nMin, &nSecond);
  702. nDst=nHours *3600+nMin*60+nSecond;
  703. int ntoSec=abs(nNowt-nDst);
  704. if (ntoSec < 5) // 小于3秒则触发
  705. {
  706. ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  707. _globalPowerMangerTemp->product_saddr,
  708. _globalPowerMangerTemp->product_ch_addr,
  709. _powerDsManageTemp->set_stats, false);
  710. if (ret < 0)
  711. {
  712. ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  713. _globalPowerMangerTemp->product_saddr,
  714. _globalPowerMangerTemp->product_ch_addr,
  715. _powerDsManageTemp->set_stats, false);
  716. }
  717. _powerDsManageTemp->ds_is_triggered = 1;
  718. dev_update_power_ds(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _powerDsManageTemp);
  719. }
  720. }
  721. }
  722. }
  723. //all
  724. if(__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_AC
  725. || __globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_DC)
  726. {
  727. __globalDeviceManage.single_mmap->total_current = _globalTotalPowerInfo._power_info.current*1000;
  728. __globalDeviceManage.single_mmap->total_power = _globalTotalPowerInfo._power_info.power*1000;
  729. __globalDeviceManage.single_mmap->total_valtage = _globalTotalPowerInfo._power_info.voltage*1000;
  730. __globalDeviceManage.single_mmap->total_consumer = _globalTotalPowerInfo._power_info.consumption * 1000;
  731. // printf("total_valtage = %d consumer = %d power = %d\n",__globalDeviceManage.single_mmap->total_valtage,
  732. // __globalDeviceManage.single_mmap->total_current
  733. // ,__globalDeviceManage.single_mmap->total_power);
  734. __globalDeviceManage.single_mmap->dev_chn = __globalDeviceManage._globalDevInfo.product_pwr_type << 8 | _chn;
  735. }
  736. //输入数据再处理(三项)
  737. //memset(_pTreeACPowerMangerTemp,0,sizeof(GlobalTreeACManager));
  738. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_Tree || __globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One)
  739. {
  740. _pTreeACPowerMangerTemp = NULL;
  741. list_for_each_entry(_pTreeACPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  742. {
  743. int nTreeACType = _pTreeACPowerMangerTemp->product_ph_type;
  744. if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
  745. {
  746. continue;
  747. }
  748. memset(&_pTreeACPowerMangerTemp->_PowerInfo, 0, sizeof(_globalPowerInfo._power_info));
  749. for (size_t i = 0; i < MAX_CHN_COUNT; i++)
  750. {
  751. if (_globalDeviceManager->_all_ctrl_board[i].product_saddr == 0 || _globalDeviceManager->_all_ctrl_board[i].product_type != TREE_AC_TYPE)
  752. {
  753. continue;
  754. }
  755. // 如果存在电压则置位如果都没有电压则保持0
  756. if (_globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].voltage != 0)
  757. {
  758. _pTreeACPowerMangerTemp->_PowerInfo.voltage = _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].voltage;
  759. }
  760. _pTreeACPowerMangerTemp->_PowerInfo.current += _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].current;
  761. _pTreeACPowerMangerTemp->_PowerInfo.power += _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].power;
  762. if (_globalTotalPowerInfo._power_info.freq != 0)
  763. {
  764. _pTreeACPowerMangerTemp->_PowerInfo.freq = _globalTotalPowerInfo._power_info.freq;
  765. }
  766. _pTreeACPowerMangerTemp->_PowerInfo.consumption += _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].consumption;
  767. _pTreeACPowerMangerTemp->_PowerInfo.factor = _globalDeviceManager->_all_ctrl_board[i]._globalPowerInManger._PowerInfo[nTreeACType].factor;
  768. }
  769. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption *1000;
  770. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_power = _pTreeACPowerMangerTemp->_PowerInfo.power *1000;
  771. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage *1000;
  772. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_current = _pTreeACPowerMangerTemp->_PowerInfo.current *1000;
  773. time_t now;
  774. time(&now);
  775. t = localtime(&now);
  776. char buffer[80];
  777. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  778. memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
  779. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  780. sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  781. strcat(_globalPowerInfo.samp_time, buffer);
  782. if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
  783. {
  784. _pTreeACPowerMangerTemp->product_log_time = now;
  785. /* code */
  786. // 插入数据库
  787. if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex, _globalPowerInfo.samp_time) != 0)
  788. {
  789. log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
  790. }
  791. }
  792. }
  793. __globalDeviceManage.triphasic_mmap->dev_chn = __globalDeviceManage._globalDevInfo.product_pwr_type << 8 | _chn;
  794. }
  795. if (__globalDeviceManage._globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  796. {
  797. _pTreeACPowerMangerTemp = NULL;
  798. list_for_each_entry(_pTreeACPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
  799. {
  800. int nTreeACType = _pTreeACPowerMangerTemp->product_ph_type;
  801. if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
  802. {
  803. continue;
  804. }
  805. if (_globalDeviceManager->triphasic_mmap)
  806. {
  807. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption * 1000;
  808. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_power = _pTreeACPowerMangerTemp->_PowerInfo.power * 1000;
  809. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage * 1000;
  810. _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_current = _pTreeACPowerMangerTemp->_PowerInfo.current * 1000;
  811. }
  812. time_t now;
  813. time(&now);
  814. t = localtime(&now);
  815. char buffer[80];
  816. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  817. memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
  818. strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
  819. sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  820. strcat(_globalPowerInfo.samp_time, buffer);
  821. if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
  822. {
  823. _pTreeACPowerMangerTemp->product_log_time = now;
  824. /* code */
  825. // 插入数据库
  826. if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex, _globalPowerInfo.samp_time) != 0)
  827. {
  828. log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
  829. }
  830. }
  831. }
  832. if (_globalDeviceManager->triphasic_mmap)
  833. {
  834. __globalDeviceManage.triphasic_mmap->dev_chn = __globalDeviceManage._globalDevInfo.product_pwr_type << 8 | _chn;
  835. }
  836. }
  837. //插入总电源信息
  838. gettimeofday(&tv, &tz);
  839. t = localtime(&tv.tv_sec);
  840. sprintf(_globalTotalPowerInfo.samp_time,"%04d-%02d-%02d %02d:%02d:%02d.%03ld",
  841. t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec,tv.tv_usec/1000);
  842. //更新总电源信息
  843. _globalDeviceManager->_globalPowerManger._PowerInfo = _globalTotalPowerInfo._power_info;
  844. //插入数据库
  845. if (SaveDBFlag)
  846. {
  847. if (dev_insert_power_info(_globalDeviceManager->db, &_globalTotalPowerInfo, &nSaveIndex) != 0)
  848. {
  849. log_d("ch%d insert data error.\n", _globalTotalPowerInfo.product_ch_id);
  850. }
  851. }
  852. pthread_mutex_unlock(&__globalDeviceManage._power_update);
  853. //判断阈值状态
  854. //动作
  855. //1ms
  856. //sleep(1);
  857. ///usleep(500*1000);
  858. //延时
  859. //usleep(samp_time*1000);
  860. }
  861. free_hash_table(_globalDeviceManager->_global_alarmLanguage);
  862. log_e("Error!!!!!!!!!!!!!!Thread End");
  863. pthread_exit(NULL);
  864. }
  865. /// @brief 传感器硬件接口初始化
  866. /// @param _globalDeviceManager
  867. /// @return
  868. int dev_sensor_init(GlobalDeviceManager *_globalDeviceManager)
  869. {
  870. int ret = 0;
  871. ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
  872. INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
  873. INTERL_SENSOR_MODBUS_BAUD, // _globalSensorMangerTemp->sensor_baud,
  874. MASTER_MODE,
  875. 0,
  876. "sensor",
  877. 1);
  878. if (ret != 0)
  879. {
  880. log_e("sensor modbus init error.\n");
  881. }
  882. else log_i("sensor modbus init ok.\n");
  883. return 0;
  884. }
  885. /**
  886. * @brief 报警控制通道
  887. *
  888. * 这是一个用于报警控制通道的函数。
  889. */
  890. void AlarmCtrlChn(int nChID, int nCtrl)
  891. {
  892. char buff[256];
  893. int ret = 0;
  894. GlobalPowerManger *_globalPowerMangerTemp = NULL;
  895. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  896. {
  897. if (_globalPowerMangerTemp == NULL)
  898. break;
  899. if (nChID == _globalPowerMangerTemp->product_ch_id)
  900. {
  901. log_d("switch ctrl:%d", _globalPowerMangerTemp->product_ch_id);
  902. ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  903. _globalPowerMangerTemp->product_saddr,
  904. _globalPowerMangerTemp->product_ch_addr,
  905. nCtrl, false);
  906. if (ret < 0)
  907. {
  908. ret = g_switch_set_all_chn_ctrl(&__globalDeviceManage._globalRelaySampManger, _globalPowerMangerTemp,
  909. _globalPowerMangerTemp->product_saddr,
  910. _globalPowerMangerTemp->product_ch_addr,
  911. nCtrl, false);
  912. }
  913. sprintf(buff, "$开启$|$通道$|%d", _globalPowerMangerTemp->product_ch_id);
  914. dev_insert_alarm_ctrl(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, 2, buff);
  915. break;
  916. }
  917. }
  918. }
  919. void AlarmCtrlAll(int nCtrl)
  920. {
  921. //总关
  922. int nSendAddr=0;
  923. char buff[256];
  924. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  925. list_for_each_entry(_globalPowerMangerTemp, &__globalDeviceManage._globalPowerManger.list, list)
  926. {
  927. if(_globalPowerMangerTemp==NULL)
  928. break;
  929. if(_globalPowerMangerTemp->product_saddr==nSendAddr)continue;
  930. nSendAddr=_globalPowerMangerTemp->product_saddr;
  931. log_i("Close All address Start");
  932. int rec=g_switch_set_all_ctrl(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,nCtrl);
  933. if(rec<0)log_i("Close All address:%d rec:%d:%s",nSendAddr,rec,modbus_strerror(errno));
  934. }
  935. sprintf(buff,"$关闭$|$所有$|$通道$");
  936. dev_insert_alarm_ctrl(__globalDeviceManage.db,_globalPowerMangerTemp->product_id,2,buff);
  937. }
  938. /**
  939. * @brief 传感器报警函数
  940. *
  941. * 根据给定的报警类型和全局传感器管理器,执行相应的传感器报警操作。
  942. *
  943. * @param _globalSensorMangerTemp 全局传感器管理器指针
  944. * @param nAlarmType 报警类型(如SENSOR_VAL1_UPPER、SENSOR_VAL1_LOWER等)
  945. */
  946. void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType)
  947. {
  948. bool *penable = NULL; //使能
  949. bool *pSave = NULL; //是否已报警
  950. float *pValthreshold = NULL;//阈值
  951. float *pValData = NULL; //当前值
  952. char *nCtrlType = NULL; //报警方式
  953. char *nCtrlValue= NULL; //控制通道
  954. if (!_globalSensorMangerTemp|| !_globalSensorMangerTemp->over_manager)
  955. {
  956. return;
  957. }
  958. switch (nAlarmType)
  959. {
  960. case SENSOR_VAL1_UPPER:
  961. penable = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_enabled;
  962. pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold;
  963. pSave = &_globalSensorMangerTemp->warning_status.sensor_val1_upper;
  964. pValData = &_globalSensorMangerTemp->Cur_sensor_info.val1;
  965. nCtrlType = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold_ctrl;
  966. nCtrlValue = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold_ctrl_para;
  967. break;
  968. case SENSOR_VAL1_LOWER:
  969. penable = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_enabled;
  970. pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold;
  971. pSave = &_globalSensorMangerTemp->warning_status.sensor_val1_lower;
  972. pValData = &_globalSensorMangerTemp->Cur_sensor_info.val1;
  973. nCtrlType = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold_ctrl;
  974. nCtrlValue = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold_ctrl_para;
  975. break;
  976. case SENSOR_VAL2_UPPER:
  977. penable = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_enabled;
  978. pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_threshold;
  979. pSave = &_globalSensorMangerTemp->warning_status.sensor_val2_upper;
  980. pValData = &_globalSensorMangerTemp->Cur_sensor_info.val2;
  981. nCtrlType = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_threshold_ctrl;
  982. nCtrlValue = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_threshold_ctrl_para;
  983. break;
  984. case SENSOR_VAL2_LOWER:
  985. penable = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_enabled;
  986. pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_threshold;
  987. pSave = &_globalSensorMangerTemp->warning_status.sensor_val2_lower;
  988. pValData = &_globalSensorMangerTemp->Cur_sensor_info.val2;
  989. nCtrlType = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_threshold_ctrl;
  990. nCtrlValue = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_threshold_ctrl_para;
  991. break;
  992. default:
  993. break;
  994. }
  995. if (!(pValthreshold && penable && pValData && pSave))
  996. {
  997. return;
  998. }
  999. if (nAlarmType == SENSOR_VAL1_UPPER || nAlarmType == SENSOR_VAL2_UPPER)//上限
  1000. {
  1001. if (*penable == 1 && *pValthreshold < *pValData)
  1002. {
  1003. if (!*pSave)
  1004. {
  1005. *pSave = true;
  1006. dev_sensor_Alarm_send_message(&__globalDeviceManage, _globalSensorMangerTemp, nAlarmType);
  1007. if (*nCtrlType == ALARM_CTRL_CLOSE_CH)
  1008. {
  1009. AlarmCtrlChn(*nCtrlValue,0);
  1010. }else if (*nCtrlType == ALARM_CTRL_CLOSE_CH)
  1011. {
  1012. AlarmCtrlAll(0);
  1013. }
  1014. }
  1015. }
  1016. else
  1017. {
  1018. *pSave = false;
  1019. }
  1020. }
  1021. else //下限
  1022. {
  1023. if (*penable == 1 && *pValthreshold > *pValData)
  1024. {
  1025. if (!*pSave)
  1026. {
  1027. *pSave = true;
  1028. dev_sensor_Alarm_send_message(&__globalDeviceManage, _globalSensorMangerTemp, nAlarmType);
  1029. if (*nCtrlType == ALARM_CTRL_CLOSE_CH)
  1030. {
  1031. AlarmCtrlChn(*nCtrlValue, 0);
  1032. }else if (*nCtrlType == ALARM_CTRL_CLOSE_CH)
  1033. {
  1034. AlarmCtrlAll(0);
  1035. }
  1036. }
  1037. }
  1038. else
  1039. {
  1040. *pSave = false;
  1041. }
  1042. }
  1043. }
  1044. void* breaker_thread(void *arg)
  1045. {
  1046. int r;
  1047. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  1048. GlobalBreakerManager *temp = NULL;
  1049. pthread_mutex_init(&_globalDeviceManager->_breaker_mutex,NULL);
  1050. uint16_t value = 0;
  1051. breaker_scanner_t* breaker_scann = get_breaker_scanner();
  1052. while (_globalDeviceManager->dev_samp_flag)
  1053. {
  1054. pthread_mutex_lock(&__globalDeviceManage._breaker_mutex);
  1055. list_for_each_entry(temp, &_globalDeviceManager->g_new_global_breaker.list,list)
  1056. {
  1057. // if(temp->breaker_gather_addr != 0)
  1058. // {
  1059. // value = 0;
  1060. // r = breaker_485_get_chn_status((void*)&_globalDeviceManager->_globalRelaySampManger,
  1061. // temp->breaker_gather_addr,BREADER_485_ADDR_CHN_REG+temp->breaker_chn,&value);
  1062. // if(r==0) {
  1063. // temp->breaker_status = value;
  1064. // }
  1065. // // printf("temp->breaker_gather_addr = %d temp->breaker_chn=%d getchn value = %d\n",temp->breaker_gather_addr,temp->breaker_chn,value);
  1066. // }else
  1067. // {
  1068. // //DI
  1069. // }
  1070. if(temp->breaker_gather_addr)
  1071. {
  1072. if((temp->breaker_gather_addr-BREADER_485_ADDR < BREAKER_BOARD_MAX) &&
  1073. ((breaker_scann->breaker_flag[temp->breaker_gather_addr-BREADER_485_ADDR]) == 1))
  1074. {
  1075. int chn = temp->breaker_chn;
  1076. temp->breaker_status = breaker_scann->board[temp->breaker_gather_addr-BREADER_485_ADDR].ch_status[chn-1];
  1077. }else
  1078. {
  1079. temp->breaker_status = 0;
  1080. }
  1081. }
  1082. }
  1083. pthread_mutex_unlock(&__globalDeviceManage._breaker_mutex);
  1084. sleep(1);
  1085. }
  1086. pthread_exit(NULL);
  1087. }
  1088. /// @brief 传感器采集线程
  1089. /// @param arg
  1090. /// @return
  1091. void* sensor_thread(void* arg)
  1092. {
  1093. #if 1
  1094. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  1095. unsigned int samp_time = _globalDeviceManager->_globalDevInfo.product_samp_time;
  1096. GlobalSensorManger *_globalSensorMangerTemp;
  1097. int ret = 0;
  1098. GlobalSensorInfo _globalSensorInfo;
  1099. struct tm *t;
  1100. struct timeval tv;
  1101. struct timezone tz;
  1102. // 硬件初始化
  1103. // 初始化modbus
  1104. // 初始化gpio
  1105. dev_sensor_init(_globalDeviceManager);
  1106. float temperature = 0.0;
  1107. float humidity = 0.0;
  1108. int nSaveIndex = 1;
  1109. char strTable[] = "Table_SensorInfo";
  1110. char strTemp[64] = {0};
  1111. dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable); // 查询日志最大点
  1112. // printf("asdasdasdasdasd %d\n",nSaveIndex);
  1113. int nMaxIndex = 2000000000;
  1114. int nDeleteNumber = 1000 / 120000 * 3600 * 24 * 30 * 10; // 1/60s;
  1115. // printf("senseor !!!!!\n");
  1116. //初始化GPIO
  1117. /*
  1118. log_d("GPIO 开始初始化");
  1119. list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  1120. {
  1121. if (_globalSensorMangerTemp->sensor_interface_type == 2) // 干节点传感器
  1122. {
  1123. memset(strTemp, 0, sizeof(strTemp));
  1124. sprintf(strTemp, "echo %d > /sys/class/gpio/export",_globalSensorMangerTemp->sensor_addr+GPIO_PD11);
  1125. system(strTemp);
  1126. memset(strTemp, 0, sizeof(strTemp));
  1127. sprintf(strTemp, "echo in > /sys/class/gpio/gpio%d/direction",_globalSensorMangerTemp->sensor_addr+GPIO_PD11);
  1128. system(strTemp);
  1129. }
  1130. }
  1131. log_d("GPIO 初始化成功");
  1132. */
  1133. // 采集线程
  1134. while (_globalDeviceManager->dev_samp_flag)
  1135. {
  1136. if (nSaveIndex > nMaxIndex)
  1137. {
  1138. dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strTable);
  1139. }
  1140. pthread_mutex_lock(&__globalDeviceManage._sensor_update);
  1141. list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
  1142. {
  1143. switch (_globalSensorMangerTemp->sensor_type)
  1144. {
  1145. case SENSOR_TYPE_TEMPERATURE: // 温湿度
  1146. {
  1147. // printf("get \n");
  1148. float temperature = 0.0;
  1149. float humidity = 0.0;
  1150. #ifdef CUST_ANDERSON
  1151. ret = _g_sensor_get_temperature_value_ANDERSON((void *)&_globalDeviceManager->sensor_modbus_manager,
  1152. _globalSensorMangerTemp->sensor_addr,
  1153. &temperature,
  1154. &humidity);
  1155. #else
  1156. ret = _g_sensor_get_temperature_value((void *)&_globalDeviceManager->sensor_modbus_manager,
  1157. _globalSensorMangerTemp->sensor_addr,
  1158. &temperature,
  1159. &humidity);
  1160. #endif
  1161. if (ret == -1)
  1162. {
  1163. _globalSensorMangerTemp->sensor_status = 1;
  1164. }
  1165. else
  1166. {
  1167. _globalSensorMangerTemp->sensor_status = 0;
  1168. }
  1169. // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
  1170. // printf("get temperature=%f humidity=%f\n",temperature,humidity);
  1171. gettimeofday(&tv, &tz);
  1172. t = localtime(&tv.tv_sec);
  1173. sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
  1174. t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
  1175. _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
  1176. _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
  1177. _globalSensorInfo.val1 = temperature;
  1178. _globalSensorInfo.val2 = humidity;
  1179. if(_globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  1180. _globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_DC)
  1181. {
  1182. _globalDeviceManager->single_mmap->total_temp.temperature = _globalSensorInfo.val1 *100;
  1183. _globalDeviceManager->single_mmap->total_temp.humidity = _globalSensorInfo.val2 *100;
  1184. }else
  1185. {
  1186. if (_globalDeviceManager->triphasic_mmap)
  1187. {
  1188. _globalDeviceManager->triphasic_mmap->temperature = temperature * 100;
  1189. _globalDeviceManager->triphasic_mmap->humidity = humidity * 100;
  1190. }
  1191. }
  1192. _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
  1193. _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  1194. _globalDeviceManager->g_modebus_read.temprature=temperature;
  1195. _globalDeviceManager->g_modebus_read.humidity=humidity;
  1196. }
  1197. break;
  1198. case SENSOR_TYPE_SMOKE: // 烟雾
  1199. case SENSOR_TYPE_WATER: // 水浸
  1200. case SENSOR_TYPE_DOOR: // 门禁 IO信号
  1201. {
  1202. if (_globalSensorMangerTemp->sensor_interface_type==2)//干节点传感器
  1203. {
  1204. int nStatus=0;
  1205. g_switch_get_gpio_status(_globalSensorMangerTemp->sensor_addr+GPIO_PD11,&nStatus);
  1206. _globalSensorMangerTemp->Cur_sensor_info.val1=nStatus;
  1207. }
  1208. }
  1209. break;
  1210. case SENSOR_TYPE_GAS: // 气体
  1211. {
  1212. }
  1213. break;
  1214. case SENSOR_TYPE_AIR_PRESS: // 气流
  1215. {
  1216. }
  1217. break;
  1218. case SENSOR_TYPE_DoubleT://双头传感器
  1219. {
  1220. float temperature = 0.0;
  1221. float temperature2 = 0.0;
  1222. ret = _g_sensor_get_D_temperature_value_ANDERSON((void *)&_globalDeviceManager->sensor_modbus_manager,
  1223. _globalSensorMangerTemp->sensor_addr,
  1224. &temperature,
  1225. &temperature2);
  1226. if (ret == -1)
  1227. {
  1228. //log_w("Relay modbus Error:%s\n", modbus_strerror(errno));
  1229. _globalSensorMangerTemp->sensor_status = 1;
  1230. }
  1231. else
  1232. {
  1233. _globalSensorMangerTemp->sensor_status = 0;
  1234. }
  1235. // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
  1236. // printf("get temperature=%f humidity=%f\n",temperature,humidity);
  1237. gettimeofday(&tv, &tz);
  1238. t = localtime(&tv.tv_sec);
  1239. sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
  1240. t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
  1241. _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
  1242. _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
  1243. _globalSensorInfo.val1 = temperature;
  1244. _globalSensorInfo.val2 = temperature2;
  1245. _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
  1246. _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
  1247. _globalDeviceManager->g_modebus_read.temprature=temperature;
  1248. _globalDeviceManager->g_modebus_read.temprature2=temperature2;
  1249. }
  1250. break;
  1251. }
  1252. // 通用功能
  1253. // 写入数据库
  1254. gettimeofday(&tv, NULL);
  1255. time_t now;
  1256. time(&now);
  1257. t = localtime(&now);
  1258. char buffer[80];
  1259. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
  1260. memset(_globalSensorMangerTemp->Cur_sensor_info.samp_time, 0, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time));
  1261. strftime(_globalSensorMangerTemp->Cur_sensor_info.samp_time, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time), "%Y-%m-%d %H:%M:%S", t);
  1262. sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
  1263. strcat(_globalSensorMangerTemp->Cur_sensor_info.samp_time, buffer);
  1264. if (difftime(now, _globalSensorMangerTemp->Cur_sensor_info.product_log_time) > (30000 / 1000))
  1265. {
  1266. _globalSensorMangerTemp->Cur_sensor_info.product_log_time = now;
  1267. // 插入数据库
  1268. ret = dev_insert_sensor_info(_globalDeviceManager->db, &_globalSensorMangerTemp->Cur_sensor_info, &nSaveIndex);
  1269. if (ret != 0)
  1270. {
  1271. log_e("sensor_temp_write database error.");
  1272. }
  1273. }
  1274. if (_globalSensorMangerTemp->sensor_status == 0)
  1275. {
  1276. sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_UPPER);
  1277. sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_LOWER);
  1278. sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_UPPER);
  1279. sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_LOWER);
  1280. }
  1281. }
  1282. pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
  1283. sleep(1);
  1284. }
  1285. #endif
  1286. pthread_exit(NULL);
  1287. }
  1288. void* shm_thread(void *arg)
  1289. {
  1290. int fd = 0;
  1291. GlobalPowerManger* _globalPowerMangerTemp = NULL ;
  1292. GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
  1293. smartPDU_shm_data pShmData;
  1294. memset(&pShmData, 0, sizeof(pShmData));
  1295. while (_globalDeviceManager->dev_samp_flag)
  1296. {
  1297. fd = shm_open("/smartPDU_shm", O_RDWR, 0666);
  1298. if (fd < 0)
  1299. {
  1300. printf("error open shm object\n");
  1301. sleep(5); // 延时5秒后再次创建
  1302. continue;
  1303. }
  1304. _globalDeviceManager->g_shm_Data = (smartPDU_shm_data *)mmap(NULL, sizeof(smartPDU_shm_data), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  1305. if (!_globalDeviceManager->g_shm_Data)
  1306. {
  1307. printf("mmap failed!\n");
  1308. close(fd);
  1309. sleep(5); // 延时5秒后再次创建
  1310. continue;
  1311. }
  1312. while (_globalDeviceManager->dev_samp_flag)
  1313. {
  1314. if (_globalDeviceManager->g_shm_Data)
  1315. { // 初始化成功
  1316. memcpy(&pShmData, _globalDeviceManager->g_shm_Data, sizeof(smartPDU_shm_data));
  1317. if (_globalDeviceManager->g_shm_Data->bPDUSet > 0) // 已更新
  1318. {
  1319. int nselect=_globalDeviceManager->g_shm_Data->nSelectPowerCH;
  1320. int nIndex=0;
  1321. if (nselect==0)
  1322. {
  1323. //_globalDeviceManager->_globalPowerManger;
  1324. _globalDeviceManager->g_shm_Data->fV = _globalDeviceManager->_globalPowerManger._PowerInfo.voltage;
  1325. _globalDeviceManager->g_shm_Data->fA = _globalDeviceManager->_globalPowerManger._PowerInfo.current;
  1326. _globalDeviceManager->g_shm_Data->fW = _globalDeviceManager->_globalPowerManger._PowerInfo.power;
  1327. _globalDeviceManager->g_shm_Data->fF = _globalDeviceManager->_globalPowerManger._PowerInfo.factor;
  1328. _globalDeviceManager->g_shm_Data->fS = _globalDeviceManager->_globalPowerManger._PowerInfo.consumption;
  1329. _globalDeviceManager->g_shm_Data->nStatus = _globalDeviceManager->_globalPowerManger._PowerInfo.status;
  1330. _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature;
  1331. _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity;
  1332. }
  1333. else
  1334. {
  1335. list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
  1336. {
  1337. nIndex += 1;
  1338. if (nselect <= nIndex)
  1339. break;
  1340. }
  1341. // GlobalPowerInfo _globalPowerInfo;
  1342. // memset(&_globalPowerInfo._power_info, 0, sizeof(PowerInfo));
  1343. // memcpy(&_globalPowerInfo._power_info,
  1344. // &_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0],
  1345. // sizeof(PowerInfo));
  1346. _globalDeviceManager->g_shm_Data->fV = _globalPowerMangerTemp->_PowerInfo.voltage;
  1347. _globalDeviceManager->g_shm_Data->fA = _globalPowerMangerTemp->_PowerInfo.current;
  1348. _globalDeviceManager->g_shm_Data->fW = _globalPowerMangerTemp->_PowerInfo.power;
  1349. _globalDeviceManager->g_shm_Data->fF = _globalPowerMangerTemp->_PowerInfo.factor;
  1350. _globalDeviceManager->g_shm_Data->fS = _globalPowerMangerTemp->_PowerInfo.consumption;
  1351. _globalDeviceManager->g_shm_Data->nStatus = _globalPowerMangerTemp->_PowerInfo.status;
  1352. _globalDeviceManager->g_shm_Data->fT = _globalDeviceManager->g_modebus_read.temprature;
  1353. _globalDeviceManager->g_shm_Data->fH = _globalDeviceManager->g_modebus_read.humidity;
  1354. }
  1355. }
  1356. else if (_globalDeviceManager->g_shm_Data->bPDUSet == 0)
  1357. { // 等于于0则更新pdu数据
  1358. int nMaxCh=0;
  1359. list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
  1360. {
  1361. nMaxCh+=1;
  1362. }
  1363. _globalDeviceManager->g_shm_Data->nMaxCh = nMaxCh;
  1364. _globalDeviceManager->g_shm_Data->bPDUSet = 1;
  1365. }
  1366. else
  1367. { // 小于0 则主程序已析构退出重新等待加载
  1368. munmap(_globalDeviceManager->g_shm_Data, sizeof(smartPDU_shm_data));
  1369. _globalDeviceManager->g_shm_Data = NULL;
  1370. close(fd);
  1371. break;
  1372. }
  1373. }
  1374. usleep(200000);
  1375. }
  1376. }
  1377. if (_globalDeviceManager->g_shm_Data)
  1378. {
  1379. munmap(_globalDeviceManager->g_shm_Data, sizeof(smartPDU_shm_data));
  1380. close(fd);
  1381. }
  1382. pthread_exit(NULL);
  1383. }
  1384. void* ntp_thread(void *arg)
  1385. {
  1386. time_t start_t, end_t;
  1387. thread_handle_t *h=(thread_handle_t*)arg;
  1388. start_t = time(NULL);
  1389. while(h->quit==0)
  1390. {
  1391. if (end_t - start_t >= 1 && _globalNTPManager.mode == true)
  1392. {
  1393. globalNTPclient = createNTPClient(_globalNTPManager.ntpaddress, _globalNTPManager.port);
  1394. if (globalNTPclient ==NULL)
  1395. {
  1396. log_e("Failed to Connect the NTP server.");
  1397. sleep(600);
  1398. continue;
  1399. }
  1400. time_t current_time;
  1401. if (getCurrentTimeFromNTP(globalNTPclient, &current_time) < 0)
  1402. {
  1403. log_e("Failed to get time from NTP server.");
  1404. sleep(600);
  1405. continue;
  1406. }
  1407. time_t t = time(NULL);
  1408. struct tm *ptm = localtime(&t);
  1409. struct tm *pCurrenttm = gmtime(&current_time);
  1410. if (abs(t - current_time) >= 5)
  1411. set_local_timeandzone(pCurrenttm, _globalNTPManager.tzone);
  1412. end_t = start_t;
  1413. }
  1414. end_t = time(NULL);
  1415. sleep(600); // 十分钟同步一次
  1416. }
  1417. destroyNTPClient(globalNTPclient);
  1418. pthread_exit(NULL);
  1419. }
  1420. void* snmp_thread(void *arg)
  1421. {
  1422. //int ret = 0 ;
  1423. thread_handle_t *h=(thread_handle_t*)arg;
  1424. /* we are a subagent */
  1425. char path[PATH_MAX];
  1426. /* we are a subagent */
  1427. netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1);
  1428. /* initialize the agent library */
  1429. sys_get_path(path, SNMP_MIB_NAME);
  1430. init_agent(path);
  1431. /* initialize your mib code here */
  1432. init_pduMIB_form();
  1433. init_pduMIB_scalar();
  1434. /* pduMIB will be used to read pduMIB.conf files. */
  1435. init_snmp(path);
  1436. int reconfig=0;
  1437. while(h->quit==0)
  1438. {
  1439. if (reconfig) {
  1440. free_config();
  1441. read_configs();
  1442. reconfig = 0;
  1443. }
  1444. agent_check_and_process(1);/* block every 1 second */
  1445. }
  1446. /* at shutdown time */
  1447. snmp_shutdown(path);
  1448. /* deinitialize your mib code here */
  1449. /* shutdown the agent library */
  1450. shutdown_agent();
  1451. pthread_exit(NULL);
  1452. }
  1453. /// @brief 全局结构体初始化
  1454. /// @param _globalDeviceManager
  1455. /// @return
  1456. int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
  1457. {
  1458. int ret = 0 ;
  1459. int type = 0 ;
  1460. int chn = 0 ;
  1461. char path[PATH_MAX];
  1462. int io_thread_flag = 0 ;
  1463. int sensor_thread_flag = 0 ;
  1464. int nTac_chn=0;
  1465. //paras_load(&_globalDeviceManager->_globalDevInfo);
  1466. //初始化用户登录列表
  1467. INIT_LIST_HEAD(&_GlobalUserLoginInfo.list);
  1468. //使用的通道
  1469. _globalDeviceManager->useSlaveCount = 0 ;
  1470. //链接数据库获取配置信息
  1471. sys_get_path(path, DATABASE_NAME);
  1472. log_i("database: %s\n", path);
  1473. ret = sqlite_init(&_globalDeviceManager->db,&_globalDeviceManager->dbThreadlock, path);
  1474. if(ret<0)
  1475. {
  1476. log_e("database %s open error.\n", path);
  1477. return -1 ;
  1478. }
  1479. log_i("database %s open ok.\n", path);
  1480. //查询设备总体参数
  1481. if(dev_get_device_info(_globalDeviceManager->db,&_globalDeviceManager->_globalDevInfo)!=0)
  1482. {
  1483. log_e("get device info error.\n");
  1484. return -1 ;
  1485. }
  1486. log_i("get device info ok.\n");
  1487. if(_globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_AC ||
  1488. _globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_DC) // single AC
  1489. {
  1490. _globalDeviceManager->single_mmap =(cascade_single_mmap_t*)malloc(sizeof(cascade_single_mmap_t));
  1491. if(_globalDeviceManager->single_mmap==NULL)
  1492. {
  1493. log_e("single_mmap malloc error.!");
  1494. return -1 ;
  1495. }
  1496. memset(_globalDeviceManager->single_mmap, 0, sizeof(cascade_single_mmap_t));
  1497. }else // tree
  1498. {
  1499. _globalDeviceManager->triphasic_mmap =(cascade_triphasic_mmap_t*)malloc(sizeof(cascade_triphasic_mmap_t));
  1500. if(_globalDeviceManager->triphasic_mmap== NULL)
  1501. {
  1502. log_e("triphasic_mmap malloc error.!");
  1503. return -1 ;
  1504. }
  1505. memset(_globalDeviceManager->triphasic_mmap, 0, sizeof(cascade_triphasic_mmap_t));
  1506. }
  1507. //打印参数
  1508. //printf_global_device_info(&_globalDeviceManager->_globalDevInfo);
  1509. //电源管理表初始化
  1510. memset(&_globalDeviceManager->_globalPowerManger,0,sizeof(GlobalPowerManger));
  1511. _globalDeviceManager->_globalPowerManger.global_over_manager = (GlobalOverManager*)malloc(sizeof(GlobalOverManager));
  1512. if(_globalDeviceManager->_globalPowerManger.global_over_manager==NULL)
  1513. {
  1514. log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1515. return -1 ;
  1516. }
  1517. memset(_globalDeviceManager->_globalPowerManger.global_over_manager, 0, sizeof(GlobalOverManager));
  1518. //查询是否存在全部通道信息
  1519. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  1520. _globalDeviceManager->_globalDevInfo.product_id,0,
  1521. 0, //1*8+j
  1522. &_globalDeviceManager->_globalPowerManger);
  1523. //未查询到信息 则插入
  1524. if(ret==-1)
  1525. {
  1526. _globalDeviceManager->_globalPowerManger.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1527. _globalDeviceManager->_globalPowerManger.product_saddr = 0 ;
  1528. _globalDeviceManager->_globalPowerManger.product_ch_id = 0;
  1529. _globalDeviceManager->_globalPowerManger.product_ch_addr = 0;
  1530. sprintf( _globalDeviceManager->_globalPowerManger.product_ch_name,"ALL_CH");//,_globalDeviceManager->_globalPowerManger.product_ch_id);
  1531. _globalDeviceManager->_globalPowerManger.product_ch_type = type;
  1532. _globalDeviceManager->_globalPowerManger.product_ch_status = 0;
  1533. _globalDeviceManager->_globalPowerManger.product_ch_NF_status = 0;
  1534. _globalDeviceManager->_globalPowerManger.product_ch_start_delay = 1000;
  1535. _globalDeviceManager->_globalPowerManger.product_ch_stop_delay = 1000;
  1536. _globalDeviceManager->_globalPowerManger.global_over_manager->product_cur_over_upper_threshold_ctrl =ALARM_CTRL_ALARM_ONLY;//默认超限只报警
  1537. _globalDeviceManager->_globalPowerManger.global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1538. _globalDeviceManager->_globalPowerManger.global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1539. _globalDeviceManager->_globalPowerManger.global_over_manager->product_vol_over_lower_threshold_ctrl= ALARM_CTRL_ALARM_ONLY;
  1540. _globalDeviceManager->_globalPowerManger.global_over_manager->product_vol_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1541. if(dev_insert_power_manage_info(_globalDeviceManager->db,
  1542. _globalDeviceManager->_globalDevInfo.product_id,
  1543. 0,
  1544. &_globalDeviceManager->_globalPowerManger)!=0)
  1545. {
  1546. log_e("all chn data inserted error.\n");
  1547. return 0;
  1548. }
  1549. else
  1550. {
  1551. log_i("all chn data inserted ok.\n");
  1552. }
  1553. }
  1554. INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list_Tree_AC);
  1555. if (_globalDeviceManager->_globalDevInfo.product_pwr_type==SmartPDU_Tree_AC_Tree
  1556. ||_globalDeviceManager->_globalDevInfo.product_pwr_type==SmartPDU_Tree_AC_One
  1557. ||_globalDeviceManager->_globalDevInfo.product_pwr_type==SmartPDU_Tree_AC_One_B
  1558. )
  1559. {
  1560. __globalDeviceManage.nTreeACLshow=0;
  1561. _globalDeviceManager->useSlaveCount++;
  1562. _globalDeviceManager->_all_ctrl_board[0].product_saddr = 0;
  1563. _globalDeviceManager->_all_ctrl_board[0].product_number = -1;
  1564. _globalDeviceManager->_all_ctrl_board[0].product_type = -1;
  1565. // 填充三相表
  1566. for (size_t TreeACindex = 0; TreeACindex < 3; TreeACindex++)
  1567. {
  1568. GlobalTreeACManager *_globalTACManager = NULL;
  1569. _globalTACManager = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  1570. if (_globalTACManager == NULL)
  1571. {
  1572. log_e("_globalTACManager malloc error.\n");
  1573. return -1;
  1574. }
  1575. memset(_globalTACManager, 0, sizeof(GlobalTreeACManager));
  1576. _globalTACManager->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1577. if (_globalTACManager->global_over_manager == NULL)
  1578. {
  1579. log_e("_globalTACManager->global_over_manager malloc error.\n");
  1580. return -1;
  1581. }
  1582. memset(_globalTACManager->global_over_manager, 0, sizeof(GlobalOverManager));
  1583. ret = dev_get_t_ac_power_manage_info(_globalDeviceManager->db,
  1584. _globalDeviceManager->_globalDevInfo.product_id, 0,TreeACindex + 1,
  1585. TreeACindex, // 1*8+j
  1586. _globalTACManager);
  1587. _globalTACManager->product_ch_addr = TreeACindex + 1;
  1588. // 未查询到信息 则插入
  1589. if (ret == -1)
  1590. {
  1591. _globalTACManager->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1592. _globalTACManager->product_saddr = 0;
  1593. _globalTACManager->product_ch_id = chn;
  1594. _globalTACManager->product_ch_addr = TreeACindex + 1;
  1595. _globalTACManager->product_ph_id = nTac_chn;
  1596. _globalTACManager->product_ph_type = (TreeACindex + 3) % 3;
  1597. if (dev_insert_t_ac_power_manage_info(_globalDeviceManager->db,
  1598. _globalDeviceManager->_globalDevInfo.product_id,
  1599. _globalTACManager->product_ch_id,
  1600. _globalTACManager) != 0)
  1601. {
  1602. log_e("address %d ph_chn %d data inserted error.\n", 0, nTac_chn);
  1603. return 0;
  1604. }
  1605. }
  1606. list_add_tail(&_globalTACManager->list_Tree_AC, &_globalDeviceManager->_globalPowerManger.list_Tree_AC);
  1607. nTac_chn += 1;
  1608. }
  1609. }
  1610. log_i("get all chn data ok.\n");
  1611. INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list);
  1612. // 初始化modbus,搜寻子设备
  1613. ret = g_modbus_init(&_globalDeviceManager->_globalRelaySampManger,
  1614. INTERL_MODBUS_PORT,
  1615. INTERL_MODBUS_BAUD,
  1616. MASTER_MODE,
  1617. 0,
  1618. "relay",1);
  1619. if(ret!=0)
  1620. {
  1621. switch (ret)
  1622. {
  1623. case -2:
  1624. log_w("Relay modbus: modbus_rtu_set_serial_mode :MODBUS_RTU_RS485(1)");
  1625. break;
  1626. case -3:
  1627. log_w("Relay modbus: modbus_rtu_set_rts: MODBUS_RTU_RTS_NONE(0)");
  1628. break;
  1629. case -4:
  1630. log_w("Relay modbus: pthread_mutex_init");
  1631. break;
  1632. case -5:
  1633. log_w("Relay modbus: modbus_connect");
  1634. break;
  1635. default:
  1636. break;
  1637. }
  1638. log_w("Relay modbus Error:%s\n",modbus_strerror(errno));
  1639. return -1 ;
  1640. }
  1641. log_i("Relay modbus init ok.\n");
  1642. //搜索子地址
  1643. chn = 1 ;
  1644. nTac_chn=3;
  1645. int nGroups=CHANNEL_DELAY_SEC;
  1646. char strLog[200]={"MODBUS"};
  1647. dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],strLog);
  1648. log_d("GCPDU init begin!");
  1649. memset(&_globalDeviceManager->_all_ctrl_board, 0, sizeof(_globalDeviceManager->_all_ctrl_board));
  1650. for (size_t i = 1; i < MAX_CHN_COUNT; i++)
  1651. {
  1652. type = 0 ;
  1653. int nMaxChn=0;
  1654. ret = g_switch_get_type(&_globalDeviceManager->_globalRelaySampManger,
  1655. i,
  1656. &type,
  1657. &nMaxChn,
  1658. _globalDeviceManager->_globalDevInfo.product_pwr_type);
  1659. log_d("ret:%d saddr:%d type:%d ch_num:%d.\n",ret,i,type,nMaxChn);
  1660. //int i =1 ;
  1661. //type = AC_SINGLE_S_TYPE ;
  1662. //chn = i ;
  1663. if(ret==0)
  1664. {
  1665. //有效地址记录
  1666. _globalDeviceManager->useSlaveCount ++ ;
  1667. _globalDeviceManager->_all_ctrl_board[i].product_saddr=i;
  1668. _globalDeviceManager->_all_ctrl_board[i].product_number=nMaxChn;
  1669. _globalDeviceManager->_all_ctrl_board[i].product_type=type;
  1670. switch (type)
  1671. {
  1672. case AC_SINGLE_S_TYPE://AC单相小电流 8路继电器
  1673. case AC_SINGLE_B_TYPE:
  1674. {
  1675. log_i("Address=%d AC_SINGLE_S_TYPE!\n",i);
  1676. for (size_t j = 0; j < nMaxChn; j++)
  1677. {
  1678. GlobalPowerManger* _globalPowerMangerTemp = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
  1679. if(_globalPowerMangerTemp==NULL)
  1680. {
  1681. //log_e("_globalPowerManger malloc error.\n");
  1682. return -1 ;
  1683. }
  1684. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1685. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager*)malloc(sizeof(GlobalOverManager));
  1686. if(_globalPowerMangerTemp->global_over_manager==NULL)
  1687. {
  1688. //log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1689. return -1 ;
  1690. }
  1691. memset(_globalPowerMangerTemp->global_over_manager,0,sizeof(GlobalOverManager));
  1692. //查询是否由通道信息
  1693. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  1694. _globalDeviceManager->_globalDevInfo.product_id,
  1695. i,
  1696. j+1, //1*8+j
  1697. _globalPowerMangerTemp);
  1698. //未查询到信息 则插入
  1699. if(ret==-1)
  1700. {
  1701. _globalPowerMangerTemp->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1702. _globalPowerMangerTemp->product_saddr = i ;
  1703. _globalPowerMangerTemp->product_ch_id = chn;
  1704. _globalPowerMangerTemp->product_ch_addr = j+1;
  1705. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1706. _globalPowerMangerTemp->product_ch_type = type;
  1707. _globalPowerMangerTemp->product_ch_status = 0;
  1708. _globalPowerMangerTemp->product_ch_NF_status= 0;
  1709. _globalPowerMangerTemp->product_ch_start_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1710. _globalPowerMangerTemp->product_ch_stop_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1711. _globalPowerMangerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY; // 默认超限只报警
  1712. _globalPowerMangerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1713. _globalPowerMangerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1714. _globalPowerMangerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1715. _globalPowerMangerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1716. if(dev_insert_power_manage_info(_globalDeviceManager->db,
  1717. _globalDeviceManager->_globalDevInfo.product_id,
  1718. _globalPowerMangerTemp->product_ch_id,
  1719. _globalPowerMangerTemp)!=0)
  1720. {
  1721. log_e("address %d chn %d data inserted error.\n",i,chn);
  1722. return 0;
  1723. }
  1724. /*
  1725. else
  1726. {
  1727. log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
  1728. }
  1729. */
  1730. }
  1731. if ( _globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One_B)
  1732. {
  1733. // 初始化三相子通道
  1734. GlobalTreeACManager *_globalTACManager = NULL;
  1735. INIT_LIST_HEAD(&_globalPowerMangerTemp->list_Tree_AC);
  1736. for (size_t indexT = 0; indexT < 3; indexT++)
  1737. {
  1738. _globalTACManager = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  1739. memset(_globalTACManager, 0, sizeof(GlobalTreeACManager));
  1740. if (_globalTACManager == NULL)
  1741. {
  1742. log_e("_globalTACManager malloc error.\n");
  1743. return -1;
  1744. }
  1745. _globalTACManager->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1746. memset(_globalTACManager->global_over_manager, 0, sizeof(GlobalOverManager));
  1747. if (_globalTACManager->global_over_manager == NULL)
  1748. {
  1749. log_e("_globalTACManager->global_over_manager malloc error.\n");
  1750. return -1;
  1751. }
  1752. ret = dev_get_t_ac_power_manage_info(_globalDeviceManager->db,
  1753. _globalDeviceManager->_globalDevInfo.product_id, i,
  1754. j + 1, // 1*8+j
  1755. nTac_chn,
  1756. _globalTACManager);
  1757. _globalTACManager->product_ch_addr = j + 1;
  1758. // 未查询到信息 则插入
  1759. if (ret == -1)
  1760. {
  1761. _globalTACManager->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1762. _globalTACManager->product_saddr = i;
  1763. _globalTACManager->product_ch_id = _globalPowerMangerTemp->product_ch_id;
  1764. _globalTACManager->product_ch_addr = j + 1;
  1765. _globalTACManager->product_ph_id = nTac_chn;
  1766. _globalTACManager->product_ph_type = indexT;
  1767. _globalTACManager->product_ph_outputType = 2; // 1三相2单相
  1768. if (indexT == ((nTac_chn-3)/(PHASE_GROUP_CNT*3)+3)%3)
  1769. {
  1770. _globalTACManager->product_ph_outputStatus = 1; // 1输出2不输出
  1771. }
  1772. else
  1773. {
  1774. _globalTACManager->product_ph_outputStatus = 2; // 1输出2不输出
  1775. }
  1776. if (dev_insert_t_ac_power_manage_info(_globalDeviceManager->db,
  1777. _globalDeviceManager->_globalDevInfo.product_id,
  1778. _globalTACManager->product_ch_id,
  1779. _globalTACManager) != 0)
  1780. {
  1781. log_e("address %d ph_chn %d data inserted error.\n", i, nTac_chn);
  1782. return 0;
  1783. }
  1784. }
  1785. // 绑定到三项通道
  1786. _globalTACManager->product_saddr = i;
  1787. _globalTACManager->product_ph_type = indexT;
  1788. if (_globalPowerMangerTemp)
  1789. {
  1790. list_add_tail(&_globalTACManager->list_Tree_AC, &_globalPowerMangerTemp->list_Tree_AC);
  1791. }
  1792. nTac_chn += 1;
  1793. }
  1794. }
  1795. _globalPowerMangerTemp->product_saddr = i;
  1796. // 添加到队尾
  1797. list_add_tail(&_globalPowerMangerTemp->list, &_globalDeviceManager->_globalPowerManger.list);
  1798. chn += 1;
  1799. }
  1800. }
  1801. break;
  1802. case AC_MULTI_S_TYPE://预留
  1803. {
  1804. }
  1805. break;
  1806. case AC_MULTI_B_TYPE://预留
  1807. {
  1808. }
  1809. break;
  1810. case DC_OUT_TYPE: //DC输出继电器 1路
  1811. {
  1812. }
  1813. break;
  1814. case DC_IN_TYPE: // DC采集
  1815. {
  1816. log_i("Address=%d DC_IN_TYPE!\n",i);
  1817. for (size_t j = 0; j < nMaxChn; j++)//AC与DC长度一致
  1818. {
  1819. GlobalPowerManger* _globalPowerMangerTemp = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
  1820. if(_globalPowerMangerTemp==NULL)
  1821. {
  1822. //log_e("_globalPowerManger malloc error.\n");
  1823. return -1 ;
  1824. }
  1825. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1826. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager*)malloc(sizeof(GlobalOverManager));
  1827. if(_globalPowerMangerTemp->global_over_manager==NULL)
  1828. {
  1829. //log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1830. return -1 ;
  1831. }
  1832. memset(_globalPowerMangerTemp->global_over_manager,0,sizeof(GlobalOverManager));
  1833. //查询是否由通道信息
  1834. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  1835. _globalDeviceManager->_globalDevInfo.product_id,i,
  1836. j+1, //1*8+j
  1837. _globalPowerMangerTemp);
  1838. //未查询到信息 则插入
  1839. if(ret==-1)
  1840. {
  1841. _globalPowerMangerTemp->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1842. _globalPowerMangerTemp->product_saddr = i ;
  1843. _globalPowerMangerTemp->product_ch_id = chn;
  1844. _globalPowerMangerTemp->product_ch_addr = j+1;
  1845. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1846. _globalPowerMangerTemp->product_ch_type = type;
  1847. _globalPowerMangerTemp->product_ch_status = 0;
  1848. _globalPowerMangerTemp->product_ch_NF_status= 0;
  1849. _globalPowerMangerTemp->product_ch_start_delay = 1000;
  1850. _globalPowerMangerTemp->product_ch_stop_delay = 1000;
  1851. _globalPowerMangerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY; // 默认超限只报警
  1852. _globalPowerMangerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1853. _globalPowerMangerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1854. _globalPowerMangerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1855. _globalPowerMangerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1856. if(dev_insert_power_manage_info(_globalDeviceManager->db,
  1857. _globalDeviceManager->_globalDevInfo.product_id,
  1858. _globalPowerMangerTemp->product_ch_id,
  1859. _globalPowerMangerTemp)!=0)
  1860. {
  1861. log_e("address %d chn %d data inserted error.\n",i,chn);
  1862. return 0;
  1863. }
  1864. /*
  1865. else
  1866. {
  1867. log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
  1868. }
  1869. */
  1870. }
  1871. _globalPowerMangerTemp->product_saddr = i ;
  1872. //添加到队尾
  1873. list_add_tail(&_globalPowerMangerTemp->list,&_globalDeviceManager->_globalPowerManger.list);
  1874. chn+=1;
  1875. }
  1876. }
  1877. break;
  1878. case DCPDU_TYPE: // DCPDU
  1879. {
  1880. log_i("DCPDU_TYPE!\n");
  1881. //unsigned int start_delay[8], stop_delay[8];
  1882. //g_switch_get_dcpdu_start_time_delay(&_globalDeviceManager->_globalRelaySampManger,i, start_delay);
  1883. //g_switch_get_dcpdu_stop_time_delay(&_globalDeviceManager->_globalRelaySampManger,i, stop_delay);
  1884. for (size_t j = 0; j < nMaxChn; j++)
  1885. {
  1886. GlobalPowerManger* _globalPowerMangerTemp = (GlobalPowerManger*)malloc(sizeof(GlobalPowerManger));
  1887. if(_globalPowerMangerTemp==NULL)
  1888. {
  1889. //log_e("_globalPowerManger malloc error.\n");
  1890. return -1 ;
  1891. }
  1892. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1893. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager*)malloc(sizeof(GlobalOverManager));
  1894. if(_globalPowerMangerTemp->global_over_manager==NULL)
  1895. {
  1896. //log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1897. return -1 ;
  1898. }
  1899. memset(_globalPowerMangerTemp->global_over_manager,0,sizeof(GlobalOverManager));
  1900. //查询是否由通道信息
  1901. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  1902. _globalDeviceManager->_globalDevInfo.product_id,i,
  1903. j+1, //1*8+j
  1904. _globalPowerMangerTemp);
  1905. _globalPowerMangerTemp->product_ch_addr = j+1;
  1906. //未查询到信息 则插入
  1907. if(ret==-1)
  1908. {
  1909. _globalPowerMangerTemp->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1910. _globalPowerMangerTemp->product_saddr = i ;
  1911. _globalPowerMangerTemp->product_ch_id = chn;
  1912. _globalPowerMangerTemp->product_ch_addr = j+1;
  1913. sprintf(_globalPowerMangerTemp->product_ch_name,"CH%d",_globalPowerMangerTemp->product_ch_id);
  1914. _globalPowerMangerTemp->product_ch_type = type;
  1915. _globalPowerMangerTemp->product_ch_status = 0;
  1916. _globalPowerMangerTemp->product_ch_NF_status= 0;
  1917. _globalPowerMangerTemp->product_ch_start_delay =1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1918. _globalPowerMangerTemp->product_ch_stop_delay =1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1919. _globalPowerMangerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY; // 默认超限只报警
  1920. _globalPowerMangerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1921. _globalPowerMangerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1922. _globalPowerMangerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl =ALARM_CTRL_ALARM_ONLY;
  1923. _globalPowerMangerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1924. if(dev_insert_power_manage_info(_globalDeviceManager->db,
  1925. _globalDeviceManager->_globalDevInfo.product_id,
  1926. _globalPowerMangerTemp->product_ch_id,
  1927. _globalPowerMangerTemp)!=0)
  1928. {
  1929. log_e("address %d chn %d data inserted error.\n",i,chn);
  1930. return 0;
  1931. }
  1932. /*
  1933. else
  1934. {
  1935. log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
  1936. }
  1937. */
  1938. }
  1939. _globalPowerMangerTemp->product_saddr = i ;
  1940. _globalPowerMangerTemp->product_ch_type = type;
  1941. _globalPowerMangerTemp->product_ch_id = chn;
  1942. if (dev_update_power_manage_genera_info_addr(__globalDeviceManage.db, _globalDeviceManager->_globalDevInfo.product_id, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, _globalPowerMangerTemp) != 0)
  1943. {
  1944. log_e("update pwr general data err.");
  1945. }
  1946. //添加到队尾
  1947. list_add_tail(&_globalPowerMangerTemp->list,&_globalDeviceManager->_globalPowerManger.list);
  1948. chn+=1;
  1949. }
  1950. }
  1951. break;
  1952. case TREE_AC_TYPE: // 三相供电
  1953. {
  1954. log_i("TreeAC_TYPE!\n");
  1955. GlobalPowerManger *_globalPowerMangerTemp=NULL;
  1956. for (size_t j = 0; j < nMaxChn; j++)
  1957. {
  1958. if (_globalDeviceManager->_globalDevInfo.product_pwr_type == SmartPDU_Tree_AC_One)
  1959. {
  1960. log_i("TreeAC_TYPE_3-1!\n");
  1961. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  1962. if (_globalPowerMangerTemp == NULL)
  1963. {
  1964. log_e("_globalPowerManger malloc error.\n");
  1965. return -1;
  1966. }
  1967. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  1968. INIT_LIST_HEAD(&_globalPowerMangerTemp->list_Tree_AC);
  1969. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  1970. if (_globalPowerMangerTemp->global_over_manager == NULL)
  1971. {
  1972. log_e("_globalPowerManger->global_over_manager malloc error.\n");
  1973. return -1;
  1974. }
  1975. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  1976. // 查询是否由通道信息
  1977. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  1978. _globalDeviceManager->_globalDevInfo.product_id, i,
  1979. j + 1, // 1*8+j
  1980. _globalPowerMangerTemp);
  1981. _globalPowerMangerTemp->product_ch_addr = j + 1;
  1982. // 未查询到信息 则插入
  1983. if (ret == -1)
  1984. {
  1985. _globalPowerMangerTemp->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  1986. _globalPowerMangerTemp->product_saddr = i;
  1987. _globalPowerMangerTemp->product_ch_id = chn;
  1988. _globalPowerMangerTemp->product_ch_addr = j + 1;
  1989. sprintf(_globalPowerMangerTemp->product_ch_name, "CH%d", _globalPowerMangerTemp->product_ch_id);
  1990. _globalPowerMangerTemp->product_ch_type = type;
  1991. _globalPowerMangerTemp->product_ch_status = 0;
  1992. _globalPowerMangerTemp->product_ch_NF_status= 0;
  1993. _globalPowerMangerTemp->product_ch_start_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1994. _globalPowerMangerTemp->product_ch_stop_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  1995. _globalPowerMangerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY; // 默认超限只报警
  1996. _globalPowerMangerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1997. _globalPowerMangerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1998. _globalPowerMangerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  1999. _globalPowerMangerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl =ALARM_CTRL_ALARM_ONLY;
  2000. if (dev_insert_power_manage_info(_globalDeviceManager->db,
  2001. _globalDeviceManager->_globalDevInfo.product_id,
  2002. _globalPowerMangerTemp->product_ch_id,
  2003. _globalPowerMangerTemp) != 0)
  2004. {
  2005. log_e("address %d chn %d data inserted error.\n", i, chn);
  2006. return 0;
  2007. }
  2008. }
  2009. _globalPowerMangerTemp->product_saddr = i;
  2010. _globalPowerMangerTemp->product_ch_type = type;
  2011. _globalPowerMangerTemp->product_ch_id = chn;
  2012. if (dev_update_power_manage_genera_info_addr(__globalDeviceManage.db, _globalDeviceManager->_globalDevInfo.product_id, _globalPowerMangerTemp->product_saddr, _globalPowerMangerTemp->product_ch_addr, _globalPowerMangerTemp) != 0)
  2013. {
  2014. log_e("update pwr general data err.");
  2015. }
  2016. // 添加到队尾
  2017. list_add_tail(&_globalPowerMangerTemp->list, &_globalDeviceManager->_globalPowerManger.list);
  2018. chn += 1;
  2019. // 初始化三相子通道三进1出
  2020. GlobalTreeACManager *_globalTACManager = NULL;
  2021. for (size_t indexT = 0; indexT < 3; indexT++)
  2022. {
  2023. _globalTACManager = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  2024. memset(_globalTACManager, 0, sizeof(GlobalTreeACManager));
  2025. if (_globalTACManager == NULL)
  2026. {
  2027. log_e("_globalTACManager malloc error.\n");
  2028. return -1;
  2029. }
  2030. _globalTACManager->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  2031. memset(_globalTACManager->global_over_manager, 0, sizeof(GlobalOverManager));
  2032. if (_globalTACManager->global_over_manager == NULL)
  2033. {
  2034. log_e("_globalTACManager->global_over_manager malloc error.\n");
  2035. return -1;
  2036. }
  2037. ret = dev_get_t_ac_power_manage_info(_globalDeviceManager->db,
  2038. _globalDeviceManager->_globalDevInfo.product_id, i,
  2039. j + 1, // 1*8+j
  2040. nTac_chn,
  2041. _globalTACManager);
  2042. _globalTACManager->product_ch_addr = j + 1;
  2043. // 未查询到信息 则插入
  2044. if (ret == -1)
  2045. {
  2046. _globalTACManager->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  2047. _globalTACManager->product_saddr = i;
  2048. _globalTACManager->product_ch_id = _globalPowerMangerTemp->product_ch_id;
  2049. _globalTACManager->product_ch_addr = j + 1;
  2050. _globalTACManager->product_ph_id = nTac_chn;
  2051. _globalTACManager->product_ph_type = indexT;
  2052. _globalTACManager->product_ph_outputType = 2; // 1三相2单相
  2053. if (indexT == (j + 3) % 3)
  2054. {
  2055. _globalTACManager->product_ph_outputStatus = 1; // 1输出2不输出
  2056. }
  2057. else
  2058. {
  2059. _globalTACManager->product_ph_outputStatus = 2; // 1输出2不输出
  2060. }
  2061. if (dev_insert_t_ac_power_manage_info(_globalDeviceManager->db,
  2062. _globalDeviceManager->_globalDevInfo.product_id,
  2063. _globalTACManager->product_ch_id,
  2064. _globalTACManager) != 0)
  2065. {
  2066. log_e("address %d ph_chn %d data inserted error.\n", i, nTac_chn);
  2067. return 0;
  2068. }
  2069. }
  2070. // 绑定到三项通道
  2071. _globalTACManager->product_saddr = i;
  2072. _globalTACManager->product_ph_type = indexT;
  2073. if (_globalPowerMangerTemp)
  2074. {
  2075. list_add_tail(&_globalTACManager->list_Tree_AC, &_globalPowerMangerTemp->list_Tree_AC);
  2076. }
  2077. nTac_chn += 1;
  2078. }
  2079. }
  2080. else
  2081. {
  2082. log_i("TreeAC_TYPE_3-3!\n");
  2083. if ((j + 3) % 3 == 0) // 线路段初始化
  2084. {
  2085. _globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
  2086. if (_globalPowerMangerTemp == NULL)
  2087. {
  2088. log_e("_globalPowerManger malloc error.\n");
  2089. return -1;
  2090. }
  2091. memset(_globalPowerMangerTemp, 0, sizeof(GlobalPowerManger));
  2092. INIT_LIST_HEAD(&_globalPowerMangerTemp->list_Tree_AC);
  2093. _globalPowerMangerTemp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  2094. if (_globalPowerMangerTemp->global_over_manager == NULL)
  2095. {
  2096. log_e("_globalPowerManger->global_over_manager malloc error.\n");
  2097. return -1;
  2098. }
  2099. memset(_globalPowerMangerTemp->global_over_manager, 0, sizeof(GlobalOverManager));
  2100. // 查询是否由通道信息
  2101. ret = dev_get_power_manage_info(_globalDeviceManager->db,
  2102. _globalDeviceManager->_globalDevInfo.product_id, i,
  2103. j / 3 + 1, // 1*8+j
  2104. _globalPowerMangerTemp);
  2105. _globalPowerMangerTemp->product_ch_addr = j / 3 + 1;
  2106. // 未查询到信息 则插入
  2107. if (ret == -1)
  2108. {
  2109. _globalPowerMangerTemp->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  2110. _globalPowerMangerTemp->product_saddr = i;
  2111. _globalPowerMangerTemp->product_ch_id = chn;
  2112. _globalPowerMangerTemp->product_ch_addr = j / 3 + 1;
  2113. sprintf(_globalPowerMangerTemp->product_ch_name, "CH%d", _globalPowerMangerTemp->product_ch_id);
  2114. _globalPowerMangerTemp->product_ch_type = type;
  2115. _globalPowerMangerTemp->product_ch_status = 0;
  2116. _globalPowerMangerTemp->product_ch_NF_status= 0;
  2117. _globalPowerMangerTemp->product_ch_start_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  2118. _globalPowerMangerTemp->product_ch_stop_delay = 1000 * (chn%nGroups!=0?chn%nGroups:nGroups);
  2119. _globalPowerMangerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY; // 默认超限只报警
  2120. _globalPowerMangerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  2121. _globalPowerMangerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  2122. _globalPowerMangerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  2123. _globalPowerMangerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl = ALARM_CTRL_ALARM_ONLY;
  2124. if (dev_insert_power_manage_info(_globalDeviceManager->db,
  2125. _globalDeviceManager->_globalDevInfo.product_id,
  2126. _globalPowerMangerTemp->product_ch_id,
  2127. _globalPowerMangerTemp) != 0)
  2128. {
  2129. log_e("address %d chn %d data inserted error.\n", i, chn);
  2130. return 0;
  2131. }
  2132. }
  2133. _globalPowerMangerTemp->product_saddr = i;
  2134. _globalPowerMangerTemp->product_ch_type = type;
  2135. _globalPowerMangerTemp->product_ch_id = chn;
  2136. if (dev_update_power_manage_genera_info_addr(__globalDeviceManage.db, _globalDeviceManager->_globalDevInfo.product_id, _globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr, _globalPowerMangerTemp) != 0)
  2137. {
  2138. log_e("update pwr general data err.");
  2139. }
  2140. // 添加到队尾
  2141. list_add_tail(&_globalPowerMangerTemp->list, &_globalDeviceManager->_globalPowerManger.list);
  2142. chn += 1;
  2143. }
  2144. // 初始化三相子通道三进三出
  2145. GlobalTreeACManager *_globalTACManager = NULL;
  2146. _globalTACManager = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
  2147. memset(_globalTACManager, 0, sizeof(GlobalTreeACManager));
  2148. if (_globalTACManager == NULL)
  2149. {
  2150. log_e("_globalTACManager malloc error.\n");
  2151. return -1;
  2152. }
  2153. _globalTACManager->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
  2154. memset(_globalTACManager->global_over_manager, 0, sizeof(GlobalOverManager));
  2155. if (_globalTACManager->global_over_manager == NULL)
  2156. {
  2157. log_e("_globalTACManager->global_over_manager malloc error.\n");
  2158. return -1;
  2159. }
  2160. ret = dev_get_t_ac_power_manage_info(_globalDeviceManager->db,
  2161. _globalDeviceManager->_globalDevInfo.product_id, i,
  2162. j + 1, // 1*8+j
  2163. nTac_chn,
  2164. _globalTACManager);
  2165. _globalTACManager->product_ch_addr = j + 1;
  2166. // 未查询到信息 则插入
  2167. if (ret == -1)
  2168. {
  2169. _globalTACManager->product_id = _globalDeviceManager->_globalDevInfo.product_id;
  2170. _globalTACManager->product_saddr = i;
  2171. _globalTACManager->product_ch_id = _globalPowerMangerTemp->product_ch_id;
  2172. _globalTACManager->product_ch_addr = j + 1;
  2173. _globalTACManager->product_ph_id = nTac_chn;
  2174. _globalTACManager->product_ph_type = (j + 3) % 3;
  2175. _globalTACManager->product_ph_outputType = 1; // 1三相2单相
  2176. _globalTACManager->product_ph_outputStatus = 1; // 1输出
  2177. if (dev_insert_t_ac_power_manage_info(_globalDeviceManager->db,
  2178. _globalDeviceManager->_globalDevInfo.product_id,
  2179. _globalTACManager->product_ch_id,
  2180. _globalTACManager) != 0)
  2181. {
  2182. log_e("address %d ph_chn %d data inserted error.\n", i, nTac_chn);
  2183. return 0;
  2184. }
  2185. }
  2186. // 绑定到三项通道
  2187. _globalTACManager->product_saddr = i;
  2188. _globalTACManager->product_ph_type = (j + 3) % 3;
  2189. if (_globalPowerMangerTemp)
  2190. {
  2191. list_add_tail(&_globalTACManager->list_Tree_AC, &_globalPowerMangerTemp->list_Tree_AC);
  2192. }
  2193. nTac_chn += 1;
  2194. }
  2195. }
  2196. }
  2197. }
  2198. }
  2199. }
  2200. #if 1
  2201. sprintf(strLog,"%s$|$通道",language_alarm_Init_Success[0]);
  2202. char number[10];
  2203. sprintf(number,"%d",chn-1);
  2204. dev_Alarm_Run_message(_globalDeviceManager,strLog,number);
  2205. //获取数据库中的定时数据
  2206. ret=dev_get_power_ds(_globalDeviceManager->db,&_globalDeviceManager->_globalPowerManger,NULL);
  2207. //初始化传感器列表
  2208. INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
  2209. INIT_LIST_HEAD(&_globalDeviceManager->g_new_global_breaker.list);
  2210. //获取传感器管理信息
  2211. /////////////////////////////////////////
  2212. ///todo:此信息需要和数据库更新以后在关联
  2213. ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
  2214. _globalDeviceManager->_globalDevInfo.product_id,
  2215. &_globalDeviceManager->_globalSensorManger);
  2216. if(ret!=0)
  2217. {
  2218. log_e("not find sensor info.");
  2219. }
  2220. else
  2221. log_d("get sensor info ok.");
  2222. dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"sensor");
  2223. ret =dev_get_breaker_manage_info(_globalDeviceManager->db,_globalDeviceManager->_globalDevInfo.product_id,
  2224. &_globalDeviceManager->g_new_global_breaker);
  2225. if(ret!=0)
  2226. {
  2227. log_e("not find breaker info.");
  2228. }
  2229. else
  2230. log_d("get breaker info ok.");
  2231. //创建modbus采集线程 继电器控制线程
  2232. #if(OS_HANDWARE==1)
  2233. _globalDeviceManager->dev_samp_flag = true;
  2234. thread_start(THREAD_ID_POWER, power_thread, _globalDeviceManager, 20*MB, 0);
  2235. thread_start(THREAD_ID_SENSOR, sensor_thread, _globalDeviceManager, 10*MB, 0);
  2236. thread_start(THREAD_ID_SHMW, shm_thread, _globalDeviceManager, 10*MB, 0);
  2237. thread_start(THREAD_ID_BREAKER_SCANNER,breaker_scanner_thread,_globalDeviceManager,1*MB,0);
  2238. thread_start(THREAD_ID_BREAKER, breaker_thread, _globalDeviceManager, 5*MB, 0);
  2239. dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"Server Thread");
  2240. #endif
  2241. //创建传感器采集控制线程
  2242. _globalNTPManager.ntpaddress = malloc(128);
  2243. _globalNTPManager.ntpName = malloc(128);
  2244. _globalNTPManager.time = malloc(22);
  2245. ret = dev_get_ntp_info(_globalDeviceManager->db, &_globalNTPManager);
  2246. if (ret == -1)
  2247. {
  2248. log_e("get ntp info from database failed");
  2249. }
  2250. else if (ret == -2)
  2251. {
  2252. _globalNTPManager.mode = 1;
  2253. strcpy(_globalNTPManager.ntpaddress, "119.28.183.184");
  2254. strcpy(_globalNTPManager.ntpName, "百度NTP");
  2255. _globalNTPManager.port = 123;
  2256. _globalNTPManager.product_id = _globalDeviceManager->_globalDevInfo.product_id;
  2257. time_t t = time(NULL);
  2258. struct tm* ptm = localtime(&t);
  2259. sprintf(_globalNTPManager.time, "%04d-%02d-%02d %02d:%02d:%02d", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
  2260. struct tm* ptm_gm = gmtime(&t);
  2261. _globalNTPManager.tzone = 8;//ptm_gm->tm_hour - ptm->tm_hour;
  2262. _globalNTPManager.weekday = (ptm->tm_wday == 0) ? 7 : ptm->tm_wday;
  2263. if (dev_insert_ntp_info(_globalDeviceManager->db, &_globalNTPManager))
  2264. {
  2265. log_e("insert npt info failed");
  2266. }
  2267. }
  2268. else
  2269. {
  2270. log_d("get ntp info from database succeeded");
  2271. }
  2272. thread_start(THREAD_ID_NTP, ntp_thread, NULL, 10 * MB, 0);
  2273. dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "NTP");
  2274. #ifndef USE_NETSWITCH
  2275. thread_start(THREAD_ID_SNMP, snmp_thread, _globalDeviceManager, 10 * MB, 0);
  2276. #endif
  2277. dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "SNMP");
  2278. #endif
  2279. // 初始化web
  2280. websocket_init();
  2281. appweb_init();
  2282. cascade_init();
  2283. netswitch_init();
  2284. //通知smartUPG,app已经运行起来
  2285. upg_init();
  2286. while(1)
  2287. {
  2288. sleep(1);
  2289. }
  2290. return 0;
  2291. }