October 31, 2020

Функции измерения нагрузки ПЛК

Измерение загрузки контроллера можно условно разделить на:

  • измерение нагрузки процессора. Показывает справляется ли вся система в целом: Windows + TwinCAT.
  • Измерение времени исполнения программы в текущем цикле. Укладывается ли текущая ветвь программы в заданное время цикла.
  • Профилирование. Замер времени выполнения отдельных частей программы.

И возвращаясь к теме предыдущего поста: "измерять производительность — это хороший способ узнать, осталось ли что-нибудь за кадром. Иногда это просто любопытство".


Разбор программы



В программе выше используются функции: TC_SysLatency, TC_CpuUsage, GETCPUCOUNTER. Также используется информация из встроенного глобального массива SystemTaskInfoArr[]. Он предоставляет структуру данных SYSTEMTASKINFOTYPE.

TC_SysLatency пропустим, я по прежнему не вижу в нем смысла. TC_CpuUsage возвращает целое число процентов нагрузки на процессор. Это значение должно совпадать с графиком в System Manager, но это не точно и это было видно выше.

GETCPUCOUNTER работает независимо от счетчика в CPU. Это счетчик 100 наносекундных циклов. Увеличение на единицу соответствует прошедшему времени в 100 нс. Увеличение на 10 соответствует 1 микросекунде. Посмотрим как перевести в миллисекунды с десятичными долями:

52'108'000 наносекунд = 52'108'0 100*нс = 52'108 микросекунд = 52,108 миллисекунд.

LREAL cpuCntMs := (cpuCntLoDW + cpuCntHiDW) / 10000.0

Счетчик можно использовать для профилирования времени выполнения отдельных блоков программы внутри цикла. Можно узнать сколько времени занимает выполнение подпрограммы или функционального блока.

SystemTaskInfoArr[] в том же цикле отдает структуру SYSTEMTASKINFOTYPE. Индексом для массива служит номер текущей задачи. Индекс можно получить с помощью функции GETCURTASKINDEX в этом же цикле и начать его использовать уже в следующей строке программы.

Структура SYSTEMTASKINFOTYPE содержит состояние предыдущего цикла. Эта структура содержит:

  • cycleTimeExceeded — TRUE = время цикла превышено, FALSE = время выполнения в норме. Значение параметра не фиксируется, в каждом цикле оно может быть разным. Всё зависит от времени исполнения предыдущего цикла.
  • cycleTime — максимально возможное время на выполнение цикла. Задается в сотнях наносекунд. Для перевода в миллисекунды, разделите значение cycleTime на 10000.0.
  • lastExecTime — время выполнения программы в предыдущем цикле. Предыдущего, потому что текущий цикл еще только выполняется, вот прямо сейчас, в данный момент. Значение в сотнях наносекунд.
  • cycleCount — номер текущего цикла от момента включения контроллера. Если номер цикла умножить на длительность цикла cycleTime, можно узнать сколько прошло времени с момента включения контроллера.

 

В TwinCAT 3 массив поменял имя на _TaskInfo[], а структура стала более подробной и теперь называется PlcTaskSystemInfo.

October 30, 2020

Нагрузка процессора CX8090

Измерять производительность — это хороший способ знать, что осталось за кадром. Правда иногда это просто любопытство. В случае с бюджетным CX8090, все немного тяжелее, и не только по причине слабого процессора частотой в 400 МГц. Кстати, на подходе CX7000, и там будет целых 480 МГц, новый ARM Cortex™-M7 против старого ARM9.

При первом подключении к CX8090, мы видим постоянную загрузку процессора в 10%. Так сделано специально — измерение нагрузки добавляет нагрузку на процессор. Внезапно, эта тема обозрена в статье справочной системы CPU load. Не стоит пренебрегать таким полезным ресурсом, и вообще полезно гуглить, ведь так удобнее искать.

В рабочем режиме измерение лучше отключить, лишняя нагрузка не нужна. И наоборот — на этапе отладки полезно включить. Для этого необходимо запустить редактор реестра: Start → Run... → regedit. И внести изменения в один ключ: HKLM/SOFTWARE/BECKHOFF/TWINCAT/RTime/EnableRTimeMeasurement. 0 = отключено, 1 = включено. Замеры производятся раз в 10 миллисекунд. Точность замеров нагрузки не гарантируется, если циклы задач длиннее 10 мс.

И здесь пост должен был закончиться… посмотрим, как будет вести себя нагрузка, если время цикла увеличить с 10 мс до 50 мс. Просто увеличим время цикла в пять раз.


При реальной нагрузке приблизительно в 30-33% график плющит и колбасит от нуля до реального значения. Кстати, чтобы работал нижний график System Latency, его нужно включить в реестре. Рядом с параметром EnableRTimeMeasurement лежит параметр EnableLatencyMeasurement; 1 = работает, 0 = отключено.

И здесь пост должен был закончиться… но я набросал небольшую программу, дублирующую показометры системной нагрузки. Внезапно программные функции дали стабильный результат. Показания из программы я снимал через Scope первой версии. Просто чтобы потренироваться в работе на старых системах.

В результате получил ровный, красный график нагрузки на процессор. Latency выведен зря, никакой пользы я от него не нашел.


Превышаем лимит нагрузки

Превысим нагрузку процессора и начнем с графика, показывающего времени цикла:

Время цикла по прежнему 50 мс. На графике уставлен потолок в 60 мс, чтобы график было видно. Потолок устанавливается правой кнопкой мыши, Settings…

Значение Total показывает 52,108 мс, что на 2 мс больше лимита времени цикла. Здесь же начинает увеличиваться счетчик превышения лимита Exceed counter. Все очень плохо. Посмотрим на график нагрузки процессора. Сначала системный, затем программный:


Когда значения не совпадают

Результат на графиках выше вполне ожидаемый, но(!) так бывает не всегда. На следующих трех графиках время цикла находится в допустимых пределах, а нагрузка процессора якобы превышена. Что происходит на самом деле понять трудно.


Выводы

Стоит обратить внимание на примечания в справочной системе. Графики времени цикла и нагрузки на процессор нужно анализировать по отдельности. Показания нагрузки на процессор строится как-то хитро, даже при времени цикла ≤10мс. Например, при трехкратном превышении времени цикла можно получить нагрузку на процессор в 56%. Это некорректное показания. Значит для тонкой настройки ПЛК желательно использовать программный способ. Все это относится конкретно к CX8090 и TwinCAT 2.

Разбор программы для измерения и краткое описание функций будет отдельным постом чуть позже.

October 29, 2020

Блоки питания Бекхофф

В прайсе Бекхоффа появились блоки питания. Официальное описание находится в разделе ввода-вывода:
beckhoff.com → Products → I/O → Power supplies.

PS3031-2440-0000 (Изображение: Beckhoff Automation)

Изображение: Beckhoff Automation

Часть моделей пересекается, но различаются в габаритах, сертификатах, диагностике, контроле, количестве входных фаз. Толстая иллюстрация выше, содержит все кнопки, индикаторы и разъемы. Есть блоки питания потоньше. Деление по модельным рядам для маркетинга:

  • PS1000 — небольшие решения (2,5–20 ампер).
  • PS2000 — стандартные решения (5–20 ампер).
  • PS3000 — повышенная нагрузка (10–40 ампер).

Для инженеров как обычно смотрим количество фаз в питающей сети, ток/мощность и необходимость в диагностических входах-выходах. Подробности смотрите в инструкциях, далее краткий обзор.


1 фазное напряжение

Номинальное входное напряжение — переменное 100..240 вольт. Допускается диапазон 85..264 В. Предельный диапазон от 80 до 300 вольт может использоваться только при плохих входных линиях питания и при прочих просадках-выбросах. Максимально допустимое входное напряжение может достигать 300 вольт, но не дольше 500 миллисекунд.

На старте рабочего режима предусмотрен гистерезис: блок питания включается при 80 вольтах на входе и отключается при 70 В.


3 фазное напряжение

Номинальное входное напряжение — 3 фазное, переменное 380..480 вольт. Допускается диапазон 323..576 В. На старте рабочего режима предусмотрен гистерезис: блок питания включается при 305 вольтах на входе и отключается при 275 В. При включении происходит задержка номинального напряжения на выходе в 500 / 600 мс. Зависит от входного напряжение 400 / 480 В.


Выход `DC-OK`

Релейный контакт `DC-OK` работает также как индикатор `DC-OK LED`. Контакт отражает состояние питания на выходе блока питания.

  • Контакт замыкается, когда выходное напряжение достигает 90% уставки.
  • Контакт размыкается, когда выходное напряжение проседает ниже 90% уставки.
  • Игнорируются просадки напряжения короче 1 миллисекунды. Контакт остается замкнутым.
  • Просадки длиннее 1 миллисекунды размыкают контакт на 250 миллисекунд.


Вход выключения (Shut-down Input)

Позволяет отключать питание на выходе блока питания. Отключение происходит мгновенно, а включение задерживается на 350 миллисекунд (возможно, но не точно, необходимо удержать вход активным дольше 350мс).

Вход способен работать в трех режимах:

  • Перемычка. Замыкает контакты, когда необходимо отключить питание. В рабочем режиме перемычка отсутствует, то есть разомкнута. Сюда подойдет кнопка или реле.
  • Открытый коллектор. Управление током.
  • Внешнее питание. Рабочий режим, когда на контактах отключения больше 4 вольт. Выход БП отключается, когда напряжение на контактах падает ниже 1 вольта.


Объединение нескольких БП

Обязательно использовать полностью идентичные модели блоков питания.

Объединение блоков питания ухудшает параметры выходного тока: ток утечки, эл-магнитные наводки, пусковой ток, гармоники, и тому подобное.

Общая рекомендация: не объединять несколько БП.


Последовательное подключение

Повышаем выходное напряжение. Можно соединять несколько БП вплоть до 150В. Начиная с 60 В требуется повышенная осторожность и соблюдение мер безопасности. Не допускать обратного напряжения в генераторных режимах (ЭДС самоиндукции, return voltage immunity, Back-E.M.F.).


Параллельное подключение

Получаем большую мощность, то есть больший максимальный ток. Можно резервировать блоки питания, разделяя между ними нагрузку. Схемы резервирования 1+1 или N+1. Оба варианта требует включения диодных сборок или других буферных устройств.

Рекомендуется оставить заводские настройки для всех БП или согласовать выходное напряжение с точностью ±100 милливольт. Читайте инструкцию!

По умолчанию в блоке питания установлен одиночный режим (Single Use). БП работает в одиночном режиме, если джампер или переключатель `Parallel Use` отсутствуют.

В параллельном режиме (Parallel Mode) блок питания допускает разброс выходного напряжения до 2,5 вольт. В одиночном режиме разброс меньше, он равен 100 милливольтам. Характеристика жестче в одиночном режиме и мягче в параллельном режиме. На холостом ходу в параллельном режиме выходное напряжение на 4% больше напряжения при номинальной нагрузке. Так сделано для лучшей балансировки блоков питания между собой.