|
@@ -42,6 +42,7 @@ uint32_t di_cnt[DI_NUMBER]; // счетчики входов
|
|
|
uint16_t di_state[DI_NUMBER]; // состояние входов
|
|
|
uint16_t di_state_bit;
|
|
|
|
|
|
+uint8_t di_load_tmp[DO_NUMBER][5]; // буфер для временных значений
|
|
|
uint16_t di_load_state[DO_NUMBER]; // состояние датчиков обрыва нагрузки
|
|
|
uint16_t di_load_state_bit; // состояние датчиков обрыва нагрузки (битовое поле)
|
|
|
|
|
@@ -136,7 +137,7 @@ void di_load_sens_init(simple_gpio_t *sens)
|
|
|
|
|
|
gpio_default_para_init(&gpio_init_struct);
|
|
|
|
|
|
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
|
|
|
+ gpio_init_struct.gpio_pull = GPIO_PULL_UP;
|
|
|
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
|
|
|
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
|
|
|
gpio_init_struct.gpio_pins = sens->pin;
|
|
@@ -255,11 +256,6 @@ void debounce(void)
|
|
|
// TODO отрефакторить функцию
|
|
|
void di_task(void *params)
|
|
|
{
|
|
|
- uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
|
|
|
- uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
|
|
|
- uint8_t led_index = 0;
|
|
|
- flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
|
|
|
-
|
|
|
for (;;)
|
|
|
{
|
|
|
// Дискретные входы
|
|
@@ -280,7 +276,29 @@ void di_task(void *params)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ vTaskDelay(100);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// di_load_tmp[]
|
|
|
+void di_load_task(void *params)
|
|
|
+{
|
|
|
+ uint8_t out_state = 0; // текущее состояние выхода (для определения аварий)
|
|
|
+ uint8_t out_value = 0; // текущее значение на выходе (для определения аварий)
|
|
|
+ uint8_t led_index = 0;
|
|
|
+ flag_status in_err_state = RESET; // текущее состояние на датчике аварий (значение на пине)
|
|
|
+
|
|
|
+ uint8_t tmp_index = 0;
|
|
|
+ bool buffer_full = false;
|
|
|
+
|
|
|
+ for (;;)
|
|
|
+ {
|
|
|
+ if (tmp_index == 5) {
|
|
|
+ tmp_index = 0;
|
|
|
+ buffer_full = true;
|
|
|
+ }
|
|
|
+
|
|
|
// Датчики обрыва нагрузки и нисправность выходов
|
|
|
for (int i = 0; i < DI_NUMBER; i++)
|
|
|
{
|
|
@@ -302,8 +320,16 @@ void di_task(void *params)
|
|
|
led_index = i - 4 + 20;
|
|
|
|
|
|
// Текущее состояние пина аварий
|
|
|
- in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
|
|
|
+ //in_err_state = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
|
|
|
+
|
|
|
+ di_load_tmp[i][tmp_index] = gpio_input_data_bit_read(di_load[i].port, di_load[i].pin);
|
|
|
+
|
|
|
+ // Пока буфер не заполнен нельзя принять оценить состояние входов
|
|
|
+ if (!buffer_full)
|
|
|
+ continue;
|
|
|
|
|
|
+ in_err_state = di_load_tmp[i][0]*di_load_tmp[i][1]*di_load_tmp[i][2]*di_load_tmp[i][3]*di_load_tmp[i][4];
|
|
|
+#if 1
|
|
|
// Если выход разомкнут (соответствующий бит в 0),
|
|
|
// то обновляем слово состояний датчиков обрыва нагрузки
|
|
|
if (out_value == 0)
|
|
@@ -339,8 +365,12 @@ void di_task(void *params)
|
|
|
leds[led_index].state = LED_OFF;
|
|
|
}
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
- vTaskDelay(100);
|
|
|
+ tmp_index++;
|
|
|
+
|
|
|
+
|
|
|
+ vTaskDelay(2);
|
|
|
}
|
|
|
}
|
|
|
|