ups_monitor.c 20 KB

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