смена кодировки

This commit is contained in:
2025-08-22 18:25:51 +03:00
parent d6c3e5d7be
commit a7d6faca8b

View File

@@ -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; // Сброс масок
}