ups_monitor.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392
  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 "rtc.h"
  20. #include "hal.h"
  21. #include "FreeRTOS.h"
  22. #include "task.h"
  23. #include "trap_api.h"
  24. #include "snmp_api.h"
  25. #include <stdbool.h>
  26. #ifdef PRINTF_STDLIB
  27. #include <stdio.h>
  28. #endif
  29. #ifdef PRINTF_CUSTOM
  30. #include "tinystdio.h"
  31. #endif
  32. bool flCriticalAlarm = false;
  33. bool flNonCriticalAlarm = false;
  34. bool flLedAlarm = false;
  35. /**
  36. * @brief Общая структура настроек
  37. */
  38. extern SETTINGS_t sSettings;
  39. extern bool flUpdateLog;
  40. extern int test_time;
  41. /**
  42. * @brief Задача мониторинга параметров UPS
  43. */
  44. void UPS_Monitor(void *params)
  45. {
  46. vTaskDelay(5000);
  47. for (;;)
  48. {
  49. flCriticalAlarm = false;
  50. flNonCriticalAlarm = false;
  51. flLedAlarm = false;
  52. #define XMONITOR(monitor_func, present) if (present) { monitor_func(); }
  53. MONITOR_TABLE
  54. #undef XMONITOR
  55. #ifdef LED_ALARM
  56. if(flLedAlarm){
  57. if (UPS.Present)
  58. LED_On(LED_ALARM);
  59. else
  60. LED_Toggle(LED_ALARM);
  61. }
  62. else{
  63. LED_Off(LED_ALARM);
  64. }
  65. #endif
  66. vTaskDelay(1000);
  67. }
  68. }
  69. #ifdef DINS_ENABLE
  70. /**
  71. * @brief Мониторинг бита DI0 state
  72. */
  73. void UPS_DI0Monitor(void)
  74. {
  75. #ifdef DIN_MONITOR
  76. static bool isValueRecv = false;
  77. static uint8_t DI0OldState[INPUTS_TOTAL_COUNT];
  78. uint8_t DI0StateCurrent;
  79. for(uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
  80. DI0StateCurrent = get_state_din_outs((DIN1+i)) ^ sSettings.sDINs[i].din_type_act;
  81. UPS.Alarm = (UPS.Alarm & ~(1 << (4 + i))) | (DI0StateCurrent << (4 + i));
  82. if (!isValueRecv) {
  83. DI0OldState[i] = DI0StateCurrent;
  84. if (DI0StateCurrent){
  85. log_event_data((LOG_ALARM_DIO + i), "Авария");
  86. SNMP_SendUserTrap(DI0_ALARM + 2*i);
  87. flUpdateLog = true;
  88. }
  89. else{
  90. log_event_data((LOG_ALARM_DIO + i), "Норма");
  91. SNMP_SendUserTrap(DI0_NORM + 2*i);
  92. flUpdateLog = true;
  93. }
  94. if (i == (INPUTS_TOTAL_COUNT - 1)) {
  95. isValueRecv = true;
  96. break;
  97. }
  98. continue;
  99. }
  100. if (DI0StateCurrent) {
  101. flLedAlarm = true;
  102. }
  103. // Значение параметра изменилось
  104. if (DI0StateCurrent != DI0OldState[i])
  105. {
  106. if (!DI0StateCurrent){
  107. log_event_data((LOG_ALARM_DIO + i), "Норма");
  108. SNMP_SendUserTrap((DI0_NORM + 2*i));
  109. flUpdateLog = true;
  110. }
  111. else{
  112. log_event_data((LOG_ALARM_DIO + i), "Авария");
  113. SNMP_SendUserTrap(DI0_ALARM + 2*i);
  114. flUpdateLog = true;
  115. }
  116. }
  117. DI0OldState[i] = DI0StateCurrent;
  118. }
  119. #endif
  120. }
  121. #endif
  122. #ifdef DOUTS_ENABLE
  123. void relay_setup_log(uint8_t *curr_source, ro_type_source_t src_act_ro, uint8_t state_relay)
  124. {
  125. uint8_t i = 0;
  126. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  127. if(curr_source[i] == src_act_ro){
  128. SetROInt(state_relay, i);
  129. SNMP_SendUserTrap((DO0_TOGGLED+i));
  130. if(state_relay){
  131. flUpdateLog = true;
  132. #if defined RELAY_NC
  133. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  134. #else
  135. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  136. #endif
  137. }
  138. else{
  139. flUpdateLog = true;
  140. #if defined RELAY_NC
  141. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  142. #else
  143. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  144. #endif
  145. }
  146. }
  147. }
  148. }
  149. void relay_setup_log_change(uint8_t *curr_source, uint8_t *prev_source, ro_type_source_t src_act_ro)
  150. {
  151. uint8_t i = 0;
  152. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  153. if(curr_source[i] != prev_source[i] && (prev_source[i] == src_act_ro || curr_source[i] == src_act_ro)){
  154. #if defined RELAY_NC
  155. if(curr_source[i] != src_act_ro){
  156. flUpdateLog = true;
  157. SetROInt(0, i);
  158. SNMP_SendUserTrap((DO0_TOGGLED+i));
  159. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  160. }
  161. else{
  162. flUpdateLog = true;
  163. SetROInt(1, i);
  164. SNMP_SendUserTrap((DO0_TOGGLED+i));
  165. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  166. }
  167. #else
  168. if(curr_source[i] != src_act_ro){
  169. flUpdateLog = true;
  170. SetROInt(0, i);
  171. SNMP_SendUserTrap((DO0_TOGGLED+i));
  172. log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
  173. }
  174. else{
  175. flUpdateLog = true;
  176. SetROInt(1, i);
  177. SNMP_SendUserTrap((DO0_TOGGLED+i));
  178. log_event_data((LOG_DO0_STATE + i), "Замкнуто");
  179. }
  180. #endif
  181. }
  182. }
  183. }
  184. #endif
  185. #ifdef TYPE_CRITICAL_ALARM_MONITOR
  186. /**
  187. * @brief Мониторинг бита CriticalAlarm
  188. */
  189. void UPS_CriticalAlarmMonitor(void)
  190. {
  191. static bool isValueRecv = false;
  192. static uint8_t CriticalAlarmOldState = 0;
  193. uint8_t CriticalAlarmCurrent;
  194. uint8_t i = 0;
  195. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  196. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  197. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  198. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  199. CriticalAlarmCurrent = flCriticalAlarm;
  200. if (!isValueRecv) {
  201. isValueRecv = true;
  202. CriticalAlarmOldState = CriticalAlarmCurrent;
  203. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  204. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  205. if(CriticalAlarmCurrent){
  206. relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
  207. }
  208. else{
  209. relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
  210. }
  211. return;
  212. }
  213. // Значение параметра изменилось
  214. if (CriticalAlarmCurrent != CriticalAlarmOldState)
  215. {
  216. if(CriticalAlarmCurrent){
  217. relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
  218. }
  219. else{
  220. relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
  221. }
  222. }
  223. else
  224. {
  225. if(CriticalAlarmCurrent)
  226. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CRITICAL);
  227. }
  228. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  229. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  230. }
  231. CriticalAlarmOldState = CriticalAlarmCurrent;
  232. }
  233. /**
  234. * @brief Мониторинг бита NonCriticalAlarm
  235. */
  236. void UPS_NonCriticalAlarmMonitor(void)
  237. {
  238. static bool isValueRecv = false;
  239. static uint8_t NonCriticalAlarmOldState = 0;
  240. uint8_t NonCriticalAlarmCurrent;
  241. uint8_t i = 0;
  242. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  243. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  244. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  245. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  246. NonCriticalAlarmCurrent = flNonCriticalAlarm;
  247. if (!isValueRecv) {
  248. isValueRecv = true;
  249. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  250. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  251. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  252. if(NonCriticalAlarmCurrent)
  253. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
  254. else
  255. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
  256. return;
  257. }
  258. // Значение параметра изменилось
  259. if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)
  260. {
  261. if(NonCriticalAlarmCurrent){
  262. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
  263. }
  264. else{
  265. relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
  266. }
  267. }
  268. else
  269. {
  270. if(NonCriticalAlarmCurrent)
  271. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, NON_CRITICAL);
  272. }
  273. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  274. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  275. }
  276. NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
  277. }
  278. #endif
  279. static uint8_t test_flag = 0;
  280. /**
  281. * @brief Мониторинг бита Test in progress
  282. */
  283. void UPS_TestFinishMonitor(void)
  284. {
  285. #ifdef TEST_AKB_FINISH_MONITOR
  286. static uint8_t TestFinishState = 0;
  287. uint8_t TestFinishStateCurrent;
  288. char log_string[50];
  289. TestFinishStateCurrent = (UPS.Status >> 2) & 0x01;
  290. // Значение параметра изменилось
  291. if (TestFinishStateCurrent != TestFinishState)
  292. {
  293. if (!TestFinishStateCurrent){
  294. test_flag = 1;
  295. printf("Test finish\r\n");
  296. #ifdef HARDWARE_BT6703_RT
  297. UPSReadTestStatus();
  298. if(UPS.Test_Status == 2){
  299. log_event_data(LOG_TEST_UPS, "Ошибка");
  300. } else {
  301. log_event_data(LOG_TEST_UPS, "Завершен");
  302. }
  303. #else
  304. log_event_data(LOG_TEST_UPS, "Завершен");
  305. #endif
  306. flUpdateLog = true;
  307. } else {
  308. memset(log_string, 0, sizeof(log_string));
  309. switch (get_act_source()) {
  310. case WEB_ACT:
  311. strcpy(log_string, name_login);
  312. break;
  313. case SNMP_ACT:
  314. case OTHER_ACT:
  315. strcpy(log_string, "Администратор");
  316. break;
  317. #ifdef CLI_ENABLE
  318. case CLI_ACT:
  319. strcpy(log_string, "Администратор");
  320. break;
  321. #endif
  322. default:
  323. break;
  324. }
  325. #ifdef HARDWARE_BT6703_RT
  326. if (test_time != 0) {
  327. uint8_t len = strlen(log_string);
  328. sprintf(&log_string[len], "(%i мин)", test_time);
  329. } else {
  330. strcat(log_string, " (до разряда)");
  331. }
  332. #else
  333. strcat(log_string, " (Запущен)");
  334. #endif
  335. test_flag = 1;
  336. printf("Test start\r\n");
  337. log_event_data(LOG_TEST_UPS, log_string);
  338. flUpdateLog = true;
  339. }
  340. }
  341. TestFinishState = TestFinishStateCurrent;
  342. #endif
  343. }
  344. /**
  345. * @brief Мониторинг SOC
  346. */
  347. void UPS_TestSOCMonitor(void)
  348. {
  349. #ifdef RELAY_ALARM_AKB
  350. static uint8_t AKBAlarmState = 0;
  351. uint8_t i = 0;
  352. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  353. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  354. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  355. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  356. DBG printf("SOC_curr %d %d\r\n", UPS.SOC_test, UPS.SOC);
  357. if(UPS.SOC_test != UPS.SOC && UPS.SOC_test != 0 && (test_flag || (UPS.Status >> 2) & 0x01)) {
  358. if (((int8_t)UPS.SOC_test - (int8_t)UPS.SOC) >= 20 && UPS.Load < 10) {
  359. relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 1);
  360. log_event_data(LOG_TEST_ALARM_AKB, "Авария");
  361. AKBAlarmState = 1;
  362. }
  363. UPS.SOC_test = 0;
  364. test_flag = 0;
  365. }
  366. UPS.SOC_test = UPS.SOC;
  367. if (AKBAlarmState)
  368. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, ALARM_AKB);
  369. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  370. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  371. #endif
  372. }
  373. /**
  374. * @brief Мониторинг бита LainFail
  375. */
  376. void UPS_LineFailMonitor(void)
  377. {
  378. #ifdef LINE_FAIL_MONITOR
  379. static bool isValueRecv = false;
  380. static uint8_t lineFailOldState = 0;
  381. uint8_t lineFailCurrent;
  382. #if defined RELAY_AC_PRESENT
  383. uint8_t i = 0;
  384. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  385. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  386. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  387. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  388. #endif
  389. lineFailCurrent = (UPS.Status >> 7) & 0x01;
  390. if (!isValueRecv) {
  391. isValueRecv = true;
  392. lineFailOldState = lineFailCurrent;
  393. if (lineFailCurrent){
  394. log_event_data(LOG_ALARM_LINE, "Авария");
  395. SNMP_SendUserTrap(LINE_ALARM);
  396. flUpdateLog = true;
  397. #if defined RELAY_AC_PRESENT
  398. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
  399. #endif
  400. }
  401. else{
  402. #if defined RELAY_AC_PRESENT
  403. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
  404. #endif
  405. log_event_data(LOG_ALARM_LINE, "Норма");
  406. SNMP_SendUserTrap(LINE_NORM);
  407. flUpdateLog = true;
  408. }
  409. return;
  410. }
  411. if (lineFailCurrent){
  412. flCriticalAlarm = true;
  413. flLedAlarm = true;
  414. }
  415. // Значение параметра изменилось
  416. if (lineFailCurrent != lineFailOldState)
  417. {
  418. if (lineFailCurrent){
  419. #if defined RELAY_AC_PRESENT
  420. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
  421. #endif
  422. log_event_data(LOG_ALARM_LINE, "Авария");
  423. SNMP_SendUserTrap(LINE_ALARM);
  424. #ifdef AKB_CHANGE_MONITOR
  425. if(UPS.Alarm & 0x40) {
  426. log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
  427. SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
  428. }
  429. #endif
  430. flUpdateLog = true;
  431. }
  432. else{
  433. #if defined RELAY_AC_PRESENT
  434. relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
  435. #endif
  436. log_event_data(LOG_ALARM_LINE, "Норма");
  437. SNMP_SendUserTrap(LINE_NORM);
  438. flUpdateLog = true;
  439. }
  440. }
  441. #if defined RELAY_AC_PRESENT
  442. else{
  443. if (lineFailCurrent)
  444. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, AC_PRESENT);
  445. }
  446. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  447. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  448. }
  449. #endif
  450. lineFailOldState = lineFailCurrent;
  451. #endif
  452. }
  453. #ifdef VAC_OUT_MONITOR
  454. /**
  455. * @brief Мониторинг аварии выходного напряжения по нижней границе
  456. */
  457. void UPS_VACoutputLowRangeMonitor(void)
  458. {
  459. static uint8_t stateCurrentVACoutput = HYST_IDLE;
  460. uint8_t VACoutputCurrent;
  461. #if defined RELAY_DC_PRESENT
  462. uint8_t i = 0;
  463. static bool isValueRecv = false;
  464. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  465. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  466. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  467. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  468. if(!isValueRecv)
  469. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  470. }
  471. #endif
  472. VACoutputCurrent = UPS.VAC_out;
  473. /* Отслеживается переход через нижнию границу */
  474. if (VACoutputCurrent < sSettings.sAlarmManager.ac_output_range.low)
  475. {
  476. if (stateCurrentVACoutput == HYST_IDLE)
  477. {
  478. UPS.Alarm |= (1 << 7);
  479. stateCurrentVACoutput = HYST_DOWN;
  480. #if defined RELAY_DC_PRESENT
  481. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
  482. #endif
  483. log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Авария");
  484. // Отправка трапа о завышении
  485. // SNMP_SendUserTrap(POWER_ALARM);
  486. flUpdateLog = true;
  487. } else {
  488. #if defined RELAY_DC_PRESENT
  489. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
  490. #endif
  491. }
  492. }
  493. /* Отслеживается нормализация */
  494. else if (VACoutputCurrent > (sSettings.sAlarmManager.ac_output_range.low + sSettings.sAlarmManager.ac_output_range.hyst))
  495. {
  496. if (stateCurrentVACoutput == HYST_DOWN)
  497. {
  498. UPS.Alarm &= 0xffffff7f;
  499. stateCurrentVACoutput = HYST_IDLE;
  500. #if defined RELAY_DC_PRESENT
  501. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
  502. #endif
  503. log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Норма");
  504. // Отправка трапа о нормализации
  505. // SNMP_SendUserTrap(POWER_NORM);
  506. flUpdateLog = true;
  507. }
  508. }
  509. if (UPS.Alarm & 0x80) {
  510. flLedAlarm = true;
  511. }
  512. #if defined RELAY_DC_PRESENT
  513. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  514. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  515. }
  516. #endif
  517. }
  518. /**
  519. * @brief Мониторинг аварии выходного напряжения по верхней границе
  520. */
  521. void UPS_VACoutputHighRangeMonitor(void)
  522. {
  523. static uint8_t stateCurrentVACoutput = HYST_IDLE;
  524. uint8_t VACoutputCurrent;
  525. #if defined RELAY_DC_PRESENT
  526. uint8_t i = 0;
  527. static bool isValueRecv = false;
  528. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  529. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  530. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  531. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  532. if(!isValueRecv)
  533. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  534. }
  535. #endif
  536. VACoutputCurrent = UPS.VAC_out;
  537. /* Отслеживается переход через верхнюю границу */
  538. if (VACoutputCurrent > sSettings.sAlarmManager.ac_output_range.high)
  539. {
  540. if (stateCurrentVACoutput == HYST_IDLE) {
  541. UPS.Alarm |= (1 << 7);
  542. stateCurrentVACoutput = HYST_UP;
  543. #if defined RELAY_DC_PRESENT
  544. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
  545. #endif
  546. log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Авария");
  547. // Отправка трапа о завышении
  548. // SNMP_SendUserTrap(POWER_ALARM);
  549. flUpdateLog = true;
  550. } else {
  551. #if defined RELAY_DC_PRESENT
  552. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
  553. #endif
  554. }
  555. }
  556. /* Отслеживается нормализация */
  557. else if (VACoutputCurrent < (sSettings.sAlarmManager.ac_output_range.high - sSettings.sAlarmManager.ac_output_range.hyst))
  558. {
  559. if (stateCurrentVACoutput == HYST_UP) {
  560. UPS.Alarm &= 0xffffff7f;
  561. stateCurrentVACoutput = HYST_IDLE;
  562. #if defined RELAY_DC_PRESENT
  563. relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
  564. #endif
  565. log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Норма");
  566. // Отправка трапа о нормализации
  567. // SNMP_SendUserTrap(POWER_NORM);
  568. flUpdateLog = true;
  569. }
  570. }
  571. if (UPS.Alarm & 0x80) {
  572. flLedAlarm = true;
  573. }
  574. #if defined RELAY_DC_PRESENT
  575. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  576. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  577. }
  578. #endif
  579. }
  580. #endif
  581. /**
  582. * @brief Мониторинг бита LowBat
  583. */
  584. void UPS_LowBatMonitor(void)
  585. {
  586. #ifdef LOW_BAT_MONITOR
  587. static bool isValueRecv = false;
  588. static uint8_t lowBatOldState = 0;
  589. static bool flag_alarm_time = false;
  590. uint8_t lowBatCurrent;
  591. #if defined RELAY_CHARGE_AKB
  592. uint8_t i = 0;
  593. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  594. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  595. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  596. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  597. #endif
  598. if((UPS.Status >> 7) & 0x01)
  599. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  600. else
  601. lowBatCurrent = 0;
  602. if (!isValueRecv) {
  603. isValueRecv = true;
  604. lowBatOldState = lowBatCurrent;
  605. if (lowBatCurrent){
  606. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  607. SNMP_SendUserTrap(LOW_BAT_ALARM);
  608. flUpdateLog = true;
  609. #if defined RELAY_CHARGE_AKB
  610. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  611. #endif
  612. }
  613. else{
  614. SNMP_SendUserTrap(LOW_BAT_NORM);
  615. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  616. flUpdateLog = true;
  617. #if defined RELAY_CHARGE_AKB
  618. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  619. #endif
  620. }
  621. return;
  622. }
  623. // Значение параметра изменилось
  624. if (lowBatCurrent != lowBatOldState)
  625. {
  626. if(flag_alarm_time){
  627. flag_alarm_time = false;
  628. if (lowBatCurrent){
  629. SNMP_SendUserTrap(LOW_BAT_ALARM);
  630. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  631. flUpdateLog = true;
  632. #ifdef RELAY_CHARGE_AKB
  633. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  634. #endif
  635. }
  636. else{
  637. SNMP_SendUserTrap(LOW_BAT_NORM);
  638. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  639. flUpdateLog = true;
  640. #if defined RELAY_CHARGE_AKB
  641. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  642. #endif
  643. }
  644. }
  645. else{
  646. flag_alarm_time = true;
  647. }
  648. }
  649. #if defined RELAY_CHARGE_AKB
  650. else{
  651. flag_alarm_time = false;
  652. if (lowBatCurrent)
  653. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB);
  654. }
  655. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  656. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  657. }
  658. #endif
  659. if(!flag_alarm_time){
  660. if (lowBatCurrent){
  661. flNonCriticalAlarm = true;
  662. flLedAlarm = true;
  663. }
  664. lowBatOldState = lowBatCurrent;
  665. }
  666. else{
  667. if (lowBatOldState){
  668. flNonCriticalAlarm = true;
  669. flLedAlarm = true;
  670. }
  671. }
  672. #endif
  673. }
  674. /**
  675. * @brief Мониторинг нагрузки
  676. */
  677. void UPS_PowerMonitor(void)
  678. {
  679. #ifdef LOAD_MONITOR
  680. float load;
  681. static uint8_t stateCurrent = HYST_IDLE;
  682. load = UPS.Load;
  683. /* Отслеживается переход через верхнюю границу */
  684. if (load > sSettings.sAlarmManager.load_range.high)
  685. {
  686. UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);
  687. if (stateCurrent == HYST_IDLE)
  688. {
  689. #ifdef LED_RED_MINOR
  690. LED_On(LED_RED_MINOR);
  691. #endif
  692. #ifdef LED_GREEN_MINOR
  693. LED_On(LED_GREEN_MINOR);
  694. #endif
  695. stateCurrent = HYST_UP;
  696. log_event_data(LOG_ALARM_POWER, "Авария");
  697. // Отправка трапа о завышении
  698. SNMP_SendUserTrap(POWER_ALARM);
  699. flUpdateLog = true;
  700. }
  701. }
  702. /* Отслеживается нормализация */
  703. else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
  704. {
  705. UPS.Alarm = (UPS.Alarm & 0xfffffffe);
  706. if (stateCurrent == HYST_UP)
  707. {
  708. #ifdef LED_RED_MINOR
  709. LED_Off(LED_RED_MINOR);
  710. #endif
  711. #ifdef LED_GREEN_MINOR
  712. LED_Off(LED_GREEN_MINOR);
  713. #endif
  714. stateCurrent = HYST_IDLE;
  715. log_event_data(LOG_ALARM_POWER, "Норма");
  716. // Отправка трапа о нормализации
  717. SNMP_SendUserTrap(POWER_NORM);
  718. flUpdateLog = true;
  719. }
  720. }
  721. if (UPS.Alarm & 0x00000001) {
  722. flCriticalAlarm = true;
  723. flLedAlarm = true;
  724. }
  725. #endif
  726. }
  727. #ifdef SENSOR_TEMP_MONITOR
  728. /**
  729. * @brief Мониторинг аварии датчика температуры
  730. */
  731. void sensorTemperatureMonitor(void)
  732. {
  733. float temperature;
  734. static uint8_t type_sensor[MAX_T_SENSORS];
  735. static uint8_t alarm[MAX_T_SENSORS];
  736. static uint8_t start_monitor = 0;
  737. if (start_monitor == 0) {
  738. start_monitor = 1;
  739. for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){
  740. type_sensor[i] = sSettings.sTempControl[i].type_sensor;
  741. }
  742. }
  743. for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){
  744. if (alarm[i] && sSettings.sTempControl[i].type_sensor != type_sensor[i]) {
  745. alarm[i] = 0;
  746. if (type_sensor[i] == TS_AKB) {
  747. log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");
  748. flUpdateLog = true;
  749. } else if (type_sensor[i] == TS_CABINET) {
  750. log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");
  751. flUpdateLog = true;
  752. }
  753. }
  754. if (sSettings.sTempControl[i].type_sensor == TS_AKB) {
  755. GetInternalTempInt(&temperature);
  756. if(temperature == 85) {
  757. if(!alarm[i]) {
  758. log_event_data(LOG_ALARM_SENSOR_AKB, "Авария");
  759. flUpdateLog = true;
  760. flLedAlarm = true;
  761. alarm[i] = 1;
  762. }
  763. } else {
  764. if(alarm[i]) {
  765. log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");
  766. flUpdateLog = true;
  767. alarm[i] = 0;
  768. }
  769. }
  770. } else if (sSettings.sTempControl[i].type_sensor == TS_CABINET) {
  771. GetTempCaseInt(&temperature);
  772. if(temperature == 85) {
  773. if(!alarm[i]) {
  774. log_event_data(LOG_ALARM_SENSOR_CABINET, "Авария");
  775. flUpdateLog = true;
  776. flLedAlarm = true;
  777. alarm[i] = 1;
  778. }
  779. } else {
  780. if(alarm[i]) {
  781. log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");
  782. flUpdateLog = true;
  783. alarm[i] = 0;
  784. }
  785. }
  786. }
  787. type_sensor[i] = sSettings.sTempControl[i].type_sensor;
  788. }
  789. }
  790. #endif
  791. #ifdef TEMP_AKB_MONITOR
  792. /**
  793. * @brief Мониторинг температуры по верхней границе
  794. */
  795. void UPS_TemperatureHighRangeMonitor(void)
  796. {
  797. float temperature;
  798. static uint8_t stateCurrent = HYST_IDLE;
  799. GetInternalTempInt(&temperature);
  800. if(temperature == 85) {
  801. UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
  802. if (stateCurrent == HYST_UP) {
  803. stateCurrent = HYST_IDLE;
  804. log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
  805. // Отправка трапа о нормализации
  806. SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
  807. flUpdateLog = true;
  808. }
  809. return;
  810. } else {
  811. if (stateCurrent == HYST_IDLE) {
  812. UPS.Alarm = (UPS.Alarm & 0xfffffffd);
  813. }
  814. }
  815. /* Отслеживается переход через верхнюю границу */
  816. if (temperature > sSettings.sAlarmManager.Temprature_range.high)
  817. {
  818. if (stateCurrent == HYST_IDLE)
  819. {
  820. stateCurrent = HYST_UP;
  821. UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
  822. log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
  823. // Отправка трапа о завышении
  824. SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
  825. flUpdateLog = true;
  826. }
  827. }
  828. /* Отслеживается нормализация */
  829. else if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
  830. {
  831. if (stateCurrent == HYST_UP)
  832. {
  833. stateCurrent = HYST_IDLE;
  834. UPS.Alarm = (UPS.Alarm & 0xfffffffd);
  835. log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
  836. // Отправка трапа о нормализации
  837. SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
  838. flUpdateLog = true;
  839. }
  840. }
  841. if (UPS.Alarm & 0x00000002) {
  842. flCriticalAlarm = true;
  843. flLedAlarm = true;
  844. }
  845. }
  846. /**
  847. * @brief Мониторинг температуры по нижней границе
  848. */
  849. void UPS_TemperatureLowRangeMonitor(void)
  850. {
  851. float temperature;
  852. static uint8_t stateCurrent = HYST_IDLE;
  853. GetInternalTempInt(&temperature);
  854. if(temperature == 85) {
  855. UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);
  856. if (stateCurrent == HYST_DOWN) {
  857. stateCurrent = HYST_IDLE;
  858. log_event_data(LOG_ALARM_LOW_TEMP, "Норма");
  859. // Отправка трапа о нормализации
  860. SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);
  861. flUpdateLog = true;
  862. }
  863. return;
  864. } else {
  865. if (stateCurrent == HYST_IDLE) {
  866. UPS.Alarm = (UPS.Alarm & 0xfffffeff);
  867. }
  868. }
  869. /* Отслеживается переход через нипжнюю границу */
  870. if (temperature < sSettings.sAlarmManager.Temprature_range.low)
  871. {
  872. if (stateCurrent == HYST_IDLE)
  873. {
  874. stateCurrent = HYST_DOWN;
  875. UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);
  876. log_event_data(LOG_ALARM_LOW_TEMP, "Авария");
  877. // Отправка трапа о занижении
  878. SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_ALARM);
  879. flUpdateLog = true;
  880. }
  881. }
  882. /* Отслеживается нормализация */
  883. else if (temperature > (sSettings.sAlarmManager.Temprature_range.low + sSettings.sAlarmManager.Temprature_range.hyst))
  884. {
  885. if (stateCurrent == HYST_DOWN)
  886. {
  887. stateCurrent = HYST_IDLE;
  888. UPS.Alarm = (UPS.Alarm & 0xfffffeff);
  889. log_event_data(LOG_ALARM_LOW_TEMP, "Норма");
  890. // Отправка трапа о нормализации
  891. SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);
  892. flUpdateLog = true;
  893. }
  894. }
  895. if (UPS.Alarm & 0x00000100) {
  896. flCriticalAlarm = true;
  897. flLedAlarm = true;
  898. }
  899. }
  900. #endif
  901. #ifdef TEMP_CABINET_MONITOR
  902. /**
  903. * @brief Мониторинг температуры шкафа по верхней границе
  904. */
  905. void Cabinet_TemperatureHighRangeMonitor(void)
  906. {
  907. float temperature;
  908. static uint8_t stateCurrent = HYST_IDLE;
  909. GetTempCaseInt(&temperature);
  910. if(temperature == 85) {
  911. UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);
  912. if (stateCurrent == HYST_UP) {
  913. stateCurrent = HYST_IDLE;
  914. log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");
  915. // Отправка трапа о нормализации
  916. SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);
  917. flUpdateLog = true;
  918. }
  919. return;
  920. } else {
  921. if (stateCurrent == HYST_IDLE) {
  922. UPS.Alarm = (UPS.Alarm & 0xfffffdff);
  923. }
  924. }
  925. /* Отслеживается переход через верхнюю границу */
  926. if (temperature > sSettings.sAlarmManager.Temprature_cabinet_range.high)
  927. {
  928. if (stateCurrent == HYST_IDLE)
  929. {
  930. UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);
  931. stateCurrent = HYST_UP;
  932. log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Авария");
  933. // Отправка трапа о завышении
  934. SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_ALARM);
  935. flUpdateLog = true;
  936. }
  937. }
  938. /* Отслеживается нормализация */
  939. else if (temperature < (sSettings.sAlarmManager.Temprature_cabinet_range.high - sSettings.sAlarmManager.Temprature_cabinet_range.hyst))
  940. {
  941. if (stateCurrent == HYST_UP)
  942. {
  943. UPS.Alarm = (UPS.Alarm & 0xfffffdff);
  944. stateCurrent = HYST_IDLE;
  945. log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");
  946. // Отправка трапа о нормализации
  947. SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);
  948. flUpdateLog = true;
  949. }
  950. }
  951. if (UPS.Alarm & 0x00000200) {
  952. flLedAlarm = true;
  953. }
  954. }
  955. /**
  956. * @brief Мониторинг температуры шкафа по нижней границе
  957. */
  958. void Cabinet_TemperatureLowRangeMonitor(void)
  959. {
  960. float temperature;
  961. static uint8_t stateCurrent = HYST_IDLE;
  962. GetTempCaseInt(&temperature);
  963. if(temperature == 85) {
  964. UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);
  965. if (stateCurrent == HYST_DOWN) {
  966. stateCurrent = HYST_IDLE;
  967. log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");
  968. // Отправка трапа о нормализации
  969. SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);
  970. flUpdateLog = true;
  971. }
  972. return;
  973. } else {
  974. if (stateCurrent == HYST_IDLE) {
  975. UPS.Alarm = (UPS.Alarm & 0xfffffbff);
  976. }
  977. }
  978. /* Отслеживается переход через нипжнюю границу */
  979. if (temperature < sSettings.sAlarmManager.Temprature_cabinet_range.low)
  980. {
  981. if (stateCurrent == HYST_IDLE)
  982. {
  983. stateCurrent = HYST_DOWN;
  984. UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);
  985. log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Авария");
  986. // Отправка трапа о занижении
  987. SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_ALARM);
  988. flUpdateLog = true;
  989. }
  990. }
  991. /* Отслеживается нормализация */
  992. else if (temperature > (sSettings.sAlarmManager.Temprature_cabinet_range.low + sSettings.sAlarmManager.Temprature_cabinet_range.hyst))
  993. {
  994. if (stateCurrent == HYST_DOWN)
  995. {
  996. UPS.Alarm = (UPS.Alarm & 0xfffffbff);
  997. stateCurrent = HYST_IDLE;
  998. log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");
  999. // Отправка трапа о нормализации
  1000. SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);
  1001. flUpdateLog = true;
  1002. }
  1003. }
  1004. if (UPS.Alarm & 0x00000400) {
  1005. flLedAlarm = true;
  1006. }
  1007. }
  1008. #endif
  1009. /**
  1010. * @brief Мониторинг параметра upsParams.connect
  1011. */
  1012. void UPS_ConnectMonitor(void)
  1013. {
  1014. #ifdef UPS_CONNECT_MONITOR
  1015. static bool isValueRecv = false;
  1016. static uint8_t connectOldState = 0;
  1017. uint8_t connectCurrent;
  1018. connectCurrent = UPS.Present;
  1019. UPS.Alarm = (UPS.Alarm & 0xfffffffb) | ((connectCurrent^1) << 2);
  1020. if (!isValueRecv) {
  1021. isValueRecv = true;
  1022. connectOldState = connectCurrent;
  1023. if (!connectCurrent){
  1024. log_event_data(LOG_ALARM_UPS, "Авария");
  1025. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  1026. }
  1027. else{
  1028. log_event_data(LOG_ALARM_UPS, "Норма");
  1029. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  1030. flUpdateLog = true;
  1031. }
  1032. return;
  1033. }
  1034. if (!connectCurrent){
  1035. flCriticalAlarm = true;
  1036. flLedAlarm = true;
  1037. }
  1038. // Значение параметра изменилось
  1039. if (connectCurrent != connectOldState)
  1040. {
  1041. if (connectCurrent){
  1042. log_event_data(LOG_ALARM_UPS, "Норма");
  1043. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  1044. flUpdateLog = true;
  1045. }
  1046. else{
  1047. log_event_data(LOG_ALARM_UPS, "Авария");
  1048. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  1049. }
  1050. }
  1051. connectOldState = connectCurrent;
  1052. #endif
  1053. }
  1054. /**
  1055. * @brief Мониторинг параметра upsParams.connect
  1056. */
  1057. void UPS_BatteryConnectMonitor(void)
  1058. {
  1059. #ifdef BAT_CONNECT_MONITOR
  1060. static bool isValueRecv = false;
  1061. static bool flag_alarm_time = false;
  1062. static uint8_t AKBconnectOldState = 0;
  1063. uint8_t AKBconnectCurrent;
  1064. #if defined RELAY_OFF_AKB
  1065. uint8_t i = 0;
  1066. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  1067. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  1068. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  1069. CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
  1070. #endif
  1071. if(((UPS.Status >> 7) & 0x01) == 0)
  1072. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  1073. else{
  1074. AKBconnectCurrent = 0;
  1075. }
  1076. UPS.Alarm = (UPS.Alarm & 0xfffffff7) | (AKBconnectCurrent << 3);
  1077. if (!isValueRecv) {
  1078. isValueRecv = true;
  1079. AKBconnectOldState = AKBconnectCurrent;
  1080. if (AKBconnectCurrent){
  1081. log_event_data(LOG_ALARM_AKB, "Авария");
  1082. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  1083. flUpdateLog = true;
  1084. #if defined RELAY_OFF_AKB
  1085. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  1086. #endif
  1087. }
  1088. else{
  1089. log_event_data(LOG_ALARM_AKB, "Норма");
  1090. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  1091. flUpdateLog = true;
  1092. #if defined RELAY_OFF_AKB
  1093. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  1094. #endif
  1095. }
  1096. return;
  1097. }
  1098. // Значение параметра изменилось
  1099. if (AKBconnectCurrent != AKBconnectOldState)
  1100. {
  1101. if(flag_alarm_time){
  1102. flag_alarm_time = false;
  1103. if (!AKBconnectCurrent){
  1104. log_event_data(LOG_ALARM_AKB, "Норма");
  1105. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  1106. flUpdateLog = true;
  1107. #if defined RELAY_OFF_AKB
  1108. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  1109. #endif
  1110. }
  1111. else{
  1112. log_event_data(LOG_ALARM_AKB, "Авария");
  1113. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  1114. flUpdateLog = true;
  1115. #if defined RELAY_OFF_AKB
  1116. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  1117. #endif
  1118. }
  1119. }
  1120. else{
  1121. flag_alarm_time = true;
  1122. }
  1123. }
  1124. #if defined RELAY_OFF_AKB
  1125. else{
  1126. flag_alarm_time = false;
  1127. if (AKBconnectCurrent)
  1128. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, OFF_AKB);
  1129. }
  1130. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  1131. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  1132. }
  1133. #endif
  1134. if(!flag_alarm_time){
  1135. if (AKBconnectCurrent){
  1136. flCriticalAlarm = true;
  1137. flLedAlarm = true;
  1138. }
  1139. AKBconnectOldState = AKBconnectCurrent;
  1140. }
  1141. else{
  1142. if (AKBconnectOldState){
  1143. flCriticalAlarm = true;
  1144. flLedAlarm = true;
  1145. }
  1146. }
  1147. #endif
  1148. }
  1149. #ifdef AKB_CHANGE_MONITOR
  1150. /**
  1151. * @brief Мониторинг параметра замены АКБ
  1152. */
  1153. void AKB_Change_Monitor(void)
  1154. {
  1155. uint32_t data_change = sSettings.UPS_Setting.set_data + (31536000*sSettings.UPS_Setting.life_time);
  1156. TM_RTC_t tmp_data;
  1157. static bool isValueRecv = false;
  1158. static uint8_t status_change_akb = 0;
  1159. uint8_t curr_status_change_akb = 0;
  1160. TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
  1161. if (tmp_data.unix >= data_change) {
  1162. UPS.Alarm |= (1 << 6);
  1163. curr_status_change_akb = 1;
  1164. flCriticalAlarm = true;
  1165. flLedAlarm = true;
  1166. }
  1167. else {
  1168. UPS.Alarm &= 0xffffffbf;
  1169. curr_status_change_akb = 0;
  1170. }
  1171. if (!isValueRecv) {
  1172. isValueRecv = true;
  1173. status_change_akb = curr_status_change_akb;
  1174. if (curr_status_change_akb){
  1175. log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
  1176. SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
  1177. flUpdateLog = true;
  1178. }
  1179. else{
  1180. log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");
  1181. SNMP_SendUserTrap(BATTERY_CHANGE_MORM);
  1182. flUpdateLog = true;
  1183. }
  1184. return;
  1185. }
  1186. // Значение параметра изменилось
  1187. if (status_change_akb != curr_status_change_akb)
  1188. {
  1189. if (curr_status_change_akb){
  1190. log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
  1191. SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
  1192. flUpdateLog = true;
  1193. } else {
  1194. log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");
  1195. SNMP_SendUserTrap(BATTERY_CHANGE_MORM);
  1196. flUpdateLog = true;
  1197. }
  1198. }
  1199. status_change_akb = curr_status_change_akb;
  1200. }
  1201. #endif
  1202. #ifdef UPS_FAILED_MONITOR
  1203. void UPS_Failed_Monitor(void)
  1204. {
  1205. static bool isValueRecv = false;
  1206. static uint8_t UPSFailOldState = 0;
  1207. uint8_t UPSFailCurrent;
  1208. UPSFailCurrent = (UPS.Status >> 4) & 0x01;
  1209. if (!isValueRecv) {
  1210. isValueRecv = true;
  1211. UPSFailOldState = UPSFailCurrent;
  1212. if (UPSFailCurrent){
  1213. log_event_data(LOG_ALARM_UPS_FAILED, "Авария");
  1214. SNMP_SendUserTrap(UPS_ALARM);
  1215. flUpdateLog = true;
  1216. }
  1217. else{
  1218. log_event_data(LOG_ALARM_UPS_FAILED, "Норма");
  1219. SNMP_SendUserTrap(UPS_NORM);
  1220. flUpdateLog = true;
  1221. }
  1222. return;
  1223. }
  1224. if (UPSFailCurrent){
  1225. flCriticalAlarm = true;
  1226. flLedAlarm = true;
  1227. }
  1228. // Значение параметра изменилось
  1229. if (UPSFailCurrent != UPSFailOldState)
  1230. {
  1231. if (UPSFailCurrent){
  1232. log_event_data(LOG_ALARM_UPS_FAILED, "Авария");
  1233. SNMP_SendUserTrap(UPS_ALARM);
  1234. flUpdateLog = true;
  1235. }
  1236. else{
  1237. log_event_data(LOG_ALARM_UPS_FAILED, "Норма");
  1238. SNMP_SendUserTrap(UPS_NORM);
  1239. flUpdateLog = true;
  1240. }
  1241. }
  1242. UPSFailOldState = UPSFailCurrent;
  1243. }
  1244. #endif
  1245. /********************************* (C) РОТЕК **********************************/