ups_monitor.c 20 KB

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