ups_monitor.c 21 KB

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