ems.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362
  1. #include "ems.h"
  2. #include "plt.h"
  3. #include "ems.h"
  4. struct ems_t ems;
  5. /* ms */
  6. static double ems_get_timeofday()
  7. {
  8. struct timeval tv;
  9. struct timezone tz;
  10. gettimeofday(&tv, &tz);
  11. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
  12. }
  13. static int ems_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  14. {
  15. int i;
  16. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  17. struct ems_t *dev = &ems;
  18. pcbparam->nrow++;
  19. log_dbg("%s, ++, row:%d; col:%d", __func__, pcbparam->nrow, ncolumn);
  20. for (i = 0; i < ncolumn; i++)
  21. {
  22. if (strcmp("reg_lo", columnname[i]) == 0)
  23. {
  24. dev->pow_reg.low = atof(columnvalue[i]);
  25. }
  26. else if (strcmp("reg_hi", columnname[i]) == 0)
  27. {
  28. dev->pow_reg.high = atof(columnvalue[i]);
  29. }
  30. else if (strcmp("reg_intv", columnname[i]) == 0)
  31. {
  32. dev->pow_reg.intv = atoi(columnvalue[i]);
  33. }
  34. else if (strcmp("pcurv_idx", columnname[i]) == 0)
  35. {
  36. dev->pcurv_idx = atoi(columnvalue[i]);
  37. }
  38. else if (strcmp("transf_conm_model", columnname[i]) == 0)
  39. {
  40. strcpy(dev->sztransf_conm_model, columnvalue[i]);
  41. dev->transf_conm_model = plt_devm_str2nbr(dev->sztransf_conm_model);
  42. }
  43. else if (strcmp("transf_conm_idx", columnname[i]) == 0)
  44. {
  45. dev->transf_conm_idx = atoi(columnvalue[i]);
  46. }
  47. else if (strcmp("transf_loadm_model", columnname[i]) == 0)
  48. {
  49. strcpy(dev->sztransf_loadm_model, columnvalue[i]);
  50. dev->transf_loadm_model = plt_devm_str2nbr(dev->sztransf_loadm_model);
  51. }
  52. else if (strcmp("transf_loadm_idx", columnname[i]) == 0)
  53. {
  54. dev->transf_loadm_idx = atoi(columnvalue[i]);
  55. }
  56. else if (strcmp("factory_conm_model", columnname[i]) == 0)
  57. {
  58. strcpy(dev->szfactory_conm_model, columnvalue[i]);
  59. dev->factory_conm_model = plt_devm_str2nbr(dev->szfactory_conm_model);
  60. }
  61. else if (strcmp("factory_conm_idx", columnname[i]) == 0)
  62. {
  63. dev->factory_conm_idx = atoi(columnvalue[i]);
  64. }
  65. else if (strcmp("factory_loadm_model", columnname[i]) == 0)
  66. {
  67. strcpy(dev->szfactory_loadm_model, columnvalue[i]);
  68. dev->factory_loadm_model = plt_devm_str2nbr(dev->szfactory_loadm_model);
  69. }
  70. else if (strcmp("factory_loadm_idx", columnname[i]) == 0)
  71. {
  72. dev->factory_loadm_idx = atoi(columnvalue[i]);
  73. }
  74. }
  75. pcbparam->ret = 0;
  76. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  77. return 0;
  78. }
  79. // int ems_get_con_ap()
  80. // {
  81. // struct ems_t* dev = &ems;
  82. // return dev->con_ap;
  83. // }
  84. // int ems_get_load_ap()
  85. // {
  86. // struct ems_t* dev = &ems;
  87. // return dev->load_ap;
  88. // }
  89. // double ems_get_load_com_ae()
  90. // {
  91. // struct ems_t* e = &ems;
  92. // return e->loadm_com_ae;
  93. // }
  94. // double ems_get_load_pos_ae()
  95. // {
  96. // struct ems_t* e = &ems;
  97. // return e->loadm_pos_ae;
  98. // }
  99. // double ems_get_load_neg_ae()
  100. // {
  101. // struct ems_t* e = &ems;
  102. // return e->loadm_neg_ae;
  103. // }
  104. static int ems_update_cur_timeseg_type()
  105. {
  106. int ret = -1;
  107. struct ems_t *dev = &ems;
  108. int tsidx = dev->timeseg_idx;
  109. struct timeseg_t *ts = &dev->timeseg;
  110. time_t timep;
  111. struct tm *tsp;
  112. int hh, nn;
  113. if (tsidx >= 1 && tsidx <= TIMESEG_NBR_MAX && ts->status == TIMESEGST_VALID)
  114. {
  115. time(&timep);
  116. tsp = localtime(&timep);
  117. hh = tsp->tm_hour;
  118. nn = tsp->tm_min / (int)5 * (int)5;
  119. dev->cur_timeseg_type = ts->seg_type[hh][nn];
  120. ret = 0;
  121. }
  122. return ret;
  123. }
  124. static void ems_update()
  125. {
  126. struct ems_t *dev = &ems;
  127. static double ts_last_update_timeseg = 0.0;
  128. double ts = ems_get_timeofday();
  129. if (ts - ts_last_update_timeseg > 1000)
  130. { // 1s
  131. ts_last_update_timeseg = ts;
  132. ems_update_cur_timeseg_type();
  133. }
  134. if (dev->transf_conm_idx > 0 && dev->transf_loadm_idx > 0)
  135. {
  136. dev->transf_con_ap = meter_get_com_ap(dev->transf_conm_model, dev->transf_conm_idx);
  137. // prepare meter data
  138. dev->transf_conm_com_ap = dev->transf_con_ap;
  139. dev->transf_conm_com_ae = meter_get_com_ae(dev->transf_conm_model, dev->transf_conm_idx);
  140. dev->transf_conm_pos_ae = meter_get_pos_ae(dev->transf_conm_model, dev->transf_conm_idx);
  141. dev->transf_conm_neg_ae = meter_get_neg_ae(dev->transf_conm_model, dev->transf_conm_idx);
  142. dev->transf_load_ap = meter_get_com_ap(dev->transf_loadm_model, dev->transf_loadm_idx);
  143. // prepare meter data
  144. dev->transf_loadm_com_ap = dev->transf_load_ap;
  145. dev->transf_loadm_com_ae = meter_get_com_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  146. dev->transf_loadm_pos_ae = meter_get_pos_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  147. dev->transf_loadm_neg_ae = meter_get_neg_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  148. }
  149. else if (dev->transf_conm_idx == 0 && dev->transf_loadm_idx > 0)
  150. {
  151. dev->transf_load_ap = meter_get_com_ap(dev->transf_loadm_model, dev->transf_loadm_idx);
  152. // prepare meter data
  153. dev->transf_loadm_com_ap = dev->transf_load_ap;
  154. dev->transf_loadm_com_ae = meter_get_com_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  155. dev->transf_loadm_pos_ae = meter_get_pos_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  156. dev->transf_loadm_neg_ae = meter_get_neg_ae(dev->transf_loadm_model, dev->transf_loadm_idx);
  157. dev->transf_con_ap = ems_get_transf_load_com_ap() - ess_get_ap();
  158. // prepare meter data
  159. dev->transf_conm_com_ap = dev->transf_con_ap;
  160. if (ts - dev->transf_ts_last_m_integ > 5000)
  161. { // 5s
  162. dev->transf_ts_last_m_integ = ts;
  163. if (dev->transf_conm_com_ap > 0)
  164. {
  165. dev->transf_conm_pos_ae += dev->transf_conm_com_ap * (double)5.0 / (double)3600.0;
  166. }
  167. else if (dev->transf_conm_com_ap < 0)
  168. {
  169. dev->transf_conm_neg_ae += (0 - dev->transf_conm_com_ap) * (double)5.0 / (double)3600.0;
  170. }
  171. dev->transf_loadm_com_ae = dev->transf_loadm_pos_ae + dev->transf_loadm_neg_ae;
  172. }
  173. }
  174. else if (dev->transf_conm_idx > 0 && dev->transf_loadm_idx == 0)
  175. {
  176. dev->transf_con_ap = meter_get_com_ap(dev->transf_conm_model, dev->transf_conm_idx);
  177. // prepare meter data
  178. dev->transf_conm_com_ap = dev->transf_con_ap;
  179. dev->transf_conm_com_ae = meter_get_com_ae(dev->transf_conm_model, dev->transf_conm_idx);
  180. dev->transf_conm_pos_ae = meter_get_pos_ae(dev->transf_conm_model, dev->transf_conm_idx);
  181. dev->transf_conm_neg_ae = meter_get_neg_ae(dev->transf_conm_model, dev->transf_conm_idx);
  182. dev->transf_load_ap = ems_get_transf_con_com_ap() + ess_get_ap();
  183. // prepare meter data
  184. dev->transf_loadm_com_ap = dev->transf_load_ap;
  185. if (ts - dev->transf_ts_last_m_integ > 5000)
  186. { // 5s
  187. dev->transf_ts_last_m_integ = ts;
  188. if (dev->transf_loadm_com_ap > 0)
  189. {
  190. dev->transf_loadm_pos_ae += dev->transf_loadm_com_ap * (double)5.0 / (double)3600.0;
  191. }
  192. else if (dev->transf_loadm_com_ap < 0)
  193. {
  194. dev->transf_loadm_neg_ae += (0 - dev->transf_loadm_com_ap) * (double)5.0 / (double)3600.0;
  195. }
  196. dev->transf_loadm_com_ae = dev->transf_loadm_pos_ae + dev->transf_loadm_neg_ae;
  197. }
  198. }
  199. else
  200. {
  201. // should not goto here
  202. }
  203. if (dev->factory_conm_idx > 0 && dev->factory_loadm_idx > 0)
  204. {
  205. dev->factory_con_ap = meter_get_com_ap(dev->factory_conm_model, dev->factory_conm_idx);
  206. // prepare meter data
  207. dev->factory_conm_com_ap = dev->factory_con_ap;
  208. dev->factory_conm_com_ae = meter_get_com_ae(dev->factory_conm_model, dev->factory_conm_idx);
  209. dev->factory_conm_pos_ae = meter_get_pos_ae(dev->factory_conm_model, dev->factory_conm_idx);
  210. dev->factory_conm_neg_ae = meter_get_neg_ae(dev->factory_conm_model, dev->factory_conm_idx);
  211. dev->factory_load_ap = meter_get_com_ap(dev->factory_loadm_model, dev->factory_loadm_idx);
  212. // prepare meter data
  213. dev->factory_loadm_com_ap = dev->factory_load_ap;
  214. dev->factory_loadm_com_ae = meter_get_com_ae(dev->factory_loadm_model, dev->factory_loadm_idx);
  215. dev->factory_loadm_pos_ae = meter_get_pos_ae(dev->factory_loadm_model, dev->factory_loadm_idx);
  216. dev->factory_loadm_neg_ae = meter_get_neg_ae(dev->factory_loadm_model, dev->factory_loadm_idx);
  217. }
  218. else if (dev->factory_conm_idx == 0 && dev->factory_loadm_idx > 0)
  219. {
  220. dev->factory_con_ap = meter_get_com_ap(dev->factory_conm_model, dev->factory_conm_idx);
  221. // prepare meter data
  222. dev->factory_conm_com_ap = dev->factory_con_ap;
  223. dev->factory_conm_com_ae = meter_get_com_ae(dev->factory_conm_model, dev->factory_conm_idx);
  224. dev->factory_conm_pos_ae = meter_get_pos_ae(dev->factory_conm_model, dev->factory_conm_idx);
  225. dev->factory_conm_neg_ae = meter_get_neg_ae(dev->factory_conm_model, dev->factory_conm_idx);
  226. dev->factory_load_ap = ems_get_factory_con_com_ap() - ess_get_ap();
  227. // prepare meter data
  228. dev->factory_loadm_com_ap = dev->factory_load_ap;
  229. if (ts - dev->factory_ts_last_m_integ > 5000)
  230. { // 5s
  231. dev->factory_ts_last_m_integ = ts;
  232. if (dev->factory_loadm_com_ap > 0)
  233. {
  234. dev->factory_loadm_pos_ae += dev->factory_loadm_com_ap * (double)5.0 / (double)3600.0;
  235. }
  236. else if (dev->factory_loadm_com_ap < 0)
  237. {
  238. dev->factory_loadm_neg_ae += (0 - dev->factory_loadm_com_ap) * (double)5.0 / (double)3600.0;
  239. }
  240. dev->factory_loadm_com_ae = dev->factory_loadm_pos_ae + dev->factory_loadm_neg_ae;
  241. }
  242. }
  243. else if (dev->factory_conm_idx > 0 && dev->factory_loadm_idx == 0)
  244. {
  245. dev->factory_con_ap = meter_get_com_ap(dev->factory_conm_model, dev->factory_conm_idx);
  246. // prepare meter data
  247. dev->factory_conm_com_ap = dev->factory_con_ap;
  248. dev->factory_conm_com_ae = meter_get_com_ae(dev->factory_conm_model, dev->factory_conm_idx);
  249. dev->factory_conm_pos_ae = meter_get_pos_ae(dev->factory_conm_model, dev->factory_conm_idx);
  250. dev->factory_conm_neg_ae = meter_get_neg_ae(dev->factory_conm_model, dev->factory_conm_idx);
  251. dev->factory_load_ap = ems_get_factory_con_com_ap() + ess_get_ap();
  252. // prepare meter data
  253. dev->factory_loadm_com_ap = dev->factory_load_ap;
  254. if (ts - dev->factory_ts_last_m_integ > 5000)
  255. { // 5s
  256. dev->factory_ts_last_m_integ = ts;
  257. if (dev->factory_loadm_com_ap > 0)
  258. {
  259. dev->factory_loadm_pos_ae += dev->factory_loadm_com_ap * (double)5.0 / (double)3600.0;
  260. }
  261. else if (dev->factory_loadm_com_ap < 0)
  262. {
  263. dev->factory_loadm_neg_ae += (0 - dev->factory_loadm_com_ap) * (double)5.0 / (double)3600.0;
  264. }
  265. dev->factory_loadm_com_ae = dev->factory_loadm_pos_ae + dev->factory_loadm_neg_ae;
  266. }
  267. }
  268. else
  269. {
  270. }
  271. }
  272. bool appRun = 1;
  273. void ems_exit()
  274. {
  275. appRun = 0;
  276. }
  277. void ems_run()
  278. {
  279. static int iCounter = 0;
  280. syslog(LOG_INFO, "%s, ++", __func__);
  281. // running
  282. while (appRun)
  283. {
  284. ems_sm();
  285. ems_update();
  286. // 1 times per second
  287. if (iCounter++ > 100)
  288. {
  289. ems_fire_warning();
  290. iCounter = 0;
  291. }
  292. usleep(10000); // 10ms
  293. }
  294. syslog(LOG_INFO, "%s, --", __func__);
  295. }
  296. int ems_fire_warning_level = 0;
  297. void ems_fire_warning()
  298. {
  299. return;
  300. int warning_level = 0;
  301. for (int i = 1; i <= fa[1].model_nbr; i++)
  302. {
  303. warning_level = max(warning_level, fa_get_warning_level(i));
  304. }
  305. if (ems_fire_warning_level != warning_level)
  306. {
  307. if (warning_level > 1) // 1级以上,排风
  308. {
  309. dido_fan_switch(1, 1);
  310. if (warning_level > 2) // 2级以上,报警,停机,准备灭火
  311. {
  312. ess_send_sm_cmd(CMD_SM_STDBY);
  313. dido_sys_alarm(1, 1);
  314. dido_fire_confirm(1, 1);
  315. if (warning_level > 3) // 三级以上,灭火
  316. {
  317. for (int j = 1; j <= fa[1].model_nbr; j++)
  318. {
  319. if (fa_get_warning_level(j) > 3)
  320. {
  321. fe_set_start(j);
  322. }
  323. }
  324. }
  325. }
  326. else
  327. {
  328. dido_sys_alarm(1, 0);
  329. dido_fire_confirm(1, 0);
  330. }
  331. }
  332. else
  333. {
  334. dido_fan_switch(1, 0);
  335. }
  336. }
  337. // env_get_co_density(DEVM_CD1F3300,1);
  338. // env_get_co_threshold(DEVM_CD1F3300,1);
  339. }
  340. int ems_edit_pcurv(int starthh, int startnn, int endhh, int endnn, int aps)
  341. {
  342. int ret = 0;
  343. struct pcurv_t *pc = &ems.pcurv;
  344. int curr_hh;
  345. int curr_nn;
  346. log_dbg("%s, starthh:%d startnn:%d endhh:%d endnn:%d aps:%d",
  347. __func__, starthh, startnn, endhh, endnn, aps);
  348. if (starthh < 0 || starthh > 24 || endhh < 0 || endhh > 24 || startnn < 0 || startnn >= 60 || endnn < 0 || endnn >= 60)
  349. {
  350. ret = -1;
  351. goto leave;
  352. }
  353. if ((starthh == 24 && startnn != 0) || (endhh == 24 && endnn != 0))
  354. {
  355. ret = -2;
  356. goto leave;
  357. }
  358. curr_hh = starthh;
  359. curr_nn = startnn;
  360. while (curr_hh < endhh || curr_nn < endnn)
  361. {
  362. pc->aps[curr_hh][curr_nn] = aps;
  363. curr_nn += 60 / PCURV_PTS_PERHOUR;
  364. if (curr_nn >= 60)
  365. {
  366. curr_hh += 1;
  367. curr_nn = 0;
  368. }
  369. }
  370. leave:
  371. log_dbg("%s, ret:%d", __func__, ret);
  372. return ret;
  373. }
  374. int ems_load_params()
  375. {
  376. int ret = 0;
  377. int rc;
  378. char *errmsg = NULL;
  379. sqlite3 *db = NULL;
  380. char sql[1024];
  381. struct dbcbparam_t cbparam;
  382. struct ems_t *dev = &ems;
  383. plt_lock_projdb();
  384. db = plt_get_projdb();
  385. sprintf(sql, "select * from ems");
  386. cbparam.nrow = 0;
  387. rc = sqlite3_exec(db, sql, ems_dbcb_0, (void *)&cbparam, &errmsg);
  388. plt_unlock_projdb();
  389. if (rc != SQLITE_OK)
  390. {
  391. log_dbg("%s, result != SQLITE_OK", __func__);
  392. ret = -1;
  393. }
  394. else if (cbparam.ret != 0)
  395. {
  396. log_dbg("%s, cbparam.ret != 0", __func__);
  397. ret = -1;
  398. }
  399. else
  400. {
  401. if (cbparam.nrow != 1)
  402. {
  403. log_dbg("%s, cbparam.nrow(%d) != 1", __func__, cbparam.nrow);
  404. ret = -1;
  405. }
  406. else
  407. {
  408. dev->pow_reg.timer = 0;
  409. // ems.last_pcurv_aps = 999999999;
  410. ems_set_mode(EMSMOD_NONE);
  411. ems_set_pcurv(dev->pcurv_idx);
  412. }
  413. }
  414. log_dbg("%s, ret:%d", __func__, ret);
  415. return ret;
  416. }
  417. int ems_init()
  418. {
  419. struct ems_t *e = &ems;
  420. syslog(LOG_INFO, "%s, ++", __func__);
  421. memset(&STA, 0, sizeof(struct station_t)); // !! NOTE !!
  422. e->transf_conm_com_ae = 0.0;
  423. e->transf_conm_pos_ae = 0.0;
  424. e->transf_conm_neg_ae = 0.0;
  425. e->transf_loadm_com_ae = 0.0;
  426. e->transf_loadm_pos_ae = 0.0;
  427. e->transf_loadm_neg_ae = 0.0;
  428. e->factory_conm_com_ae = 0.0;
  429. e->factory_conm_pos_ae = 0.0;
  430. e->factory_conm_neg_ae = 0.0;
  431. e->factory_loadm_com_ae = 0.0;
  432. e->factory_loadm_pos_ae = 0.0;
  433. e->factory_loadm_neg_ae = 0.0;
  434. e->debug_mode = 0;
  435. ems_sm_init();
  436. syslog(LOG_INFO, "%s, --", __func__);
  437. /*
  438. int ret = 0;
  439. int rc;
  440. char *errmsg = NULL;
  441. sqlite3* db = STA.cfg_db;
  442. char sql[1024];
  443. struct dbcbparam_t cbparam;
  444. struct ems_t* ems = &ems;
  445. sprintf(sql,"select * from ems");
  446. cbparam.nrow = 0;
  447. rc = sqlite3_exec(db,sql, ems_dbcb_0,(void*)&cbparam,&errmsg);
  448. if( rc != SQLITE_OK ){
  449. log_dbg("%s, result != SQLITE_OK", __func__ );
  450. ret = -1;
  451. }else if( cbparam.ret != 0){
  452. log_dbg("%s, cbparam.ret != 0", __func__ );
  453. ret = -1;
  454. }else{
  455. if( cbparam.nrow != 1 ){
  456. log_dbg("%s, cbparam.nrow(%d) != 1", __func__, cbparam.nrow );
  457. ret = -1;
  458. }else{
  459. ems.pow_reg.timer = 0;
  460. ems.last_pcurv_aps = 999999999;
  461. ems_set_mode(EMSMOD_NONE);
  462. ems_set_pdmode(PDMOD_AVG);
  463. ems_set_pcurv(ems->pcurv_idx );
  464. }
  465. }
  466. log_dbg("%s, ret:%d", __func__, ret);
  467. return ret;
  468. */
  469. }
  470. static void * ems_aux_task()
  471. {
  472. while (1)
  473. {
  474. mac_exe();
  475. cloud_exe();
  476. tb_exe();
  477. // snap_exe();
  478. ev_exe();
  479. estats_exe();
  480. power_detection_exe();
  481. task_exe();
  482. usleep(950000); // 950ms
  483. }
  484. return NULL;
  485. }
  486. int ems_get_debug_mode()
  487. {
  488. struct ems_t *e = &ems;
  489. return e->debug_mode;
  490. }
  491. int ems_set_debug_mode(int mode)
  492. {
  493. struct ems_t *e = &ems;
  494. e->debug_mode = mode;
  495. }
  496. int ems_start_aux()
  497. {
  498. int ret = 0;
  499. pthread_t xthrd;
  500. if (pthread_create(&xthrd, NULL, ems_aux_task, NULL) != 0)
  501. {
  502. ret = -1;
  503. log_dbg("%s, create ems_aux_task fail", __func__);
  504. }
  505. return ret;
  506. }
  507. int ems_regulate_aps(int newaps)
  508. {
  509. int aps = ess_get_aps();
  510. int ess_ap = ess_get_ap();
  511. int norm_p = ess_get_norm_pow();
  512. // int lastaps = ess_get_last_aps();
  513. int con_ap;
  514. int reg_lo = ems_get_reglo();
  515. int reg_hi = ems_get_reghi();
  516. int tgtaps = 0;
  517. int *maxaps = &ems.pow_reg.aps_max;
  518. int *minaps = &ems.pow_reg.aps_min;
  519. int regaps = 0;
  520. if (ems_get_regulate_en() == 0)
  521. {
  522. return newaps;
  523. }
  524. if (aps > 0)
  525. { // dhg
  526. if (ems_get_factory_conm_idx() > 0)
  527. {
  528. con_ap = ems_get_factory_con_com_ap();
  529. }
  530. else
  531. {
  532. con_ap = ems_get_transf_con_com_ap();
  533. }
  534. log_info("%s, con_ap:%d aps:%d ess ap:%d reg_lo:%d norm_pow:%d", __func__, con_ap, aps, ess_ap, reg_lo, norm_p);
  535. if (newaps <= 0)
  536. {
  537. regaps = 0;
  538. }
  539. else
  540. {
  541. *maxaps = min(con_ap + ess_ap - reg_lo, norm_p); // max dhg power the ess can run
  542. if (*maxaps < 0)
  543. {
  544. *maxaps = 0;
  545. }
  546. if (con_ap < reg_lo)
  547. {
  548. tgtaps = ess_ap + (con_ap - reg_lo);
  549. if (tgtaps < 0)
  550. {
  551. tgtaps = 0;
  552. }
  553. regaps = min(min(*maxaps, tgtaps), newaps);
  554. }
  555. else
  556. {
  557. regaps = min(*maxaps, newaps);
  558. }
  559. }
  560. log_info("%s, con_ap:%d aps:%d ess ap:%d newaps:%d,reg_hi:%d norm_pow:%d,regaps:%d", __func__, con_ap, aps, ess_ap, newaps, reg_hi, norm_p, regaps);
  561. }
  562. else if (aps < 0)
  563. { // chg
  564. con_ap = ems_get_transf_con_com_ap();
  565. log_info("%s, con_ap:%d aps:%d ess ap:%d reg_hi:%d norm_pow:%d", __func__, con_ap, aps, ess_ap, reg_hi, norm_p);
  566. if (newaps >= 0)
  567. {
  568. regaps = 0;
  569. }
  570. else
  571. {
  572. *minaps = max(0 - reg_hi + (con_ap + ess_ap), 0 - norm_p); // max chg power the ess can run
  573. if (*minaps > 0)
  574. {
  575. *minaps = 0;
  576. }
  577. con_ap = ems_get_transf_con_com_ap();
  578. if (con_ap > reg_hi)
  579. {
  580. tgtaps = ess_ap + (con_ap - reg_hi);
  581. if (tgtaps > 0)
  582. {
  583. tgtaps = 0;
  584. }
  585. regaps = max(*minaps, tgtaps);
  586. }
  587. else
  588. {
  589. regaps = max(*minaps, newaps);
  590. }
  591. }
  592. log_info("%s, con_ap:%d aps:%d ess ap:%d newaps:%d,reg_hi:%d norm_pow:%d,regaps:%d", __func__, con_ap, aps, ess_ap, newaps, reg_hi, norm_p, regaps);
  593. }
  594. else
  595. { // ready
  596. if (newaps > 0)
  597. {
  598. if (ems_get_factory_conm_idx() > 0)
  599. {
  600. con_ap = ems_get_factory_con_com_ap();
  601. }
  602. else
  603. {
  604. con_ap = ems_get_transf_con_com_ap();
  605. }
  606. *maxaps = min(con_ap + ess_ap - reg_lo, norm_p); // max dhg power the ess can run
  607. if (*maxaps < 0)
  608. {
  609. *maxaps = 0;
  610. }
  611. regaps = min(*maxaps, newaps);
  612. }
  613. else if (newaps < 0)
  614. {
  615. con_ap = ems_get_transf_con_com_ap();
  616. *minaps = max(0 - reg_hi + (con_ap + ess_ap), 0 - norm_p); // max chg power the ess can run
  617. if (*minaps > 0)
  618. {
  619. *minaps = 0;
  620. }
  621. regaps = max(*minaps, newaps);
  622. }
  623. else
  624. {
  625. regaps = 0;
  626. }
  627. log_info("%s, con_ap:%d aps:%d ess ap:%d newaps:%d,reg_hi:%d norm_pow:%d,regaps:%d", __func__, con_ap, aps, ess_ap, newaps, reg_hi, norm_p, regaps);
  628. }
  629. return regaps;
  630. }
  631. /*
  632. distribute sta active_p_set to each ctn
  633. 0 : success
  634. */
  635. int ems_sta_aps_dis(void)
  636. {
  637. struct station_t *dev = &STA;
  638. double sum;
  639. int aps[CESS2000_NBR_MAX + 1];
  640. // int total_aps = dev->pow.active_p_set;
  641. int idx;
  642. int ret = 0;
  643. #if 0
  644. if( dev->ems.pdmode == PDMOD_SOC ){ /* bugs , do not use !! */
  645. if( total_aps > 0 ){ // dhg
  646. sum = 0.0;
  647. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  648. sum += ctn_get_soc(idx);
  649. }
  650. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  651. aps[idx] = ctn_get_soc(idx)/sum*total_aps;
  652. }
  653. }else if( total_aps < 0 ){ // chg
  654. sum = 0.0;
  655. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  656. sum += 1 - ctn_get_soc(idx);
  657. }
  658. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  659. aps[idx] = (1 - ctn_get_soc(idx))/sum*total_aps;
  660. }
  661. }else{
  662. ret = -1;
  663. }
  664. }else if( dev->ems.pdmode == PDMOD_AVG ){
  665. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  666. aps[idx] = total_aps/(double)ctn_get_nbr();
  667. }
  668. if(aps[1] < ctn_get_min_pow(1) && aps[1] > -ctn_get_min_pow(1)){
  669. ret = -1;
  670. }
  671. }else{
  672. ret = -1;
  673. }
  674. if( ret == 0 ){
  675. for( idx = 1; idx <= ctn_get_nbr(); idx++ ){
  676. //dev->ctn[idx].pow.active_p_set = aps[idx];
  677. ctn_set_aps( idx, aps[idx] );
  678. }
  679. }
  680. #endif
  681. return ret;
  682. }
  683. int ems_set_pcurv(int idx)
  684. {
  685. pcurv_load(idx);
  686. ems.pcurv = pcurv_get(idx);
  687. ems.pcurv_idx = idx;
  688. return 0;
  689. }
  690. int ems_save_pcurv()
  691. {
  692. return pcurv_save(ems.pcurv_idx, ems.pcurv);
  693. }
  694. int ems_reset_pcurv()
  695. {
  696. int ret = 0;
  697. int pidx = ems.pcurv_idx;
  698. pcurv_reset(pidx);
  699. ems_set_pcurv(pidx);
  700. return 0;
  701. }
  702. int ems_set_powreg_highlow(int hi, int lo)
  703. {
  704. ems.pow_reg.high = hi;
  705. ems.pow_reg.low = lo;
  706. return 0;
  707. }
  708. int ems_get_pcurv_pts()
  709. {
  710. int ret = -1;
  711. struct ems_t *dev = &ems;
  712. int pidx = dev->pcurv_idx;
  713. struct pcurv_t *pc = &dev->pcurv;
  714. time_t timep;
  715. struct tm *tsp;
  716. int hh, nn;
  717. if (pidx >= 1 && pidx <= PCURV_NBR_MAX && pc->status == PCURVST_VALID)
  718. {
  719. time(&timep);
  720. tsp = localtime(&timep);
  721. hh = tsp->tm_hour;
  722. nn = tsp->tm_min / (int)5 * (int)5;
  723. dev->pcurv_aps = pc->aps[hh][nn];
  724. ret = 0;
  725. }
  726. return ret;
  727. }
  728. int ems_get_pcurv_aps()
  729. {
  730. struct ems_t *dev = &ems;
  731. return dev->pcurv_aps;
  732. }
  733. int ems_get_regulate_en()
  734. {
  735. return ems.pow_reg.enable;
  736. }
  737. int ems_set_reg_en(int val)
  738. {
  739. ems.pow_reg.enable = val;
  740. return 0;
  741. }
  742. int ems_set_reg_intv(int val)
  743. {
  744. ems.pow_reg.intv = val;
  745. return 0;
  746. }
  747. int ems_get_cmd()
  748. {
  749. return ems.cmd;
  750. }
  751. void ems_reset_cmd()
  752. {
  753. ems.cmd = CMD_SM_DONE;
  754. }
  755. int ems_send_sm_cmd(int val)
  756. {
  757. ems.cmd = val;
  758. return 0;
  759. }
  760. int ems_get_mode(void)
  761. {
  762. return ems.mode;
  763. }
  764. char *ems_get_state_str(void)
  765. {
  766. return ems.sm.szState;
  767. }
  768. char *ems_get_modestr(void)
  769. {
  770. return ems.szmode;
  771. }
  772. int ems_set_mode(int mod)
  773. {
  774. int ret = 0;
  775. switch (mod)
  776. {
  777. case EMSMOD_NONE:
  778. strcpy(ems.szmode, "none");
  779. break;
  780. case EMSMOD_PCURV:
  781. ems.last_pcurv_aps = 999999;
  782. strcpy(ems.szmode, "pcurv");
  783. break;
  784. case EMSMOD_PDEM:
  785. strcpy(ems.szmode, "pdem");
  786. break;
  787. default:
  788. strcpy(ems.szmode, "unknown");
  789. ret = -1;
  790. break;
  791. }
  792. ems.mode = mod;
  793. log_dbg("%s, mode:%d|%s", __func__, ems.mode, ems.szmode);
  794. return ret;
  795. }
  796. void ems_exe_pcurv()
  797. {
  798. struct ems_t *dev = &ems;
  799. if (++dev->pow_reg.timer >= dev->pow_reg.intv)
  800. {
  801. dev->pow_reg.timer = 0;
  802. if (ems_get_pcurv_pts() == 0)
  803. { // valid pts
  804. ess_set_aps(ems_regulate_aps(dev->pcurv_aps));
  805. }
  806. }
  807. }
  808. void ems_exe_pdem()
  809. {
  810. struct ems_t *dev = &ems;
  811. }
  812. int ems_get_reglo()
  813. {
  814. return ems.pow_reg.low;
  815. }
  816. int ems_get_reghi()
  817. {
  818. return ems.pow_reg.high;
  819. }
  820. int ems_set_timeseg(int idx)
  821. {
  822. int ret = 0;
  823. int rc;
  824. if (timeseg_load(idx) != 0)
  825. {
  826. ret = -1;
  827. }
  828. else
  829. {
  830. ems.timeseg = timeseg_get(idx);
  831. ems.timeseg_idx = idx;
  832. ems_update_cur_timeseg_type();
  833. }
  834. return ret;
  835. }
  836. int ems_save_timeseg()
  837. {
  838. return timeseg_save(ems.timeseg_idx, ems.timeseg);
  839. }
  840. int ems_reset_timeseg()
  841. {
  842. int ret = 0;
  843. int idx = ems.timeseg_idx;
  844. timeseg_reset(idx);
  845. ems_set_timeseg(idx);
  846. return 0;
  847. }
  848. int ems_get_cur_timeseg_type()
  849. {
  850. struct ems_t *dev = &ems;
  851. return dev->cur_timeseg_type;
  852. }
  853. int ems_get_tick()
  854. {
  855. struct ems_t *dev = &ems;
  856. struct statemachine_t *sm = &dev->sm;
  857. return sm->tick;
  858. }
  859. int ems_get_tick_ave()
  860. {
  861. struct ems_t *dev = &ems;
  862. struct statemachine_t *sm = &dev->sm;
  863. return sm->timing_ave;
  864. }
  865. int ems_get_tick_cur()
  866. {
  867. struct ems_t *dev = &ems;
  868. struct statemachine_t *sm = &dev->sm;
  869. return sm->timing_cur;
  870. }
  871. int ems_get_tick_max()
  872. {
  873. struct ems_t *dev = &ems;
  874. struct statemachine_t *sm = &dev->sm;
  875. return sm->timing_max;
  876. }
  877. int ems_get_step()
  878. {
  879. struct ems_t *dev = &ems;
  880. struct statemachine_t *sm = &dev->sm;
  881. return sm_get_step(sm);
  882. }
  883. char *ems_get_err_str()
  884. {
  885. struct ems_t *dev = &ems;
  886. struct statemachine_t *sm = &dev->sm;
  887. return sm->szerr;
  888. }
  889. int ems_get_pow_reg_timer()
  890. {
  891. return ems.pow_reg.timer;
  892. }
  893. int ems_get_pow_reg_intv()
  894. {
  895. return ems.pow_reg.intv;
  896. }
  897. int ems_get_pow_reg_aps_min()
  898. {
  899. return ems.pow_reg.aps_min;
  900. }
  901. int ems_get_pow_reg_aps_max()
  902. {
  903. return ems.pow_reg.aps_max;
  904. }
  905. int ems_get_timeseg_idx()
  906. {
  907. return ems.timeseg_idx;
  908. }
  909. char *ems_get_timeseg_status_str()
  910. {
  911. return ems.timeseg.szstatus;
  912. }
  913. char *ems_get_timeseg_type_str()
  914. {
  915. return timeseg_segtype2string(ems.cur_timeseg_type);
  916. }
  917. int ems_get_estats_step()
  918. {
  919. return ems.estats.step;
  920. }
  921. double ems_get_day_sharp_pos_ae()
  922. {
  923. return ems.estats.day_sharp_pos_ae;
  924. }
  925. double ems_get_day_sharp_neg_ae()
  926. {
  927. return ems.estats.day_sharp_neg_ae;
  928. }
  929. double ems_get_day_peak_pos_ae()
  930. {
  931. return ems.estats.day_peak_pos_ae;
  932. }
  933. double ems_get_day_peak_neg_ae()
  934. {
  935. return ems.estats.day_peak_neg_ae;
  936. }
  937. double ems_get_day_flat_pos_ae()
  938. {
  939. return ems.estats.day_flat_pos_ae;
  940. }
  941. double ems_get_day_flat_neg_ae()
  942. {
  943. return ems.estats.day_flat_neg_ae;
  944. }
  945. double ems_get_day_valley_pos_ae()
  946. {
  947. return ems.estats.day_valley_pos_ae;
  948. }
  949. double ems_get_day_valley_neg_ae()
  950. {
  951. return ems.estats.day_valley_neg_ae;
  952. }
  953. int ems_get_pcurv_idx()
  954. {
  955. return ems.pcurv_idx;
  956. }
  957. char *ems_get_pcurv_info_str()
  958. {
  959. return ems.pcurv.szinfo;
  960. }
  961. char *ems_get_pcurv_status_str()
  962. {
  963. return ems.pcurv.szstatus;
  964. }
  965. struct pcurv_t *ems_get_pcurv_t()
  966. {
  967. return &ems.pcurv;
  968. }
  969. int ems_get_tool_data(char *buf)
  970. {
  971. char buf_temp[2 << 16];
  972. struct statemachine_t *sm = &ems.sm;
  973. struct estats_t *es = &ems.estats;
  974. if (buf == NULL)
  975. return -1;
  976. sprintf(buf, "%s ", "" REVERSE " EMS " NONE " \n");
  977. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  978. strcat(buf, buf_temp);
  979. strcat(buf, "\n");
  980. sprintf(buf_temp, "ems_debug:%d pow_reg_en:%d lo:%d hi:%d timer:%03d intv:%03d aps_min:%d max:%d ",
  981. ems.debug_mode, ems.pow_reg.enable, ems.pow_reg.low, ems.pow_reg.high, ems.pow_reg.timer, ems.pow_reg.intv, ems.pow_reg.aps_min, ems.pow_reg.aps_max);
  982. strcat(buf, buf_temp);
  983. if (ems.factory_conm_idx > 0)
  984. {
  985. sprintf(buf_temp, "\n factory conm_model:%s conm_idx:%d conm_com_ap:" L_GREEN "%d" NONE " conm_com_ae:%.1f con_pos_ae:%.1f con_neg_ae:%.1f\
  986. load_com_ap:%d load_com_ae:%.1f load_pos_ae:%.1f load_neg_ae:%.1f\n",
  987. ems.szfactory_conm_model, ems.factory_conm_idx, ems.factory_con_ap, ems.factory_conm_com_ae, ems.factory_conm_pos_ae, ems.factory_conm_neg_ae,
  988. ems.factory_loadm_com_ap, ems.factory_loadm_com_ae, ems.factory_loadm_pos_ae, ems.factory_loadm_neg_ae);
  989. strcat(buf, buf_temp);
  990. }
  991. if (ems.transf_conm_idx > 0)
  992. {
  993. sprintf(buf_temp, " transf conm_model:%s conm_idx:%d conm_com_ap:" L_GREEN "%d" NONE " conm_com_ae:%.1f con_pos_ae:%.1f con_neg_ae:%.1f\
  994. load_com_ap:%d load_com_ae:%.1f load_pos_ae:%.1f load_neg_ae:%.1f\n",
  995. ems.sztransf_conm_model, ems.transf_conm_idx, ems.transf_con_ap, ems.transf_conm_com_ae, ems.transf_conm_pos_ae, ems.transf_conm_neg_ae,
  996. ems.transf_loadm_com_ap, ems.transf_loadm_com_ae, ems.transf_loadm_pos_ae, ems.transf_loadm_neg_ae);
  997. strcat(buf, buf_temp);
  998. }
  999. else if (ems.transf_loadm_idx > 0)
  1000. {
  1001. sprintf(buf_temp, " transf loadm_model:%s loadm_idx:%d load_com_ap:%d load_com_ae:%.1f load_pos_ae:%.1f load_neg_ae:%.1f\
  1002. conm_com_ap:" L_GREEN "%d" NONE " conm_com_ae:%.1f con_pos_ae:%.1f con_neg_ae:%.1f\n",
  1003. ems.sztransf_loadm_model, ems.transf_loadm_idx, ems.transf_loadm_com_ap, ems.transf_loadm_com_ae, ems.transf_loadm_pos_ae, ems.transf_loadm_neg_ae,
  1004. ems.transf_con_ap, ems.transf_conm_com_ae, ems.transf_conm_pos_ae, ems.transf_conm_neg_ae);
  1005. strcat(buf, buf_temp);
  1006. }
  1007. // strcat(buf,buf_temp);
  1008. sprintf(buf_temp, " mod:" L_GREEN "%s" NONE " pcurv_idx:%d stat:%s aps:%d timeseg_idx:%d status:%s segtype:%d-%s\n",
  1009. ems.szmode, ems.pcurv_idx, ems.pcurv.szstatus, ems.pcurv_aps, ems.timeseg_idx, ems.timeseg.szstatus, ems.cur_timeseg_type, timeseg_segtype2string(ems.cur_timeseg_type));
  1010. strcat(buf, buf_temp);
  1011. sprintf(buf_temp, " estats step:%d day_sharp_pos_ae:%.1f neg:%.1f peak_pos_ae:%.1f neg:%.1f flat_pos_ae:%.1f neg:%.1f valley_pos_ae:%.1f neg:%.1f\n",
  1012. es->step,
  1013. es->day_sharp_pos_ae, es->day_sharp_neg_ae,
  1014. es->day_peak_pos_ae, es->day_peak_neg_ae,
  1015. es->day_flat_pos_ae, es->day_flat_neg_ae,
  1016. es->day_valley_pos_ae, es->day_valley_neg_ae);
  1017. strcat(buf, buf_temp);
  1018. return 0;
  1019. }
  1020. int ems_get_tool_pcurv_data(char *buf)
  1021. {
  1022. int i;
  1023. int j;
  1024. struct pcurv_t *pc = &ems.pcurv;
  1025. int hh;
  1026. int nn;
  1027. int rows = 12;
  1028. int cols = PCURV_PTS_NBR / rows;
  1029. char temp_buf[128];
  1030. char temp_buf2[128];
  1031. char sztime[32];
  1032. misc_gen_datetimestr(sztime, sizeof(sztime));
  1033. sprintf(buf, "" REVERSE " PCURV " NONE " idx:%d stat:%s %s\n", ems.pcurv_idx, ems.pcurv.szstatus, sztime);
  1034. for (i = 0; i < 24; i++)
  1035. { /* 24 rows in total, 1 hour 1 row */
  1036. hh = i;
  1037. for (j = 0; j < PCURV_PTS_PERHOUR; j++)
  1038. {
  1039. nn = j * (60 / PCURV_PTS_PERHOUR);
  1040. sprintf(temp_buf, "%02d:%02d " L_GREEN "%5d" NONE " ", hh, nn, pc->aps[hh][nn]);
  1041. sprintf(temp_buf2, "%-12s", temp_buf);
  1042. strcat(buf, temp_buf2);
  1043. }
  1044. strcat(buf, "\n");
  1045. }
  1046. return 0;
  1047. }
  1048. int ems_get_tool_timeseg_data(char *buf)
  1049. {
  1050. int i;
  1051. int j;
  1052. struct timeseg_t *ts = &ems.timeseg;
  1053. int hh;
  1054. int nn;
  1055. int rows = 12;
  1056. int cols = TIMESEG_PTS_NBR / rows;
  1057. char temp_buf[128];
  1058. char temp_buf2[128];
  1059. char sztime[32];
  1060. misc_gen_datetimestr(sztime, sizeof(sztime));
  1061. sprintf(buf, "" REVERSE " TIMESEG " NONE " idx:%d stat:%s %s\n", ems.timeseg_idx, ems.timeseg.szstatus, sztime);
  1062. for (i = 0; i < 24; i++)
  1063. { /* 24 rows in total, 1 hour 1 row */
  1064. hh = i;
  1065. for (j = 0; j < TIMESEG_PTS_PERHOUR; j++)
  1066. {
  1067. nn = j * (60 / TIMESEG_PTS_PERHOUR);
  1068. sprintf(temp_buf, "%02d:%02d " L_GREEN "%5s" NONE " ", hh, nn, timeseg_segtype2string(ts->seg_type[hh][nn]));
  1069. sprintf(temp_buf2, "%-12s", temp_buf);
  1070. strcat(buf, temp_buf2);
  1071. }
  1072. strcat(buf, "\n");
  1073. }
  1074. }
  1075. char *ems_get_transf_conm_model_str()
  1076. {
  1077. return ems.sztransf_conm_model;
  1078. }
  1079. int ems_get_transf_conm_idx()
  1080. {
  1081. return ems.transf_conm_idx;
  1082. }
  1083. int ems_get_transf_con_ap()
  1084. {
  1085. struct ems_t *dev = &ems;
  1086. return dev->transf_con_ap;
  1087. }
  1088. double ems_get_transf_con_com_ae()
  1089. {
  1090. struct ems_t *e = &ems;
  1091. return e->transf_conm_com_ae;
  1092. }
  1093. double ems_get_transf_con_pos_ae()
  1094. {
  1095. struct ems_t *e = &ems;
  1096. return e->transf_conm_pos_ae;
  1097. }
  1098. double ems_get_transf_con_neg_ae()
  1099. {
  1100. struct ems_t *e = &ems;
  1101. return e->transf_conm_neg_ae;
  1102. }
  1103. int ems_get_transf_con_com_ap()
  1104. {
  1105. return ems.transf_conm_com_ap;
  1106. }
  1107. char *ems_get_transf_load_model_str()
  1108. {
  1109. return ems.sztransf_loadm_model;
  1110. }
  1111. int ems_get_transf_loadm_idx()
  1112. {
  1113. return ems.transf_loadm_idx;
  1114. }
  1115. int ems_get_transf_load_ap()
  1116. {
  1117. struct ems_t *dev = &ems;
  1118. return dev->transf_load_ap;
  1119. }
  1120. double ems_get_transf_load_com_ae()
  1121. {
  1122. struct ems_t *e = &ems;
  1123. return e->transf_loadm_com_ae;
  1124. }
  1125. double ems_get_transf_load_pos_ae()
  1126. {
  1127. struct ems_t *e = &ems;
  1128. return e->transf_loadm_pos_ae;
  1129. }
  1130. double ems_get_transf_load_neg_ae()
  1131. {
  1132. struct ems_t *e = &ems;
  1133. return e->transf_loadm_neg_ae;
  1134. }
  1135. int ems_get_transf_load_com_ap()
  1136. {
  1137. struct ems_t *e = &ems;
  1138. return e->transf_loadm_com_ap;
  1139. }
  1140. char *ems_get_factory_conm_model_str()
  1141. {
  1142. return ems.szfactory_conm_model;
  1143. }
  1144. int ems_get_factory_conm_idx()
  1145. {
  1146. return ems.factory_conm_idx;
  1147. }
  1148. int ems_get_factory_con_ap()
  1149. {
  1150. struct ems_t *dev = &ems;
  1151. return dev->factory_con_ap;
  1152. }
  1153. double ems_get_factory_con_com_ae()
  1154. {
  1155. struct ems_t *e = &ems;
  1156. return e->factory_conm_com_ae;
  1157. }
  1158. double ems_get_factory_con_pos_ae()
  1159. {
  1160. struct ems_t *e = &ems;
  1161. return e->factory_conm_pos_ae;
  1162. }
  1163. double ems_get_factory_con_neg_ae()
  1164. {
  1165. struct ems_t *e = &ems;
  1166. return e->factory_conm_neg_ae;
  1167. }
  1168. int ems_get_factory_con_com_ap()
  1169. {
  1170. return ems.factory_conm_com_ap;
  1171. }
  1172. char *ems_get_factory_load_model_str()
  1173. {
  1174. return ems.szfactory_loadm_model;
  1175. }
  1176. int ems_get_factory_loadm_idx()
  1177. {
  1178. return ems.factory_loadm_idx;
  1179. }
  1180. int ems_get_factory_load_ap()
  1181. {
  1182. struct ems_t *dev = &ems;
  1183. return dev->factory_load_ap;
  1184. }
  1185. double ems_get_factory_load_com_ae()
  1186. {
  1187. struct ems_t *e = &ems;
  1188. return e->factory_loadm_com_ae;
  1189. }
  1190. double ems_get_factory_load_pos_ae()
  1191. {
  1192. struct ems_t *e = &ems;
  1193. return e->factory_loadm_pos_ae;
  1194. }
  1195. double ems_get_factory_load_neg_ae()
  1196. {
  1197. struct ems_t *e = &ems;
  1198. return e->factory_loadm_neg_ae;
  1199. }
  1200. int ems_get_factory_load_com_ap()
  1201. {
  1202. struct ems_t *e = &ems;
  1203. return e->factory_loadm_com_ap;
  1204. }