ups_monitor.c 27 KB

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