|
@@ -252,8 +252,13 @@ void debounce(void)
|
|
|
|
|
|
|
|
|
// Периодический опрос дискретнрых входов и датчиков обрыва нагрузки.
|
|
|
+// TODO отрефакторить функцию
|
|
|
void di_task(void *params)
|
|
|
{
|
|
|
+ uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
|
|
|
+ uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
|
|
|
+ flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
|
|
|
+
|
|
|
for (;;)
|
|
|
{
|
|
|
// Дискретные входы
|
|
@@ -273,33 +278,50 @@ void di_task(void *params)
|
|
|
leds[i].state = LED_ON;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
|
|
|
- // Датчики обрыва нагрузки
|
|
|
+ // Датчики обрыва нагрузки и нисправность выходов
|
|
|
for (int i = 0; i < DI_NUMBER; i++)
|
|
|
- {
|
|
|
- di_load_state[i] = (uint16_t)gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
|
|
|
-
|
|
|
- // Текущее состояние датчиков нагрузки.
|
|
|
- if (!di_load_state[i]) {
|
|
|
- di_load_state_bit &= ~(1 << i); // снять бит
|
|
|
+ {
|
|
|
+ // Определяем текущие состояние выхода
|
|
|
+ if (save_mode_get())
|
|
|
+ {
|
|
|
+ out_state = settings.dout_save[i].state;
|
|
|
+ out_value = settings.dout_save[i].value;
|
|
|
}
|
|
|
- else {
|
|
|
- di_load_state_bit |= 1 << i;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ out_state = settings.dout[i].state;
|
|
|
+ out_value = settings.dout[i].value;
|
|
|
}
|
|
|
+
|
|
|
+ // Текущее состояние пина аварий
|
|
|
+ in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
|
|
|
|
|
|
- // Установка битов достоверности
|
|
|
- // Если 0 (выход разомкнут), то состояние достоверно и нужно
|
|
|
- // выставить соответствующий бит
|
|
|
- if (!(output_state_bit & (1 << i))) {
|
|
|
- di_credibility_state_bit |= 1 << i;
|
|
|
+ // Если выход разомкнут (соответствующий бит в 0),
|
|
|
+ // то обновляем слово состояний датчиков обрыва нагрузки
|
|
|
+ if (out_value == 0)
|
|
|
+ {
|
|
|
+ if (out_state == 0)
|
|
|
+ di_load_state_bit &= ~(1 << i);
|
|
|
+ else if (in_err_state == RESET)
|
|
|
+ di_load_state_bit &= ~(1 << i);
|
|
|
+ else
|
|
|
+ di_load_state_bit |= 1 << i;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Если выход замкнут (соответствующий бит в 1),
|
|
|
+ // то обновляем слово состояний неисправности выходов
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (out_state == 0)
|
|
|
+ di_output_state_bit &= ~(1 << i);
|
|
|
+ if (in_err_state == RESET)
|
|
|
+ di_output_state_bit |= 1 << i;
|
|
|
+ else
|
|
|
+ di_output_state_bit &= ~(1 << i);
|
|
|
}
|
|
|
- else {
|
|
|
- di_credibility_state_bit &= ~(1 << i);
|
|
|
- }
|
|
|
}
|
|
|
-
|
|
|
vTaskDelay(100);
|
|
|
}
|
|
|
}
|