ups_monitor.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  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. static bool flag_alarm_time = false;
  428. uint8_t lowBatCurrent;
  429. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  430. uint8_t i = 0;
  431. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  432. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  433. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  434. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  435. #endif
  436. if((UPS.Status >> 7) & 0x01)
  437. lowBatCurrent = (UPS.Status >> 6) & 0x01;
  438. else
  439. lowBatCurrent = 0;
  440. if (!isValueRecv) {
  441. isValueRecv = true;
  442. lowBatOldState = lowBatCurrent;
  443. if (lowBatCurrent){
  444. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  445. SNMP_SendUserTrap(LOW_BAT_ALARM);
  446. flUpdateLog = true;
  447. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  448. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  449. #endif
  450. }
  451. else{
  452. SNMP_SendUserTrap(LOW_BAT_NORM);
  453. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  454. flUpdateLog = true;
  455. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  456. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  457. #endif
  458. }
  459. return;
  460. }
  461. // Значение параметра изменилось
  462. if (lowBatCurrent != lowBatOldState)
  463. {
  464. if(flag_alarm_time){
  465. flag_alarm_time = false;
  466. if (lowBatCurrent){
  467. SNMP_SendUserTrap(LOW_BAT_ALARM);
  468. log_event_data(LOG_ALARM_LOW_BAT, "Авария");
  469. flUpdateLog = true;
  470. #ifdef HARDWARE_BT6706
  471. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
  472. #endif
  473. }
  474. else{
  475. SNMP_SendUserTrap(LOW_BAT_NORM);
  476. log_event_data(LOG_ALARM_LOW_BAT, "Норма");
  477. flUpdateLog = true;
  478. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  479. relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
  480. #endif
  481. }
  482. }
  483. else{
  484. flag_alarm_time = true;
  485. }
  486. }
  487. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  488. else{
  489. flag_alarm_time = false;
  490. if (lowBatCurrent)
  491. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB);
  492. }
  493. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  494. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  495. }
  496. #endif
  497. if(!flag_alarm_time){
  498. if (lowBatCurrent){
  499. flNonCriticalAlarm = true;
  500. }
  501. lowBatOldState = lowBatCurrent;
  502. }
  503. else{
  504. if (lowBatOldState){
  505. flNonCriticalAlarm = true;
  506. }
  507. }
  508. }
  509. /**
  510. * @brief Мониторинг нагрузки
  511. */
  512. void UPS_PowerMonitor(void)
  513. {
  514. float load;
  515. static uint8_t stateCurrent = HYST_IDLE;
  516. load = UPS.Load;
  517. /* Отслеживается переход через верхнюю границу */
  518. if (load > UPS_LOAD)
  519. {
  520. flCriticalAlarm = true;
  521. UPS.Alarm = (UPS.Alarm & 0x0e) | (1 << 0);
  522. if (stateCurrent == HYST_IDLE)
  523. {
  524. LED_On(LED_MINOR_R);
  525. LED_On(LED_MINOR_G);
  526. stateCurrent = HYST_UP;
  527. log_event_data(LOG_ALARM_POWER, "Авария");
  528. // Отправка трапа о завышении
  529. SNMP_SendUserTrap(POWER_ALARM);
  530. flUpdateLog = true;
  531. }
  532. }
  533. /* Отслеживается нормализация */
  534. else if (load < (UPS_LOAD - UPS_LOAD_HIST))
  535. {
  536. UPS.Alarm = (UPS.Alarm & 0x0e);
  537. if (stateCurrent == HYST_UP)
  538. {
  539. LED_Off(LED_MINOR_R);
  540. LED_Off(LED_MINOR_G);
  541. stateCurrent = HYST_IDLE;
  542. log_event_data(LOG_ALARM_POWER, "Норма");
  543. // Отправка трапа о нормализации
  544. SNMP_SendUserTrap(POWER_NORM);
  545. flUpdateLog = true;
  546. }
  547. }
  548. }
  549. /**
  550. * @brief Мониторинг температуры
  551. */
  552. void UPS_TemperatureMonitor(void)
  553. {
  554. float temperature;
  555. static uint8_t stateCurrent = HYST_IDLE;
  556. temperature = UPS.Temp;
  557. /* Отслеживается переход через верхнюю границу */
  558. if (temperature > UPS_TEMPERATURE)
  559. {
  560. flCriticalAlarm = true;
  561. UPS.Alarm = (UPS.Alarm & 0x0d) | (1 << 1);
  562. if (stateCurrent == HYST_IDLE)
  563. {
  564. stateCurrent = HYST_UP;
  565. log_event_data(LOG_ALARM_TEMP, "Авария");
  566. // Отправка трапа о завышении
  567. SNMP_SendUserTrap(BATTERY_TEMPERATURE_ALARM);
  568. flUpdateLog = true;
  569. }
  570. }
  571. /* Отслеживается нормализация */
  572. else if (temperature < (UPS_TEMPERATURE - UPS_TEMPERATURE_HIST))
  573. {
  574. UPS.Alarm = (UPS.Alarm & 0x0d);
  575. if (stateCurrent == HYST_UP)
  576. {
  577. stateCurrent = HYST_IDLE;
  578. log_event_data(LOG_ALARM_TEMP, "Норма");
  579. // Отправка трапа о нормализации
  580. SNMP_SendUserTrap(BATTERY_TEMPERATURE_NORM);
  581. flUpdateLog = true;
  582. }
  583. }
  584. }
  585. /**
  586. * @brief Мониторинг параметра upsParams.connect
  587. */
  588. void UPS_ConnectMonitor(void)
  589. {
  590. static bool isValueRecv = false;
  591. static uint8_t connectOldState = 0;
  592. uint8_t connectCurrent;
  593. connectCurrent = UPS.Present;
  594. UPS.Alarm = (UPS.Alarm & 0x0b) | ((connectCurrent^1) << 2);
  595. if (!isValueRecv) {
  596. isValueRecv = true;
  597. connectOldState = connectCurrent;
  598. if (!connectCurrent){
  599. log_event_data(LOG_ALARM_UPS, "Авария");
  600. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  601. flUpdateLog = true;
  602. }
  603. else{
  604. log_event_data(LOG_ALARM_UPS, "Норма");
  605. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  606. flUpdateLog = true;
  607. }
  608. return;
  609. }
  610. if (!connectCurrent)
  611. flCriticalAlarm = true;
  612. // Значение параметра изменилось
  613. if (connectCurrent != connectOldState)
  614. {
  615. if (connectCurrent){
  616. log_event_data(LOG_ALARM_UPS, "Норма");
  617. SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
  618. flUpdateLog = true;
  619. }
  620. else{
  621. log_event_data(LOG_ALARM_UPS, "Авария");
  622. SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
  623. flUpdateLog = true;
  624. }
  625. }
  626. connectOldState = connectCurrent;
  627. }
  628. /**
  629. * @brief Мониторинг параметра upsParams.connect
  630. */
  631. void UPS_BatteryConnectMonitor(void)
  632. {
  633. static bool isValueRecv = false;
  634. static bool flag_alarm_time = false;
  635. static uint8_t AKBconnectOldState = 0;
  636. uint8_t AKBconnectCurrent;
  637. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  638. uint8_t i = 0;
  639. static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  640. uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
  641. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
  642. CurrROtype_Sourse[i] = sSettings.sInOuts.ro_type_source[i];
  643. #endif
  644. if(((UPS.Status >> 7) & 0x01) == 0)
  645. AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
  646. else{
  647. AKBconnectCurrent = 0;
  648. }
  649. UPS.Alarm = (UPS.Alarm & 0x07) | (AKBconnectCurrent << 3);
  650. if (!isValueRecv) {
  651. isValueRecv = true;
  652. AKBconnectOldState = AKBconnectCurrent;
  653. if (AKBconnectCurrent){
  654. log_event_data(LOG_ALARM_AKB, "Авария");
  655. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  656. flUpdateLog = true;
  657. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  658. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  659. #endif
  660. }
  661. else{
  662. log_event_data(LOG_ALARM_AKB, "Норма");
  663. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  664. flUpdateLog = true;
  665. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  666. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  667. #endif
  668. }
  669. return;
  670. }
  671. // Значение параметра изменилось
  672. if (AKBconnectCurrent != AKBconnectOldState)
  673. {
  674. if(flag_alarm_time){
  675. flag_alarm_time = false;
  676. if (!AKBconnectCurrent){
  677. log_event_data(LOG_ALARM_AKB, "Норма");
  678. SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
  679. flUpdateLog = true;
  680. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  681. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
  682. #endif
  683. }
  684. else{
  685. log_event_data(LOG_ALARM_AKB, "Авария");
  686. SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
  687. flUpdateLog = true;
  688. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  689. relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
  690. #endif
  691. }
  692. }
  693. else{
  694. flag_alarm_time = true;
  695. }
  696. }
  697. #if defined HARDWARE_BT6706 || HARDWARE_BT6708
  698. else{
  699. flag_alarm_time = false;
  700. if (AKBconnectCurrent)
  701. relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, OFF_AKB);
  702. }
  703. for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
  704. OldROtype_Sourse[i] = CurrROtype_Sourse[i];
  705. }
  706. #endif
  707. if(!flag_alarm_time){
  708. if (AKBconnectCurrent){
  709. flCriticalAlarm = true;
  710. }
  711. AKBconnectOldState = AKBconnectCurrent;
  712. }
  713. else{
  714. if (AKBconnectOldState){
  715. flCriticalAlarm = true;
  716. }
  717. }
  718. }
  719. /********************************* (C) РОТЕК **********************************/