ups_monitor.c 19 KB

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