diff --git a/Core/Src/main.c b/Core/Src/main.c index caaf001..239f60a 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -151,216 +151,216 @@ for(i=0;i<10;i++) /* USER CODE BEGIN WHILE */ while (1) { - //=== ===// + //=== БЛОК ПРИНУДИТЕЛЬНОЙ ПАУЗЫ ===// if (flag.force_pause) { - __disable_irq(); // - for(int i = 0; i < flag.pause; i++); // - __enable_irq(); // + __disable_irq(); // Отключаем все прерывания + for(int i = 0; i < flag.pause; i++); // Пустой цикл для задержки + __enable_irq(); // Включаем прерывания обратно } - //=== CAN- ===// - if (CanGO) // CAN- + //=== ОБРАБОТКА CAN-ШИНЫ ===// + if (CanGO) // Флаг разрешения работы с CAN-шиной { - CanGO = 0; // + CanGO = 0; // Сбрасываем флаг - // ( 30000) + // Увеличиваем счетчики ожидания для всех элементов (ограничение 30000) for(i = 0; i < 0x80; i++) if(espero[i] < 30000) espero[i]++; - // CAN- + // Уменьшаем счетчики задержки для двух CAN-каналов for(i = 0; i < 2; i++) if(cancount[i]) cancount[i]--; else - cancell[i] = 0; // , + cancell[i] = 0; // Сброс позиции, если счетчик обнулился } - //=== CAN ===// - for(i = 0; i < 2; i++) // CAN- + //=== ОБРАБОТКА КАНАЛОВ CAN ===// + for(i = 0; i < 2; i++) // Для каждого из двух CAN-каналов { - if (Cancount[i] && !cancount[i]) // + if (Cancount[i] && !cancount[i]) // Если есть задержка и счетчик обнулился { - // + // Поиск следующего элемента для обработки while(1) { - if (cancell[i] >= 0x80) // + if (cancell[i] >= 0x80) // Если достигли конца диапазона { - cancell[i] = 0; // + cancell[i] = 0; // Сброс позиции - if (candid[i]) // + if (candid[i]) // Если есть кандидат для обработки { - candid[i] = 0; // - CanCycle[i]++; // - cancount[i] = CanWait[i]; // - goto Next; // + candid[i] = 0; // Сброс флага кандидата + CanCycle[i]++; // Увеличиваем счетчик циклов + cancount[i] = CanWait[i]; // Устанавливаем задержку + goto Next; // Переход к следующей итерации } } - // + // Проверка маски для определения активных элементов mask = Maska[i][cancell[i] / 0x10] >> (cancell[i] & 0x0F); - if (!mask) // - cancell[i] = (cancell[i] + 0x10) & 0xFFF0; // + if (!mask) // Если маска пустая + cancell[i] = (cancell[i] + 0x10) & 0xFFF0; // Переход к следующей группе else { - // + // Поиск первого установленного бита в маске while (!(mask & 1)) { cancell[i]++; mask >>= 1; } - break; // + break; // Найден активный элемент } } - z = 1; // - // + z = 1; // Флаг нормального состояния + // Проверка превышения времени ожидания if (espero[cancell[i]] > CanRestart[i]) { - county[cancell[i]] = 1; // - z = 0; // + county[cancell[i]] = 1; // Установка флага необходимости отправки + z = 0; // Флаг аварийного состояния } - // + // Проверка изменения данных для отправки if (modbus[cancell[i]] != archiv[cancell[i]]) { - if (cancell[i] == keys) // + if (cancell[i] == keys) // Если это ключевой элемент { - // + // Установка флагов для группы элементов for(j = 0; j < CanRptLen; j++) county[cancell[i] + j] = CanRptVez; } else { - county[cancell[i]] = 1; // + county[cancell[i]] = 1; // Установка флага для одиночного элемента } } - // , + // Обработка элементов, требующих отправки if (county[cancell[i]]) { - // + // Поиск границ группы измененных элементов for(j = 3; j > 0 && !Isit(cancell[i] + j, i, z); j--); for(n = j - 3; n < 0 && !Isit(cancell[i] + n, i, 1); n++); - qua = 1 + j - n; // - cancell[i] += n; // + qua = 1 + j - n; // Расчет количества элементов в группе + cancell[i] += n; // Корректировка позиции - // + // Обработка каждого элемента в группе for(j = 0; j < qua; j++) { n = cancell[i] + j; - archiv[n] = modbus[n]; // - espero[n] = 0; // + archiv[n] = modbus[n]; // Сохранение текущего значения + espero[n] = 0; // Сброс счетчика ожидания - if (county[n]) // + if (county[n]) // Если элемент требует обработки { - county[n]--; // - // + county[n]--; // Уменьшение счетчика + // Если счетчик обнулился и это не циклический элемент if (!county[n] && n != cancyclo + i) - candid[i] = 1; // + candid[i] = 1; // Установка флага кандидата } - // + // Обновление маски активных элементов if (!county[n]) masca[n / 0x10] |= (1 << (n & 0x0F)); } - // CAN- + // Отправка данных через CAN-шину CAN_send(archiv, cancell[i], qua); - cancount[i] = Cancount[i]; // - cancell[i] += qua; // + cancount[i] = Cancount[i]; // Установка задержки + cancell[i] += qua; // Переход к следующей позиции - // + // Проверка завершения обработки всех элементов for(j = 0; j < 8; j++) if ((masca[j] & Maska[i][j]) != Maska[i][j]) break; - if (j == 8) // + if (j == 8) // Если все элементы обработаны { - // + // Сброс соответствующих битов маски for(j = 0; j < 8; j++) masca[j] &= ~Maska[i][j]; - CanRound[i]++; // + CanRound[i]++; // Увеличение счетчика раундов } - // + // Управление параллельной обработкой каналов if (Cancount[i] > 1 && !cancount[!i]) - cancount[!i] = 1; // + cancount[!i] = 1; // Запуск другого канала } else { - cancell[i]++; // + cancell[i]++; // Переход к следующему элементу } } } - Next: // + Next: // Метка для перехода к следующей части цикла - //=== ===// - ReadEnteres(); // + //=== ЧТЕНИЕ ВХОДНЫХ СИГНАЛОВ ===// + ReadEnteres(); // Функция чтения дискретных входов - //=== ===// + //=== УПРАВЛЕНИЕ ВЫХОДНЫМИ СИГНАЛАМИ ===// if (Errors.all | Alarms.all) - Pvt4_OFF; // " " + Pvt4_OFF; // Выключение сигнала "Система ВЭП в норме" else - Pvt4_ON; // " " + Pvt4_ON; // Включение сигнала "Система ВЭП в норме" if (Errors.all) - Pvt3_ON; // " " + Pvt3_ON; // Включение сигнала "Авария системы ВЭП" else - Pvt3_OFF; // " " + Pvt3_OFF; // Выключение сигнала "Авария системы ВЭП" if (Falling_asleep) - Pvt2_ON; // + Pvt2_ON; // Включение сигнала управления else - Pvt2_OFF; // + Pvt2_OFF; // Выключение сигнала управления - //=== ===// - if (Commands != precom) // + //=== ОБРАБОТКА КОМАНД ===// + if (Commands != precom) // Если команды изменились { - command = (~precom | command) & Commands; // + command = (~precom | command) & Commands; // Обновление активных команд } - precom = Commands; // + precom = Commands; // Сохранение текущих команд для следующей итерации - //=== ===// - if (cDefParam) // + //=== ОБРАБОТКА СИСТЕМНЫХ КОМАНД ===// + if (cDefParam) // Команда сброса параметров по умолчанию { cDefParam = 0; - Default_params(); // + Default_params(); // Вызов функции сброса параметров } - if (cSaveParam) // + if (cSaveParam) // Команда сохранения параметров { cSaveParam = 0; - Save_params(); // + Save_params(); // Вызов функции сохранения параметров } - if (cLoadParam) // + if (cLoadParam) // Команда загрузки параметров { cLoadParam = 0; - Load_params(); // + Load_params(); // Вызов функции загрузки параметров } - if (cCanReset) // CAN- + if (cCanReset) // Команда сброса CAN-системы { cCanReset = 0; - // CAN- + // Сброс всех счетчиков и состояний CAN-системы for(i = 0; i < 0x80; i++) - county[i] = 1; // + county[i] = 1; // Установка флагов отправки для всех элементов for(i = 0; i < 2; i++) { - CanCycle[i] = 0; // - CanRound[i] = 0; // - cancount[i] = 0; // - cancell[i] = 0; // + CanCycle[i] = 0; // Сброс счетчиков циклов + CanRound[i] = 0; // Сброс счетчиков раундов + cancount[i] = 0; // Сброс счетчиков задержки + cancell[i] = 0; // Сброс позиций } for(i = 0; i < 8; i++) - masca[i] = 0; // + masca[i] = 0; // Сброс масок }