ups_monitor.c 27 KB

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