ups_monitor.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module ups_monitor
  3. * @file ups_monitor.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief Template
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "stm32f4xx.h"
  13. #include "ups_monitor.h"
  14. #include "parameters.h"
  15. #include "settings_api.h"
  16. #include "megatec.h"
  17. #include "led.h"
  18. #include "log.h"
  19. #include "FreeRTOS.h"
  20. #include "task.h"
  21. #include "trap_api.h"
  22. #include "snmp_api.h"
  23. #include <stdbool.h>
  24. bool flCriticalAlarm = false;
  25. bool flNonCriticalAlarm = false;
  26. /**
  27. * @brief Общая структура настроек
  28. */
  29. extern SETTINGS_t sSettings;
  30. extern bool flUpdateLog;
  31. /**
  32. * @brief Задача мониторинга параметров UPS
  33. */
  34. void UPS_Monitor(void *params)
  35. {
  36. vTaskDelay(5000);
  37. for (;;)
  38. {
  39. flCriticalAlarm = false;
  40. flNonCriticalAlarm = false;
  41. // Проверяем флаг подключения UPS
  42. if (UPS.Present)
  43. {
  44. UPS_TestFinishMonitor();
  45. UPS_LineFailMonitor();
  46. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  47. UPS_VACoutputLowRangeMonitor();
  48. UPS_VACoutputHighRangeMonitor();
  49. #endif
  50. UPS_LowBatMonitor();
  51. UPS_PowerMonitor();
  52. UPS_TemperatureHighRangeMonitor();
  53. UPS_TemperatureLowRangeMonitor();
  54. UPS_BatteryConnectMonitor();
  55. }
  56. UPS_ConnectMonitor();
  57. #ifndef HARDWARE_BT6708
  58. UPS_DI0Monitor();
  59. #endif
  60. #ifdef HARDWARE_BT6702
  61. UPS_CriticalAlarmMonitor();
  62. UPS_NonCriticalAlarmMonitor();
  63. #endif
  64. vTaskDelay(1000);
  65. }
  66. }
  67. #ifndef HARDWARE_BT6708
  68. /**
  69. * @brief Мониторинг бита DI0 state
  70. */
  71. void UPS_DI0Monitor(void)
  72. {
  73. static bool isValueRecv = false;
  74. static uint8_t DI0OldState = 0;
  75. uint8_t DI0StateCurrent;
  76. DI0StateCurrent = get_state_din_outs(DIN1) ^ sSettings.sInOuts.din_type_act[0];
  77. UPS.Alarm = (UPS.Alarm & 0x0f) | (DI0StateCurrent << 4);
  78. if (!isValueRecv) {
  79. isValueRecv = true;
  80. DI0OldState = DI0StateCurrent;
  81. if (DI0StateCurrent){
  82. log_event_data(LOG_ALARM_DIO, "Авария");
  83. SNMP_SendUserTrap(DI0_ALARM);
  84. flUpdateLog = true;
  85. }
  86. else{
  87. log_event_data(LOG_ALARM_DIO, "Норма");
  88. SNMP_SendUserTrap(DI0_NORM);
  89. flUpdateLog = true;
  90. }
  91. return;
  92. }
  93. /*if (DI0StateCurrent)
  94. flCriticalAlarm = true;*/
  95. // Значение параметра изменилось
  96. if (DI0StateCurrent != DI0OldState)
  97. {
  98. if (!DI0StateCurrent){
  99. log_event_data(LOG_ALARM_DIO, "Норма");
  100. SNMP_SendUserTrap(DI0_NORM);
  101. flUpdateLog = true;
  102. }
  103. else{
  104. log_event_data(LOG_ALARM_DIO, "Авария");
  105. SNMP_SendUserTrap(DI0_ALARM);
  106. flUpdateLog = true;
  107. }
  108. }
  109. DI0OldState = DI0StateCurrent;
  110. }
  111. void relay_setup_log(uint8_t *curr_source, ro_type_source_t src_act_ro, uint8_t state_relay)
  112. {
  113. uint8_t i = 0;
  114. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  115. if(curr_source[i] == src_act_ro){
  116. SetROInt(state_relay, i);
  117. SNMP_SendUserTrap((DO0_TOGGLED+i));
  118. if(state_relay){
  119. flUpdateLog = true;
  120. #if defined HARDWARE_BT6706
  121. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  122. #elif HARDWARE_BT6702
  123. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  124. #endif
  125. }
  126. else{
  127. flUpdateLog = true;
  128. #if defined HARDWARE_BT6706
  129. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  130. #elif HARDWARE_BT6702
  131. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  132. #endif
  133. }
  134. }
  135. }
  136. }
  137. void relay_setup_log_change(uint8_t *curr_source, uint8_t *prev_source, ro_type_source_t src_act_ro)
  138. {
  139. uint8_t i = 0;
  140. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  141. if(curr_source[i] != prev_source[i] && (prev_source[i] == src_act_ro || curr_source[i] == src_act_ro)){
  142. #if defined HARDWARE_BT6706
  143. if(curr_source[i] != src_act_ro){
  144. flUpdateLog = true;
  145. SetROInt(0, i);
  146. SNMP_SendUserTrap((DO0_TOGGLED+i));
  147. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  148. }
  149. else{
  150. flUpdateLog = true;
  151. SetROInt(1, i);
  152. SNMP_SendUserTrap((DO0_TOGGLED+i));
  153. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  154. }
  155. #elif HARDWARE_BT6702
  156. if(curr_source[i] != src_act_ro){
  157. flUpdateLog = true;
  158. SetROInt(0, i);
  159. SNMP_SendUserTrap((DO0_TOGGLED+i));
  160. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  161. }
  162. else{
  163. flUpdateLog = true;
  164. SetROInt(1, i);
  165. SNMP_SendUserTrap((DO0_TOGGLED+i));
  166. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  167. }
  168. #endif
  169. }
  170. }
  171. }
  172. #endif
  173. #ifdef HARDWARE_BT6702
  174. /**
  175. * @brief Мониторинг бита CriticalAlarm
  176. */
  177. void UPS_CriticalAlarmMonitor(void)
  178. {
  179. static bool isValueRecv = false;
  180. static uint8_t CriticalAlarmOldState = 0;
  181. uint8_t CriticalAlarmCurrent;
  182. uint8_t i = 0;
  183. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  184. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  185. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  186. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  187. CriticalAlarmCurrent = flCriticalAlarm;
  188. if (!isValueRecv) {
  189. isValueRecv = true;
  190. CriticalAlarmOldState = CriticalAlarmCurrent;
  191. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  192. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  193. if(CriticalAlarmCurrent){
  194. relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
  195. }
  196. else{
  197. relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
  198. }
  199. return;
  200. }
  201. if(CriticalAlarmCurrent){
  202. if (UPS.Present)
  203. LED_On(LED_MAJOR_R);
  204. else
  205. LED_Toggle(LED_MAJOR_R);
  206. }
  207. else{
  208. LED_Off(LED_MAJOR_R);
  209. }
  210. // Значение параметра изменилось
  211. if (CriticalAlarmCurrent != CriticalAlarmOldState)
  212. {
  213. if(CriticalAlarmCurrent){
  214. relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
  215. }
  216. else{
  217. relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
  218. }
  219. }
  220. else
  221. {
  222. if(CriticalAlarmCurrent)
  223. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CRITICAL);
  224. }
  225. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  226. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  227. }
  228. CriticalAlarmOldState = CriticalAlarmCurrent;
  229. }
  230. /**
  231. * @brief Мониторинг бита NonCriticalAlarm
  232. */
  233. void UPS_NonCriticalAlarmMonitor(void)
  234. {
  235. static bool isValueRecv = false;
  236. static uint8_t NonCriticalAlarmOldState = 0;
  237. uint8_t NonCriticalAlarmCurrent;
  238. uint8_t i = 0;
  239. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  240. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  241. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  242. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  243. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  244. if (!isValueRecv) {
  245. isValueRecv = true;
  246. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  247. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  248. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  249. if(NonCriticalAlarmCurrent)
  250. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
  251. else
  252. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
  253. return;
  254. }
  255. // Значение параметра изменилось
  256. if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)
  257. {
  258. if(NonCriticalAlarmCurrent){
  259. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
  260. }
  261. else{
  262. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
  263. }
  264. }
  265. else
  266. {
  267. if(NonCriticalAlarmCurrent)
  268. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, NON_CRITICAL);
  269. }
  270. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  271. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  272. }
  273. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  274. }
  275. #endif
  276. /**
  277. * @brief Мониторинг бита Test in progress
  278. */
  279. void UPS_TestFinishMonitor(void)
  280. {
  281. static uint8_t TestFinishState = 0;
  282. uint8_t TestFinishStateCurrent;
  283. TestFinishStateCurrent = (UPS.Status >> 2) & 0x01;
  284. // Значение параметра изменилось
  285. if (TestFinishStateCurrent != TestFinishState)
  286. {
  287. if (!TestFinishStateCurrent){
  288. log_event_data(LOG_TEST_UPS, "Завершен");
  289. flUpdateLog = true;
  290. }
  291. }
  292. TestFinishState = TestFinishStateCurrent;
  293. }
  294. /**
  295. * @brief Мониторинг бита LainFail
  296. */
  297. void UPS_LineFailMonitor(void)
  298. {
  299. static bool isValueRecv = false;
  300. static uint8_t lineFailOldState = 0;
  301. uint8_t lineFailCurrent;
  302. #if defined HARDWARE_BT6706
  303. uint8_t i = 0;
  304. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  305. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  306. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  307. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  308. #endif
  309. lineFailCurrent = (UPS.Status >> 7) & 0x01;
  310. if (!isValueRecv) {
  311. isValueRecv = true;
  312. lineFailOldState = lineFailCurrent;
  313. if (lineFailCurrent){
  314. log_event_data(LOG_ALARM_LINE, "Авария");
  315. SNMP_SendUserTrap(LINE_ALARM);
  316. flUpdateLog = true;
  317. #if defined HARDWARE_BT6706
  318. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
  319. #endif
  320. }
  321. else{
  322. #if defined HARDWARE_BT6706
  323. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
  324. #endif
  325. log_event_data(LOG_ALARM_LINE, "Норма");
  326. SNMP_SendUserTrap(LINE_NORM);
  327. flUpdateLog = true;
  328. }
  329. return;
  330. }
  331. if (lineFailCurrent)
  332. flCriticalAlarm = true;
  333. // Значение параметра изменилось
  334. if (lineFailCurrent != lineFailOldState)
  335. {
  336. if (lineFailCurrent){
  337. #if defined HARDWARE_BT6706
  338. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
  339. #endif
  340. log_event_data(LOG_ALARM_LINE, "Авария");
  341. SNMP_SendUserTrap(LINE_ALARM);
  342. flUpdateLog = true;
  343. }
  344. else{
  345. #if defined HARDWARE_BT6706
  346. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
  347. #endif
  348. log_event_data(LOG_ALARM_LINE, "Норма");
  349. SNMP_SendUserTrap(LINE_NORM);
  350. flUpdateLog = true;
  351. }
  352. }
  353. #if defined HARDWARE_BT6706
  354. else{
  355. if (lineFailCurrent)
  356. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, AC_PRESENT);
  357. }
  358. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  359. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  360. }
  361. #endif
  362. lineFailOldState = lineFailCurrent;
  363. }
  364. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  365. /**
  366. * @brief Мониторинг аварии выходного напряжения по нижней границе
  367. */
  368. void UPS_VACoutputLowRangeMonitor(void)
  369. {
  370. static uint8_t stateCurrentVACoutput = HYST_IDLE;
  371. uint8_t VACoutputCurrent;
  372. #if defined HARDWARE_BT6706
  373. uint8_t i = 0;
  374. static bool isValueRecv = false;
  375. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  376. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  377. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  378. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  379. if(!isValueRecv)
  380. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  381. }
  382. #endif
  383. VACoutputCurrent = UPS.VAC_out;
  384. /* Отслеживается переход через нижнию границу */
  385. if (VACoutputCurrent < sSettings.sAlarmManager.ac_output_range.low)
  386. {
  387. if (stateCurrentVACoutput == HYST_IDLE)
  388. {
  389. LED_On(LED_MINOR_R);
  390. LED_On(LED_MINOR_G);
  391. stateCurrentVACoutput = HYST_DOWN;
  392. #if defined HARDWARE_BT6706
  393. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
  394. #endif
  395. log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Авария");
  396. // Отправка трапа о завышении
  397. // SNMP_SendUserTrap(POWER_ALARM);
  398. flUpdateLog = true;
  399. }
  400. else{
  401. #if defined HARDWARE_BT6706
  402. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
  403. #endif
  404. }
  405. }
  406. /* Отслеживается нормализация */
  407. else if (VACoutputCurrent > (sSettings.sAlarmManager.ac_output_range.low + sSettings.sAlarmManager.ac_output_range.hyst))
  408. {
  409. if (stateCurrentVACoutput == HYST_DOWN)
  410. {
  411. LED_Off(LED_MINOR_R);
  412. LED_Off(LED_MINOR_G);
  413. stateCurrentVACoutput = HYST_IDLE;
  414. #if defined HARDWARE_BT6706
  415. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
  416. #endif
  417. log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Норма");
  418. // Отправка трапа о нормализации
  419. // SNMP_SendUserTrap(POWER_NORM);
  420. flUpdateLog = true;
  421. }
  422. }
  423. #if defined HARDWARE_BT6706
  424. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  425. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  426. }
  427. #endif
  428. }
  429. /**
  430. * @brief Мониторинг аварии выходного напряжения по верхней границе
  431. */
  432. void UPS_VACoutputHighRangeMonitor(void)
  433. {
  434. static uint8_t stateCurrentVACoutput = HYST_IDLE;
  435. uint8_t VACoutputCurrent;
  436. #if defined HARDWARE_BT6706
  437. uint8_t i = 0;
  438. static bool isValueRecv = false;
  439. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  440. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  441. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  442. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  443. if(!isValueRecv)
  444. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  445. }
  446. #endif
  447. VACoutputCurrent = UPS.VAC_out;
  448. /* Отслеживается переход через верхнюю границу */
  449. if (VACoutputCurrent > sSettings.sAlarmManager.ac_output_range.high)
  450. {
  451. if (stateCurrentVACoutput == HYST_IDLE)
  452. {
  453. LED_On(LED_MINOR_R);
  454. LED_On(LED_MINOR_G);
  455. stateCurrentVACoutput = HYST_UP;
  456. #if defined HARDWARE_BT6706
  457. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
  458. #endif
  459. log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Авария");
  460. // Отправка трапа о завышении
  461. // SNMP_SendUserTrap(POWER_ALARM);
  462. flUpdateLog = true;
  463. }
  464. else{
  465. #if defined HARDWARE_BT6706
  466. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
  467. #endif
  468. }
  469. }
  470. /* Отслеживается нормализация */
  471. else if (VACoutputCurrent < (sSettings.sAlarmManager.ac_output_range.high - sSettings.sAlarmManager.ac_output_range.hyst))
  472. {
  473. if (stateCurrentVACoutput == HYST_UP)
  474. {
  475. LED_Off(LED_MINOR_R);
  476. LED_Off(LED_MINOR_G);
  477. stateCurrentVACoutput = HYST_IDLE;
  478. #if defined HARDWARE_BT6706
  479. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
  480. #endif
  481. log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Норма");
  482. // Отправка трапа о нормализации
  483. // SNMP_SendUserTrap(POWER_NORM);
  484. flUpdateLog = true;
  485. }
  486. }
  487. #if defined HARDWARE_BT6706
  488. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  489. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  490. }
  491. #endif
  492. }
  493. #endif
  494. /**
  495. * @brief Мониторинг бита LowBat
  496. */
  497. void UPS_LowBatMonitor(void)
  498. {
  499. static bool isValueRecv = false;
  500. static uint8_t lowBatOldState = 0;
  501. static bool flag_alarm_time = false;
  502. uint8_t lowBatCurrent;
  503. #if defined HARDWARE_BT6706
  504. uint8_t i = 0;
  505. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  506. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  507. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  508. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  509. #endif
  510. if((UPS.Status >> 7) & 0x01)
  511. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  512. else
  513. lowBatCurrent = 0;
  514. if (!isValueRecv) {
  515. isValueRecv = true;
  516. lowBatOldState = lowBatCurrent;
  517. if (lowBatCurrent){
  518. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  519. SNMP_SendUserTrap(LOW_BAT_ALARM);
  520. flUpdateLog = true;
  521. #if defined HARDWARE_BT6706
  522. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  523. #endif
  524. }
  525. else{
  526. SNMP_SendUserTrap(LOW_BAT_NORM);
  527. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  528. flUpdateLog = true;
  529. #if defined HARDWARE_BT6706
  530. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  531. #endif
  532. }
  533. return;
  534. }
  535. // Значение параметра изменилось
  536. if (lowBatCurrent != lowBatOldState)
  537. {
  538. if(flag_alarm_time){
  539. flag_alarm_time = false;
  540. if (lowBatCurrent){
  541. SNMP_SendUserTrap(LOW_BAT_ALARM);
  542. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  543. flUpdateLog = true;
  544. #ifdef HARDWARE_BT6706
  545. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  546. #endif
  547. }
  548. else{
  549. SNMP_SendUserTrap(LOW_BAT_NORM);
  550. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  551. flUpdateLog = true;
  552. #if defined HARDWARE_BT6706
  553. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  554. #endif
  555. }
  556. }
  557. else{
  558. flag_alarm_time = true;
  559. }
  560. }
  561. #if defined HARDWARE_BT6706
  562. else{
  563. flag_alarm_time = false;
  564. if (lowBatCurrent)
  565. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB);
  566. }
  567. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  568. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  569. }
  570. #endif
  571. if(!flag_alarm_time){
  572. if (lowBatCurrent){
  573. flNonCriticalAlarm = true;
  574. }
  575. lowBatOldState = lowBatCurrent;
  576. }
  577. else{
  578. if (lowBatOldState){
  579. flNonCriticalAlarm = true;
  580. }
  581. }
  582. }
  583. /**
  584. * @brief Мониторинг нагрузки
  585. */
  586. void UPS_PowerMonitor(void)
  587. {
  588. float load;
  589. static uint8_t stateCurrent = HYST_IDLE;
  590. load = UPS.Load;
  591. /* Отслеживается переход через верхнюю границу */
  592. if (load > sSettings.sAlarmManager.load_range.high)
  593. {
  594. flCriticalAlarm = true;
  595. UPS.Alarm = (UPS.Alarm & 0x0e) | (1 << 0);
  596. if (stateCurrent == HYST_IDLE)
  597. {
  598. LED_On(LED_MINOR_R);
  599. LED_On(LED_MINOR_G);
  600. stateCurrent = HYST_UP;
  601. log_event_data(LOG_ALARM_POWER, "Авария");
  602. // Отправка трапа о завышении
  603. SNMP_SendUserTrap(POWER_ALARM);
  604. flUpdateLog = true;
  605. }
  606. }
  607. /* Отслеживается нормализация */
  608. else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
  609. {
  610. UPS.Alarm = (UPS.Alarm & 0x0e);
  611. if (stateCurrent == HYST_UP)
  612. {
  613. LED_Off(LED_MINOR_R);
  614. LED_Off(LED_MINOR_G);
  615. stateCurrent = HYST_IDLE;
  616. log_event_data(LOG_ALARM_POWER, "Норма");
  617. // Отправка трапа о нормализации
  618. SNMP_SendUserTrap(POWER_NORM);
  619. flUpdateLog = true;
  620. }
  621. }
  622. }
  623. /**
  624. * @brief Мониторинг температуры по верхней границе
  625. */
  626. void UPS_TemperatureHighRangeMonitor(void)
  627. {
  628. float temperature;
  629. static uint8_t stateCurrent = HYST_IDLE;
  630. temperature = UPS.Temp;
  631. /* Отслеживается переход через верхнюю границу */
  632. if (temperature > sSettings.sAlarmManager.Temprature_range.high)
  633. {
  634. flCriticalAlarm = true;
  635. UPS.Alarm = (UPS.Alarm & 0x0d) | (1 << 1);
  636. if (stateCurrent == HYST_IDLE)
  637. {
  638. stateCurrent = HYST_UP;
  639. log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
  640. // Отправка трапа о завышении
  641. SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
  642. flUpdateLog = true;
  643. }
  644. }
  645. /* Отслеживается нормализация */
  646. else if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
  647. {
  648. UPS.Alarm = (UPS.Alarm & 0x0d);
  649. if (stateCurrent == HYST_UP)
  650. {
  651. stateCurrent = HYST_IDLE;
  652. log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
  653. // Отправка трапа о нормализации
  654. SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
  655. flUpdateLog = true;
  656. }
  657. }
  658. }
  659. /**
  660. * @brief Мониторинг температуры по нижней границе
  661. */
  662. void UPS_TemperatureLowRangeMonitor(void)
  663. {
  664. float temperature;
  665. static uint8_t stateCurrent = HYST_IDLE;
  666. temperature = UPS.Temp;
  667. /* Отслеживается переход через нипжнюю границу */
  668. if (temperature < sSettings.sAlarmManager.Temprature_range.low)
  669. {
  670. flCriticalAlarm = true;
  671. UPS.Alarm = (UPS.Alarm & 0x0d) | (1 << 1);
  672. if (stateCurrent == HYST_IDLE)
  673. {
  674. stateCurrent = HYST_DOWN;
  675. log_event_data(LOG_ALARM_LOW_TEMP, "Авария");
  676. // Отправка трапа о занижении
  677. SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_ALARM);
  678. flUpdateLog = true;
  679. }
  680. }
  681. /* Отслеживается нормализация */
  682. else if (temperature > (sSettings.sAlarmManager.Temprature_range.low + sSettings.sAlarmManager.Temprature_range.hyst))
  683. {
  684. UPS.Alarm = (UPS.Alarm & 0x0d);
  685. if (stateCurrent == HYST_DOWN)
  686. {
  687. stateCurrent = HYST_IDLE;
  688. log_event_data(LOG_ALARM_LOW_TEMP, "Норма");
  689. // Отправка трапа о нормализации
  690. SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);
  691. flUpdateLog = true;
  692. }
  693. }
  694. }
  695. /**
  696. * @brief Мониторинг параметра upsParams.connect
  697. */
  698. void UPS_ConnectMonitor(void)
  699. {
  700. static bool isValueRecv = false;
  701. static uint8_t connectOldState = 0;
  702. uint8_t connectCurrent;
  703. connectCurrent = UPS.Present;
  704. UPS.Alarm = (UPS.Alarm & 0x0b) | ((connectCurrent^1) << 2);
  705. if (!isValueRecv) {
  706. isValueRecv = true;
  707. connectOldState = connectCurrent;
  708. if (!connectCurrent){
  709. log_event_data(LOG_ALARM_UPS, "Авария");
  710. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  711. flUpdateLog = true;
  712. }
  713. else{
  714. log_event_data(LOG_ALARM_UPS, "Норма");
  715. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  716. flUpdateLog = true;
  717. }
  718. return;
  719. }
  720. if (!connectCurrent)
  721. flCriticalAlarm = true;
  722. // Значение параметра изменилось
  723. if (connectCurrent != connectOldState)
  724. {
  725. if (connectCurrent){
  726. log_event_data(LOG_ALARM_UPS, "Норма");
  727. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  728. flUpdateLog = true;
  729. }
  730. else{
  731. log_event_data(LOG_ALARM_UPS, "Авария");
  732. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  733. flUpdateLog = true;
  734. }
  735. }
  736. connectOldState = connectCurrent;
  737. }
  738. /**
  739. * @brief Мониторинг параметра upsParams.connect
  740. */
  741. void UPS_BatteryConnectMonitor(void)
  742. {
  743. static bool isValueRecv = false;
  744. static bool flag_alarm_time = false;
  745. static uint8_t AKBconnectOldState = 0;
  746. uint8_t AKBconnectCurrent;
  747. #if defined HARDWARE_BT6706
  748. uint8_t i = 0;
  749. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  750. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  751. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  752. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  753. #endif
  754. if(((UPS.Status >> 7) & 0x01) == 0)
  755. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  756. else{
  757. AKBconnectCurrent = 0;
  758. }
  759. UPS.Alarm = (UPS.Alarm & 0x07) | (AKBconnectCurrent << 3);
  760. if (!isValueRecv) {
  761. isValueRecv = true;
  762. AKBconnectOldState = AKBconnectCurrent;
  763. if (AKBconnectCurrent){
  764. log_event_data(LOG_ALARM_AKB, "Авария");
  765. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  766. flUpdateLog = true;
  767. #if defined HARDWARE_BT6706
  768. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  769. #endif
  770. }
  771. else{
  772. log_event_data(LOG_ALARM_AKB, "Норма");
  773. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  774. flUpdateLog = true;
  775. #if defined HARDWARE_BT6706
  776. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  777. #endif
  778. }
  779. return;
  780. }
  781. // Значение параметра изменилось
  782. if (AKBconnectCurrent != AKBconnectOldState)
  783. {
  784. if(flag_alarm_time){
  785. flag_alarm_time = false;
  786. if (!AKBconnectCurrent){
  787. log_event_data(LOG_ALARM_AKB, "Норма");
  788. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  789. flUpdateLog = true;
  790. #if defined HARDWARE_BT6706
  791. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  792. #endif
  793. }
  794. else{
  795. log_event_data(LOG_ALARM_AKB, "Авария");
  796. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  797. flUpdateLog = true;
  798. #if defined HARDWARE_BT6706
  799. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  800. #endif
  801. }
  802. }
  803. else{
  804. flag_alarm_time = true;
  805. }
  806. }
  807. #if defined HARDWARE_BT6706
  808. else{
  809. flag_alarm_time = false;
  810. if (AKBconnectCurrent)
  811. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, OFF_AKB);
  812. }
  813. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  814. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  815. }
  816. #endif
  817. if(!flag_alarm_time){
  818. if (AKBconnectCurrent){
  819. flCriticalAlarm = true;
  820. }
  821. AKBconnectOldState = AKBconnectCurrent;
  822. }
  823. else{
  824. if (AKBconnectOldState){
  825. flCriticalAlarm = true;
  826. }
  827. }
  828. }
  829. /********************************* (C) РОТЕК **********************************/