АБАК ПЛК
Руководство по настройке и программированию
×

Основные принципы работы планировщика

 
В Abak.IDE реализован вытесняющий планировщик задач, обеспечивающий справедливое распределение ресурсов. Когда несколько задач имеют одинаковый приоритет, процессорное время распределяется между ними равномерно. Если приоритеты различаются, то первыми всегда выполняются задачи с более высоким приоритетом (которому соответствует меньшее числовое значение).
 
Ключевые диапазоны
Приоритет Abak.IDE
Системный приоритет (Linux)
Назначение
0–15
Высокие (-99…-50)
Критические системные задачи (редко используются в пользовательских проектах). Выставление приоритетов ниже 15 не рекомендуется.
15
~-53
Системный планировщик. Рекомендуется только для MainTask (резервирование, синхронизация)
16–31
20
Внутреннее планирование Abak.IDE. Пользовательские задачи (основная логика, коммуникации)
 
Важно! Задачи с приоритетом 15 и ниже имеют преимущество перед системными процессами. Задачи 16 - 31 конкурируют за процессорное время с фоновыми процессами ОС.
 
Рекомендуемая схема приоритетов
Для типового проекта с 3-5 задачами рекомендуется следующее распределение приоритетов:
1.     MainTask (приоритет 15)
Ключевая задача, к которой привязан механизм резервирования. От её своевременного выполнения зависит синхронизация между контроллерами. Важно минимизировать нагрузку в этой задаче – вынести всю необязательную логику в другие задачи, чтобы гарантировать соблюдение временных рамок.
2.     Основная логика управления (приоритет 16-18)
Стандартный приоритет для основных алгоритмов управления: ПИД-регуляторов, конечных автоматов и другой критичной логики.
3.     Коммуникационные задачи (приоритет 18-20)
Задачи обработки протоколов связи, например Modbus.
4.     Диагностика и визуализация (приоритет 20+)
Диагностические задачи, сбор информации о контроллере через внутренние теги, анализ интерфейсов и прочее. Намеренно устанавливаются с самым низким приоритетом, чтобы не мешать выполнению критически важных функций.
Практический пример конфигурации:
MainTask (резервирование) – 15
PID_Regulators – 18
ModbusTcp – 19
ModbusRTU – 20
Diag – 21
 
Ключевые рекомендации
1.     Всегда закладывайте временной резерв для MainTask. Если выполнение задачи начинает занимать более 30% отведённого ей временного интервала, следует вынести часть логики в отдельные задачи.
2.     Устанавливайте приоритет для задач обмена данными в зависимости от их критичности. Например: высокий приоритет (например, 16): обмен с системами безопасности (OpenSafety), низкий приоритет (например, 19): менее критичные соединения.
3.     Диагностические задачи должны иметь минимальный приоритет. Если такие задачи оказывают влияние на работу системы, увеличьте интервал их выполнения.
4.     Избегайте создания более 2 – 3 задач с одинаковым приоритетом во избежание непредсказуемых задержек из-за работы «справедливого планировщика».
5.     С увеличением общего количества задач в проекте доля времени выполнения каждой задачи (в процентах от её интервала) должна уменьшаться.
6.     Настройку временных интервалов необходимо выполнять с учётом времени выполнения задач, так как это напрямую влияет на загрузку контроллера. Суммарное время выполнения всех задач не должно превышать 70% от общего цикла. При таком значении общая загрузка контроллера может достигать 100%. Универсальных рекомендаций не существует. На этапе проектирования необходим анализ времени выполнения всех задач в совокупности.
Пример: если все задачи равномерно сбалансированы (выполняются за равные относительные промежутки времени),  а их суммарное время выполнения составляет 70% от общего цикла, то можно провести следующий расчет.
Расчет значений для равносбалансированных задач
 
На рисунке представлены расчёты значений для равносбалансированных задач с разными периодами. В качестве  примера  приведены  четыре  задачи  с  периодами 200 мс, 400 мс, 600 мс и 1000 мс, среднее  время  выполнения  которых  составляет 35 мс, 70 мс, 105 мс и 175 мс соответственно.
Таким образом, в течение одной секунды процессор будет затрачивать время на их выполнение следующим образом:
Задача с периодом 200 мс: выполнится 5 раз, общее процессорное время составит 35 мс × 5 = 175 мс.
Задача с периодом 400 мс: выполнится 2 или 3 раза (в зависимости от фазы запуска), общее процессорное время составит 70 мс × 2 = 140 мс или 70 мс × 3 = 210 мс.
Задача с периодом 600 мс: выполнится 1 или 2 раза, общее процессорное время составит 105 мс × 1 = 105 мс или 105 мс × 2 = 210 мс.
Задача с периодом 1000 мс: выполнится 1 раз, общее процессорное время составит 175 мс.
Таким образом, в наихудшем случае суммарное время, затрачиваемое процессором на задачи, составляет: 35 × 5 + 70 × 3 + 140 × 2 + 175 = 840 мс. Фактически, это означает 100% нагрузку на процессор, поскольку за временной интервал в 1 секунду на пользовательские задачи было израсходовано 840 мс.
Идеальным является случай, когда на все пользовательские задачи в Abak.IDE суммарно затрачивается менее 50% времени процессора.
7.     Превышение джиттера (> 10 мс) в задаче резервирования, выявленное при мониторинге через диагностику Abak.IDE, является признаком некорректной приоритезации. Для остальных задач допускается больший джиттер из-за конкуренции за ресурсы с системными службами.
8.     Если максимальное время цикла близко к заданному интервалу – требуется оптимизация, либо увеличение заданного интервала выполнения.
 
Проблемы, вызванные неправильным определением приоритетов
  • Перегрузка контроллера задачами с одинаковым приоритетом.
Если несколько задач с одинаковым приоритетом (например, 20) становятся готовыми к выполнению в одном временном интервале, планировщик распределяет процессорное время между ними равномерно.
Последствия:
1. 100% загрузка контроллера. Задачи не успевают завершаться в отведённые временные рамки, что приводит к накоплению задержек.
2. Увеличение джиттера (задержек запуска). Время запуска и выполнения задач становится нестабильным.
3. Рост времени переключения контекста. Чем чаще происходит переключение между задачами, тем больше процессорное время тратится не на полезную работу, а на обслуживание планировщика.
Пример:
Три задачи с приоритетом 20 и циклом 100 мс. В идеальной ситуации каждая задача должна выполняться за ~10 мс. Однако из-за частых переключений и равномерного распределения времени ЦП фактическое время выполнения каждой задачи может возрасти до 20 – 25 мс. Это приводит к накоплению задержек от цикла к циклу и общему росту нагрузки на систему.
 
2. Проблемы с резервированием (MainTask).
Основная задача (MainTask, приоритет 15) может быть перегружена логикой либо её выполнение может блокироваться другими задачами с равным или высоким приоритетом:
1.     Нарушение временных циклов синхронизации между контроллерами.
2.     Ложные переключения при резервировании (из-за пропуска циклов основной задачи).
Онлайн помощь создана в Dr.Explain