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

This commit is contained in:
andrey 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; // Сброс масок
}