Русский
Русский
English
Статистика
Реклама

Блог компании цитм экспонента

Как устроена силовая установка пассажирского самолета

16.12.2020 18:10:53 | Автор: admin
Всем привет. Недавно я читал ликбез очередному студенту на тему общего устройства оборудования самолёта. Вводный рассказ, хоть и отработанный до автоматизма, отнял пару часов времени и выявил необходимость ещё в двух-трёх вводных. Но лень двигатель прогресса и я наконец дозрел до оформления всех этих лекций в печатном виде. А там, где есть внутренняя методичка, недалеко и до публикации на Хабре: вдруг, кому ещё интересно почитать будет.

Перед началом изложения хочу оговориться, что моя основная специализация бортовое оборудование так что из моего описания может вполне получиться идеальный самолёт для технолога. Тех, кого этот подход не пугает, а также всех тех, кому интересно зачем в кабине экипажа нужны все эти кнопки и ручки прошу оценить первую публикацию: Силовая установка.





Кликабельная картинка, чтобы рассмотреть получше:






Про силовую установку


Силовая установка общее название двигателей летательный аппаратов. Начну с них потому, что без двигателей самолет не самолет, а в лучшем случае планер. Цена двигателей, к слову, составляет половину стоимости авиалайнера и компетенциями в разработке современных гражданских авиадвигателей обладают гораздо меньше стран, чем тех, кто обладают компетенциями в разработке самолетов.

На авиалайнерах сейчас ставят почти исключительно двухконтурные турбореактивные двигатели (ТРД). Вот принципиальная схема такого двигателя:



Детали устройства можно прочитать во многих источниках, начиная с Википедии. Для нас, электронщиков, важно понимать следующие факты о работе такого двигателя:

  1. Компрессор сжимает забираемый снаружи воздух перед подачей его в камеру сгорания,
  2. В камере сгорания к воздуху подмешивается топливо,
  3. В камере сгорания происходит постоянное горение топливовоздушной смеси, приводящее к тому, что разогретый газ расширяется в сторону турбины,
  4. Турбина крутится под воздействием расширяющихся газов и крутит компрессор и/или вентилятор,
  5. Как правило, в двигателях бывает две связки турбина-компрессор: высокого давления и низкого давления. Они могут крутиться независимо друг от друга,
  6. Основную тягу, как это ни странно, даёт не горячий газ, выходящий из сопла, а вращение вентилятора,
  7. Обороты и тягу двигателя можно регулировать подачей топлива,
  8. В большинстве современных авиационных двигателей работой двигателя управляет специальный компьютер FADEC. Этот прибор анализирует параметры работы двигателя, внешние условия и управляющие сигналы от органов управления двигателем и управляет всеми приводами, влияющими на работу двигателя, например, топливным краном. Часть названия Full Authority означает, что:
    • FADEC отвечает за ВСЕ аспекты работы двигателя,
    • Только FADEC отвечает за работу двигателя, т. е. нет никакого резервного контура управления, механических тяг управления газом и т. д.
  9. Кроме сигналов от органов управления двигателем FADEC анализирует данные от:
    • Системы воздушных сигналов (СВС): давление и температуру наружного воздуха, воздушную скорость самолёта для уточнения параметров работы,
    • Датчиков обжатия шасси для дополнительного контроля возможности включения реверса,
      Скрытый текст
      Обжатие шасси термин, означающий, что самолёт не летит, опираясь на крылья, а стоит/едет по земле, опираясь на шасси. При этом амортизаторы шасси сжимаются и специальные датчики датчики обжатия шасси регистрируют это. Важно понимать, что коснуться полосы колёсами и обжать шасси это два разных события.

    • Системы кондиционирования воздуха чтобы вносить поправки в режимы работы двигателя в зависимости от количества воздуха, отбираемого для пассажирского салона и/или для работы пневматической системы для запуска второго двигателя.
  10. Основным параметром, ограничивающим предел мощности двигателя, является температура газов сразу за камерой сгорания. Разработчики двигателя хотели бы её поднять, но фундаментальные свойства известных материалов пока не позволяют этого сделать.

Как запускать двигатель


Чтобы запустить двигатель, надо раскрутить турбину высокого давления, подать топливо и дать первоначальную искру. После того, как турбина раскрутится примерно до 50% оборотов двигатель начнёт раскручивать себя сам.

Первоначальную раскрутку двигателя можно осуществлять электрическим стартер-генератором (для маленьких двигателей) или специально поданным воздухом высокого давления от пневматической системы. К слову, воздух высокого давления в пневматической системе берется от второго (уже запущенного) двигателя, вспомогательной силовой установки (ВСУ) или внешнего источника.

Скрытый текст
ВСУ это такой небольшой (относительно основных, конечно) газотурбинный двигатель, который предназначен для генерации электроэнергии, давления в гидросистемах и воздуха высокого давления для запуска основных двигателей. Он меньше и его проще запустить электромотором от батарей. А раскручивать большие двигатели можно уже с его помощью. Также его используют, когда техникам надо поработать с оборудованием, а гонять большие двигатели, чтобы получить источник энергии, нецелесообразно. Подробнее про ВСУ расскажу в другой публикации.


Пример пульта управления, используемого для запуска двигателя:


Для автоматического запуска надо выполнить следующие действия:

  1. Переключатель ENG START (1) перевести в положение IGN/ON
  2. Тумблер ENG MASTER (2) перевести в положение ON (вперёд). В этот момент FADEC:
    • Откроет кран пневматической системы для раскрутки турбины и компрессора высокого давления
    • Откроет кран топливной системы чтобы было чему гореть
    • Даст искру на свечи зажигания
  3. Контролировать процесс запуска. Если что-то пойдёт не так немедленно перевести тумблер запуска обратно в положение OFF
  4. Когда двигатель успешно выйдет на обороты малого газа запустить второй двигатель по аналогичной процедуре
  5. Когда оба двигателя запустятся перевести тумблер ENG START в положение OFF во время нормальной работы двигателя дополнительные искры на свечах зажигания не нужны
  6. Во время автоматического запуска двигателя кнопки ручного запуска (3) не используются

Иногда нам надо покрутить двигатель, но не заводить его. Например, для проверок или чтобы помыть его внутренности керосином после консервации. В этом случае переключатель ENG START надо переводить в положение CRANK (прокрутка). Вся процедура запуска будет та же, но искры на свечах не будет. Нет искры нет огня.

Как управлять двигателем


Управление двигателями осуществляется с помощью рычагов управления двигателями (РУД).


На каждый двигатель свой рычаг. Тут всё просто: толкаем рычаг от себя двигатель крутится быстрее, тяга растёт. Тянем рычаг на себя крутится медленнее. Так как РУД не связан с топливным дросселем напрямую, можно не бояться, что мы сожжем двигатель большим количеством топлива или заглушим недостаточным. FADEC в любом случае не даст ему превысить предельную температуру выхлопных газов или заглохнуть. Кстати, с ограничением температуры выхлопных газов связан тот факт, что в жару и/или на высокогорных аэродромах двигатель может выдать меньшую тягу.

В районе малого газа у рычага упор. Чтобы разблокировать перевод рычагов в зону режимов реверса, надо потянуть за специальную скобу. При реверсе двигателя специальные створки разворачивают поток от вентилятора двигателя в обратном направлении помогая самолету остановиться:


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

Для включения реверса FADEC анализирует не только положение РУДов, но и датчики обжатия шасси, так что случайно в воздухе запустить реверс невозможно.

Ещё у двигателей, бывает специальный аварийный режим. Включить его можно пересиливанием РУДов в положение, находящееся дальше взлетного режима (на картинке это положение APR Automatic Power Reserve). Такой режим используется только при отказе одного из двигателей при взлете, когда надо гарантировать набор высоты в ущерб ресурса рабочего двигателя. Правда после приземления работающий в аварийном режиме двигатель придется перебрать.

Про индикацию и сигнализацию


Данные работы двигателей, как правило, отображаются на неотключаемой части центрального дисплея пилотов и на специальной странице с расширенными данными по двигателю.


В постоянно индицируемом окне статуса работы двигателя доступны следующие данные:

а. Текущие обороты вентилятора двигателя (напрямую влияют на тягу)
б. Температура выхлопных газов параметр работы двигателя, часто ограничивающий максимальную тягу. FADEC ограничивает ток топлива в том числе, чтобы не расплавить конструкцию лопаток турбин. Лётчику тоже важно понимать, почему обороты не растут, хотя он просит
в. Заданные обороты вентилятора двигателя (разгон двигателя с малого газа до взлётного режима занимает десятки секунд и текущие обороты не всегда совпадают с заданными)
г. Обороты турбины высокого давления. Помните, что турбин две и они работают независимо? Так вот данные оборотов турбины высокого давления важны при запуске двигателя. В полёте контролировать их не надо
д. Текущий расход топлива
е. Признак включения реверса
ж. Установившийся режим работы двигателя (малый газ, взлётный, набор высоты)

На специальной странице дополнительных параметров работы двигателя может выводиться, например, такая информация как:

  • Уровень, давление и температура масла,
  • Уровень вибрации двигателя,
  • Количество топлива, израсходованного с момента последнего запуска,
  • Давление воздуха в пневматической системе,
  • И т.д.

Варианты газотурбинных двигателей


Двигатели, в которых вентилятор вынесен за пределы мотогондолы (корпуса двигателя) называются турбовинтовыми. Они обладают лучшими взлетно-посадочными характеристиками, но быстро теряют эффективность при росте скорости больше 0.5 скорости звука (приблизительно). Поэтому они в основном применяются в самолётах для местных авиалиний и военно-транспортной авиации, где возможность использования коротких и неподготовленных взлетно-посадочных полос важнее, чем крейсерская скорость. В конструкции таких двигателей также часто применяется понижающая трансмиссия, как, например, на рисунке ниже.


Газотурбинные двигатели также используются на вертолётах, только в этом случае они крутят не пропеллер, а винт, сами двигатели в этом случае называются турбовальными. Хорошее видео, иллюстрирующее принципы их работы: https://www.youtube.com/watch?v=uVjStAxMFEY

Ещё газотурбинные (турбовальные) двигатели пытались приладить к танкам (Т-80), но стоимость и сложность в обслуживании перевесили большую удельную мощность такого двигателя.

Нелокализованный разлёт осколков


Одним из свойств двигателя, сильно влияющим на конструкцию бортового оборудования, является так называемый нелокализованный разлёт осколков двигателя. Это событие возникает при взрывном разрушении двигателя, когда лопатки компрессоров и турбин разлетаются во все стороны.


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

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

Пояснение про 'идеальный самолёт для технологов':
Идеальный самолёт глазами инженеров. Лично мне взгляд технологов особенно симпатичен.


Подробнее..

SpatialTransformerNetworksв MATLAB

01.12.2020 16:10:27 | Автор: admin

В данной статье будут подниматься темы построения пользовательских слоёв нейронных сетей, использование автоматического дифференцирования и работы со стандартными слоями глубокого обучения нейронных сетей в MATLABна основе классификатора с использованием пространственной трансформационной сети.

SpatialTransformerNetwork(STN) один из примеров дифференцируемых LEGO-модулей, на основе которых можно строить и улучшать свою нейросеть. STN, применяя обучаемое аффинное преобразование с последующей интерполяцией, лишает изображения пространственной инвариантности. Грубо говоря, задача STNсостоит в том, чтобы так повернуть или уменьшить/увеличить исходное изображение, чтобы основная сеть-классификатор смогла проще определить нужный объект. Блок STNможет быть помещен в сверточную нейронную сеть (CNN), работая в ней по большей части самостоятельно, обучаясь на градиентах, приходящих от основной сети (более детально с данной темой можно ознакомиться по ссылкам: Хабри Мануал).

В нашем случае задачей является классифицировать 99 классов лобовых стёкол автомобилей, но, для начала, начнём с чего-нибудь попроще. Для того, чтобы ознакомится с данной тематикой возьмём базу данных MNIST из рукописных цифр и построим сеть из нейронных слоёв глубокого обучения MATLABи пользовательского слоя аффинной трансформации изображения (ознакомиться со списком всех имеющихся слоёв и их функционалом можно по ссылке).

Для реализации пользовательского слоя трансформации мы воспользуемся шаблоном пользовательского слоя и возможностью MATLABдля автоматического дифференцирования и построения обратного распространения производной от ошибки, которая реализуется за счёт массивов глубокого обучения для пользовательских учебных циклов - dlarray(ознакомиться с шаблоном можно по ссылке, ознакомиться с dlarrayструктурами можно по ссылке).

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

Поскольку аффинное преобразование является обратимым, самым простым способом проверки корректности работы функции является наложение трансформации на изображение, а затем нахождение обратной матрицы и выполнение повторной трансформации. Как мы видим на представленном ниже изображении, наш алгоритм работает корректно. Слева у нас входные изображения, справа выходные, сверху - над правыми изображениями - подписана наложенная на изображение трансформация.

Также важно уточнить, какие конкретно изменения накладываются на изображения разными числами матрицы преобразования. Первая строка накладывает трансформации по оси Y, а вторая по Х. Параметры выполняют изменение размера (приближение, отдаление), поворот и смещение изображения. Более детально матрица трансформации описана в таблице.

Y

Размер

Поворот

Смещение

Х

Поворот

Размер

Смещение

Теперь, когда мы разобрались с теоретической составляющей, перейдём к реализации сети с использованием STN. На рисунках ниже представлены структура построенной сети и результаты обучения для базы данных MNIST.

Структура сети.Структура сети.Результаты обучения.Результаты обучения.

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

Теперь, когда мы получили достойный результат на базе данных MNIST, можно переходить к имеющимся у нас лобовым стёклам.

Первое различие между входными данными это то, что числа это изображения в градиенте серого, а стёкла изображения формата RGB, следовательно, нам необходимо изменить слой трансформации, добавив цикл. Будем применять отдельно трансформацию к каждому из слоёв изображения. Также, для упрощения обучения, добавим в слой трансформации веса, на которые будем домножать матрицу трансформации, и установим эти веса в 2, за исключением весов смещения изображения, их установим в 0, для того чтобы сеть училась, в первую очередь, поворачивать и изменять масштаб изображения. Также, если взять данные веса меньше, то сеть дольше будет перестраивать веса STNв поисках полезной информации, так как полезная информация у нас находится по краям изображения, а не в центре, в отличии от сети с числами. Далее нам необходимо заменить часть классификатора, так как он является слишком слабым для наших входных данных. Чтобы не изменять структуру самого STN- мы приведём изображение к виду, похожему на числа, добавив слой нормализации и dropoutдля уменьшения объёма входных данных в STN.

Сравнивая данные на входе у сети с числами и стёклами, можно увидеть, что на стёклах диапазон значений варьируется от [0;255], а в числах от [0;1], а также в числах большая часть матрицы это нули. Примеры данных на входе показаны ниже.

Данные на входе у сети с числами.Данные на входе у сети с числами.Данные на входе у сети со стёклами.Данные на входе у сети со стёклами.

Опираясь на вышеприведённые данные, нормализация будет выполняться по принципу деления входных данных на 255 и обнуления всех значений меньше 0.3 и больше 0.75, а также от трёхмерного изображения мы оставим только одно измерение. На изображении ниже видно, что подаётся на входе и что остаётся после слоя нормализации.

Вход и выход слоя нормализации.Вход и выход слоя нормализации.

Также в связи с тем, что у нас не так много данных для тестирования и обучения сети, мы искусственно увеличим их объём за счёт аффинной трансформации, а именно, поворота изображения на случайный градус в пределах [-10;10] и прибавления случайного числа к матрице изображения для изменения цветовой палитры в пределах [-50; 50]. В функции чтения мы воспользуемся стандартными функциями MATLAB, так как в ней нам не требуется оперировать dlarrayструктурами. Ниже представлена используемая функция чтения входных изображений.

Ниже представлены структура сети с внесёнными изменениями и результаты обучения этой сети.

Структура сети.Структура сети.Результаты обучения.Результаты обучения.

Как мы видим, сеть выделила полезные признаки, а именно центральную часть изображения, за счёт этого, уже к концу первой эпохи достигла процента угадывания выше 90. Так как по краям изображения одинаковые, сеть обучилась на классификацию отличных признаков, и, за счёт этого, она увеличивает центральную часть, вынося левые и правые грани за границу изображения подаваемого на классификатор. При этом, сеть поворачивает все изображения так, чтобы они не отличались по углу наклона, за счёт чего классификатору не требуется настраивать веса под разные углы наклона изображения, тем самым увеличивается точность классификации.

Для сравнения, возьмём и протестируем сеть без использования STN, оставив только имеющийся у нас классификатор. Ниже представлены результаты обучения этой сети.

Результаты обучения.Результаты обучения.

Как мы видим, сеть действительно обучается медленнее и за то же количество итераций достигает меньшей точности.

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

Подробнее..

Анализ кода систем повышенной надежности

21.07.2020 14:09:04 | Автор: admin
Привет Хабр! В этой статье я хочу поговорить о достаточно мало рассматриваемой теме анализа кода систем повышенной надежности. На хабре много статей о том, что такое хороший статический анализ, но в этой статье я бы хотел рассказать о том, что такое формальная верификация кода, а также объяснить опасность бездумного применения статических анализаторов и стандартов кодирования.

Достаточно много было споров о том, как создавать программное обеспечение повышенной надежности, обсуждались методологии, подходы к организации разработки, инструменты. Но среди всех этих обсуждений теряется то, что разработка софта это процесс, причем достаточно хорошо изученный и формализованный. И если посмотреть на этот процесс, то можно заметить, что данный процесс фокусируется не только на том, как пишется/генерируется код, а на том, как этот код проверяется. А самое важное то, что для разработки требуется использовать инструменты, которым можно доверять.

Краткий экскурс завершен, и давайте посмотрим как доказывается надежность кода. Сначала надо разобраться с характеристиками кода, соответствующего требованиям по надежности. Сам термин надежность кода выглядит достаточно расплывчато и противоречиво. Поэтому я предпочитаю ничего не придумывать, и при оценке надежности кода руководствуюсь отраслевыми стандартами, например ГОСТ Р ИСО 26262 или КТ-178С. Формулировки в них разные, но идея одинакова: надежный код разработан по единому стандарту (так называемому стандарту кодирования) и количество ошибок времени исполнения в нем минимизировано. Однако, тут не все так просто стандартами предусмотрены ситуации, когда например соблюдение стандарта кодирования не представляется возможным и такое отступление требуется задокументировать

Опасная трясина MISRA и подобных


Стандарты кодирования предназначены для того, чтобы ограничить использование конструкций языка программирования, которые могут быть потенциально опасны. По идее, это должно повышать качество кода, верно? Да, это обеспечивает качество кода, но всегда важно помнить, что 100% соответствие правилам кодирования не является самоцелью. Если код на 100% соответствует правилам какой-нибудь MISRA, то это совсем не значит, что он хороший и правильный. Можно потратить кучу времени на рефакторинг, вычищение нарушений стандарта кодирования, но все это будет впустую если код в итоге будет работать неправильно или содержать ошибки времени исполнения. Тем более, что правила из MISRA или CERT это обычно только часть стандарта кодирования, принятого на предприятии.

Статический анализ не панацея


Стандарты предписывают проведение систематических код-ревью для того, чтобы найти дефекты в коде и проанализировать код на стандарты кодирования.

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

Формальная верификация кода


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

Прежде всего требуется понять, что же это за зверь? Формальная верификация это доказательство безошибочности кода при помощи формальных методов. Звучит страшно, но на самом деле это как доказательство теоремы из матана. Никакой магии тут нет. Данный метод отличается от традиционного статического анализа, так как используется абстрактная интерпретация, а не эвристики. Это дает нам следующее: мы можем доказать, что в коде нет определенных ошибок времени исполнения. Что это за ошибки? Это всякие выходы за границы массива, деление на ноль, переполнение целых и так далее. Их подлость заключается в том, что компилятор соберет код, содержащий такие ошибки (так как такой код синтаксически корректен), но зато при запуске этого кода они проявятся.

Посмотрим на пример. Ниже в спойлерах представлен код для простого ПИ-регулятора:

Посмотреть код
pictrl.c
#include "pi_control.h"/* Global variable definitions */float inp_volt[2];float integral_state;float duty_cycle;float direction;float normalized_error;/* Static functions */static void pi_alg(float Kp, float Ki);static void process_inputs(void);/* control_task implements a PI controller algorithm that ../  *  * - reads inputs from hardware on actual and desired position  * - determines error between actual and desired position  * - obtains controller gains  * - calculates direction and duty cycle of PWM output using PI control algorithm  * - sets PWM output to hardware  *  */void control_task(void){  float Ki;  float Kp;  /* Read inputs from hardware */  read_inputs();  /* Convert ADC values to their respective voltages provided read failure did not occur, otherwise do not update input values */  if (!read_failure)  {    inp_volt[0] = 0.0048828125F * (float) inp_val[0];    inp_volt[1] = 0.0048828125F * (float) inp_val[1];  }    /* Determine error */  process_inputs();    /* Determine integral and proprortional controller gains */  get_control_gains(&Kp,&Ki);    /* PI control algorithm */  pi_alg(Kp, Ki);  /* Set output pins on hardware */  set_outputs();}/* process_inputs  computes the error between the actual and desired position by  * normalizing the input values using lookup tables and then taking the difference */static void process_inputs(void){  /* local variables */  float rtb_AngleNormalization;  float rtb_PositionNormalization;  /* Normalize voltage values */  look_up_even( &(rtb_AngleNormalization), inp_volt[1], angle_norm_map, angle_norm_vals);   look_up_even( &(rtb_PositionNormalization), inp_volt[0], pos_norm_map, pos_norm_vals);   /* Compute error */  normalized_error = rtb_PositionNormalization - rtb_AngleNormalization;}/* look_up_even provides a lookup table algorithm that works for evenly spaced values.  *   * Inputs to the function are...  *     pY - pointer to the output value  *     u - input value  *     map - structure containing the static lookup table data...  *         valueLo - minimum independent axis value  *         uSpacing - increment size of evenly spaced independent axis  *         iHi - number of increments available in pYData  *         pYData - pointer to array of values that make up dependent axis of lookup table   *   */void look_up_even( float *pY, float u, map_data map, float *pYData){  /* If input is below range of lookup table, output is minimum value of lookup table (pYData) */  if (u <= map.valueLo )   {    pY[1] = pYData[1];  }   else   {    /* Determine index of output into pYData based on input and uSpacing */    float uAdjusted = u - map.valueLo;    unsigned int iLeft = uAdjusted / map.uSpacing;/* If input is above range of lookup table, output is maximum value of lookup table (pYData) */    if (iLeft >= map.iHi ) {      (*pY) = pYData[map.iHi];    } /* If input is in range of lookup table, output will interpolate between lookup values */else {      {        float lambda;  // fractional part of difference between input and nearest lower table value        {          float num = uAdjusted - ( iLeft * map.uSpacing );          lambda = num / map.uSpacing;        }        {          float yLeftCast;  // table value that is just lower than input          float yRghtCast;  // table value that is just higher than input          yLeftCast = pYData[iLeft];          yRghtCast = pYData[((iLeft)+1)];          if (lambda != 0) {            yLeftCast += lambda * ( yRghtCast - yLeftCast );          }          (*pY) = yLeftCast;        }      }    }  }}static void pi_alg(float Kp, float Ki){  {    float control_output;float abs_control_output;    /*  y = integral_state + Kp*error   */    control_output = Kp * normalized_error + integral_state;/* Determine direction of torque based on sign of control_output */    if (control_output >= 0.0F) {      direction = TRUE;    } else {      direction = FALSE;    }/* Absolute value of control_output */    if (control_output < 0.0F) {      abs_control_output = -control_output;    } else if (control_output > 0.0F) {  abs_control_output = control_output;}    /* Saturate duty cycle to be less than 1 */    if (abs_control_output > 1.0F) {  duty_cycle = 1.0F;} else {  duty_cycle = abs_control_output;}    /* integral_state = integral_state + Ki*Ts*error */    integral_state = Ki * normalized_error * 1.0e-002F + integral_state;    }}


pi_control.h
/* Lookup table structure */typedef struct {  float valueLo;  unsigned int iHi;  float uSpacing;} map_data;/* Macro definitions */#define TRUE 1#define FALSE 0/* Global variable declarations */extern unsigned short inp_val[];extern map_data angle_norm_map;extern float angle_norm_vals[11];extern map_data pos_norm_map;extern float pos_norm_vals[11];extern float inp_volt[2];extern float integral_state;extern float duty_cycle;extern float direction;extern float normalized_error;extern unsigned char read_failure;/* Function declarations */void control_task(void);void look_up_even( float *pY, float u, map_data map, float *pYData);extern void read_inputs(void);extern void set_outputs(void);extern void get_control_gains(float* c_prop, float* c_int);



Запустим проверку при помощи Polyspace Bug Finder, сертифицируемого и квалифицируемого статического анализатора и получим такие результаты:



Для удобства, сведем результаты в таблицу:

Посмотреть результаты
Дефект
Описание
Строка
Non-initialized variable
Local variable 'abs_control_output' may be read before being initialized.
159
Float division by zero
Divisor is 0.0.
99
Array access out of bounds
Attempt to access element out of the array bounds.
Valid index range starts at 0.
38
Array access out of bounds
Attempt to access element out of the array bounds.
Valid index range starts at 0.
39
Pointer access out of bounds
Attempt to dereference pointer outside of the pointed object at offset 1.
93


А теперь верифицируем этот же код при помощи инструмента формальной верификации Polyspace Code Prover:


Зеленый цвет в результатах это код, для которого отсутствие ошибок времени выполнения было доказано. Красный доказана ошибка. Оранжевый инструменту не хватило данных. Результаты, помеченные зеленым цветом самые интересные. Если для части кода доказано отсутствие ошибки времени выполнения, то для этой части кода можно значительно сократить объем тестирования (например, тестирование на робастность уже можно не проводить) А теперь, посмотрим на сводную таблицу потенциальных и доказанных ошибок:

Посмотреть результаты
Проверка
Строка
Описание
Out of bounds array index
38
Warning: array index may be outside bounds: [array size undefined]
Out of bounds array index
39
Warning: array index may be outside bounds: [array size undefined]
Overflow
70
Warning: operation [-] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
93
Error: pointer is outside its bounds
Overflow
98
Warning: operation [-] on float may overflow (result strictly greater than MAX FLOAT32)
Division by zero
99
Warning: float division by zero may occur
Overflow
99
Warning: operation [conversion from float32 to unsigned int32] on scalar may overflow (on MIN or MAX bounds of UINT32)
Overflow
99
Warning: operation [/] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
104
Warning: pointer may be outside its bounds
Overflow
114
Warning: operation [-] on float may overflow (result strictly greater than MAX FLOAT32)
Overflow
114
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
115
Warning: operation [/] on float may overflow (on MIN or MAX bounds of FLOAT32)
Illegally dereferenced pointer
121
Warning: pointer may be outside its bounds
Illegally dereferenced pointer
122
Warning: pointer may be outside its bounds
Overflow
124
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
124
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
124
Warning: operation [-] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
142
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
142
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)
Non-uninitialized local variable
159
Warning: local variable may be non-initialized (type: float 32)
Overflow
166
Warning: operation [*] on float may overflow (on MIN or MAX bounds of FLOAT32)
Overflow
166
Warning: operation [+] on float may overflow (on MIN or MAX bounds of FLOAT32)



Эта таблица говорит мне о следующем:

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

Может показаться что формальная верификация это очень круто и следует неудержимо верифицировать весь проект. Однако, как и у любого инструмента тут есть ограничения, касающиеся в первую очередь временных затрат. Если коротко формальная верификация это медленно. Очень медленно. Быстродействие упирается в математическую сложность как самой абстрактной интерпретации, так и объема верифицируемого кода. Поэтому не стоит пытаться с наскоку верифицировать ядро Linux. Все проекты верификации в Polyspace могут быть разбиты на модули, которые могут быть верифицированы независимо друг от друга, а также у каждого модуля есть своя конфигурация. То есть мы можем настраивать тщательность верификации для каждого модуля отдельно.


Доверие к инструментам


Когда вы имеете дело с отраслевыми стандартами, типа КТ-178С или ГОСТ Р ИСО 26262, то вы постоянно сталкиваетесь с такими штуками как доверие к инструменту или квалификация инструмента. Что же это такое? Это такой процесс, в ходе которого вы показываете, что результатам работы инструментов разработки или тестирования, которые были использованы в проекте можно доверять и их ошибки задокументированы. Этот процесс тема отдельной статьи, так как не все очевидно. Главное здесь следующее: инструменты, применяющиеся в индустрии всегда идут вместе с набором документов и тестов которые помогают в этом процессе.

Итоги


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

К слову, если вам интересно, можно сделать отдельную статью про сертификацию инструментов. Напишите в комментариях, нужна ли такая статья.
Подробнее..

Настройка ПИД-регуляторов так ли страшен чёрт, как его малюют? Часть 1. Одноконтурная система

22.07.2020 12:20:51 | Автор: admin


Эта статья открывает цикл статей, посвященных автоматизированным способам настройки ПИД-регуляторов в среде Simulink. Сегодня разберемся, как работать с приложением PID Tuner.


Введение


Наиболее популярным типом применяемых в промышленности регуляторов в системах управления замкнутыми системами можно считать ПИД-регуляторы. И если структуру и принцип действия контроллера инженеры помнят еще со студенческой скамьи, то его настройка, т.е. расчет коэффициентов регулятора, до сих пор является проблемой. Существует огромное количество литературы, как зарубежной (например, [1, 2]), так и отечественной (например, [3, 4]), где настройка регуляторов объясняется на достаточно непростом языке теории автоматического управления.


В этой серии статей будут описываться автоматизированные способы настройки ПИД-регуляторов с помощью инструментов среды Simulink, таких как:


  • PID Tuner,
  • Response Optimizer,
  • Control System Tuner,
  • Frequency Response Based PID Tuner,
  • Closed-Loop PID Autotuner.

В качестве объекта системы управления будет выступать электропривод на базе двигателя постоянного тока с возбуждением от постоянных магнитов, работающий совместно с редуктором на инерционную нагрузку, со следующими параметрами:


  • напряжение питания двигателя, $U_{пит} = 24 \; В$;
  • активное сопротивление обмотки якоря двигателя, $R = 4.8 \; Ом$;
  • индуктивное сопротивление обмотки якоря двигателя, $L = 0.0016 \; Гн$;
  • коэффициент момента двигателя, $c_{e} = 0.066 \; Нм/А$;
  • момент инерции ротора двигателя, $J_{дв} = 2.510^{-5} \; кг \cdot м^{2}$.

Параметры нагрузки и редуктора:


  • момент инерции нагрузки, $J_{н} = 0.01 \; кг \cdot м^{2}$;
  • передаточное число редуктора, $q = 5$.

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


Модель системы


Рассмотрим линейную систему управления угловой скоростью следящего электропривода, упрощенная структурная схема которой представлена ниже.



В соответствии с приведенной структурой в среде Simulink была построена модель такой системы.



Модели электропривода (подсистема Electric actuator) и инерционной нагрузки (подсистема Load) созданы с помощью блоков библиотеки физического моделирования Simscape:


  • модель электропривода,


  • модель инерционной нагрузки.


Модели электропривода и нагрузки также включают подсистемы датчиков различных физических величин:


  • тока, протекающего в обмотке якоря двигателя (подсистема А),


  • напряжения на его обмотке (подсистема V),


  • угловой скорости объекта управления (подсистема ).


Перед настройкой параметров ПИД-регулятора запустим модель на расчет, приняв передаточную функцию регулятора $W_{р}(s) = 1$. Результаты моделирования при отработке входного сигнала 150 об/мин показаны ниже.





Из анализа приведенных графиков видно, что:


  • Выходная координата системы управления не достигает заданного значения, т.е. в системе присутствует статическая ошибка.
  • Напряжение на обмотках двигателя достигает значения 150 В в начале моделирования, что повлечет за собой выход его из строя вследствие подачи на его обмотку напряжения больше номинального (24 В).

Пусть реакция системы на единичный импульс должна соответствовать следующим требованиям:


  • перерегулирование (Overshoot) не более 10%,
  • время нарастания (Rise time) менее чем 0.8 с,
  • время переходного процесса (Settling time) менее чем 2 с.

Кроме того, регулятор должен ограничивать напряжение, подаваемое на обмотку двигателя, до значения напряжения питания.


Настраиваем контроллер


Настройка параметров регулятора осуществляется с помощью инструмента PID Tuner, который доступен непосредственно в окне параметров блока PID Controller.



Приложение запускается нажатием на кнопку Tune, расположенную на панели Automated tuning. Стоит отметить, что до выполнения этапа настройки параметров контроллера необходимо выбрать его вид (П, ПИ, ПД и др.), а также его тип (аналоговый или дискретный).


Поскольку одним из требований является ограничение его выходной координаты (напряжения на обмотке двигателя), то следует задать допустимый диапазон напряжений. Для этого:


  1. Переходим во вкладку Output Saturation.
  2. Нажимаем на флаговую кнопку Limit output, в результате чего активируются поля для задания верхней (Upper limit) и нижней (Lower limit) границы диапазона выходной величины.
  3. Устанавливаем границы диапазона.

Корректная работа блока регулятора в составе системы предполагает использования методов, направленных на борьбу с интегральным насыщением. В блоке реализованы два метода: back-calculation и clamping. Подробная информация о данных методах располагается здесь. Выпадающее меню выбора метода расположено на панели Anti-windup.


В рассматриваемом случае запишем значения 24 и -24 в поля Upper limit и Lower limit соответственно, а также используем метод clamping для исключения интегрального насыщения.



Можно заметить, что внешний вид блока регулятора изменился: появился знак насыщения рядом с выходным портом блока.


Далее, приняв все изменения нажатием кнопки Apply, возвращаемся во вкладку Main и нажимаем кнопку Tune, в результате чего откроется новое окно приложения PIDTuner.



В графической области окна отображаются два переходных процесса: при текущих параметрах регулятора, т.е. для ненастроенного регулятора, и при значениях, подобранных автоматически. Новые значения параметров можно посмотреть, нажав на кнопку Show Parameters, расположенную на панели инструментов. При нажатии на кнопку появятся две таблицы: подобранные параметры регулятора (Controller Parameters) и произведенные оценки характеристик переходного процесса при подобранных параметрах (Performance and Robustness).


Как видно из значений второй таблицы, автоматически рассчитанные коэффициенты регулятора удовлетворяют всем требованиям.



Настройка регулятора завершается нажатием на кнопку с зеленым треугольником, расположенной справа от кнопки Show Parameters, после чего новые значения параметров автоматически изменятся в соответствующих полях в окне настройки параметров блока PID Controller.


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





Отметим, что инструмент PID Tuner подбирает коэффициенты регулятора по линеаризованной модели, поэтому при переходе к нелинейной модели требуется уточнять его параметры. В этом случае можно воспользоваться приложением Response Optimizer.


Литература


  1. Handbook of PI and PID Controller Tuning Rules. Aidan O'Dwyer
  2. PID Control System Design and Automatic Tuning using MATLAB, Simulink. Wang L.
  3. ПИД-управление в нестрогом изложении. Карпов В.Э.
  4. ПИД-регуляторы. Вопросы реализации. Части 1, 2. Денисенко В.
Подробнее..

Настройка ПИД-регуляторов так ли страшен чёрт, как его малюют? Часть 2. Двухконтурная система. Control System Tuner

28.07.2020 12:21:05 | Автор: admin


При реализации системы управления положением объекта часто применяют двухконтурную структуру, включающую в себя два регулятора: положения нагрузки и скорости исполнительного устройства. В таком случае возникает необходимость одновременной настройки обоих регуляторов. Данная задача может быть решена с использованием инструмента Control System Tuner.


Модель системы


Структурная схема двухконтурной системы и ее модель, созданная на основе этой схемы, показаны ниже.



Параметры электропривода и нагрузки указаны в первой части серии.


Отличие моделей Electric actuator и Load от заключается в добавлении новых датчиков: датчик угловой скорости измеряет скорость ротора исполнительного двигателя привода и датчик положения измеряет положение объекта управления.


В качестве регуляторов положения и скорости будем использовать П и ПИ регуляторы соответственно, причем последний имеет ограничение по выходному сигналу 24 В, и в нем реализован метод clamping для борьбы с интегральным насыщением.


Входным сигналом для системы является требуемый угол поворота нагрузки, который должен изменяться в диапазоне 60.


Без регуляторов, т.е. предположив $W_{p_{i}}(s) = 1$, переходный процесс апериодический с временем переходного процесса, равным 2.5 с.



Предъявим следующие требования к переходному процессу системы:


  • Перерегулирование (Overshoot) не более 5%;
  • Время переходного процесса (Settling time) менее чем 1 с.

Настраиваем контроллеры


Приложение Control System Tuner располагается во вкладке APPS окна модели Simulink, в разделе CONTROL SYSTEMS.


Настройка регуляторов осуществляется в соответствии со следующим алгоритмом:


  1. После открытия окна приложения переходим во вкладку TUNING и нажимаем кнопку Select Block.


  2. В открывшемся диалоговом окне нажимаем на кнопку Add Blocks для добавления блоков регуляторов.


  3. Устанавливаем флажок рядом с требуемыми блоками подтверждаем выбор нажатием кнопки OK. В результате выбранные блоки отобразятся в разделе Tuned Blocks панели Data Browser.


  4. Создаем новую задачу для настройки. Для этого нажимаем кнопку New Goal и в выпадающем меню выбираем опцию Tracking of step commands в разделе TIME-DOMAIN REQUIREMENTS. В результате откроется диалоговое окно Step Tracking Goal.


  5. Необходимо указать входной и выходной сигналы системы. Для этого в полях
    Specify step-response inputs и Specify step-response inputs нажимаем на кнопку
    Add signal to list Select signal from model.

    Переходим в окно модели и выбираем соответствующие сигналы, в нашем случае Reference и Position. Возвращается в окно приложения. В диалоговом окне Select Signals должен отобразиться выбранный сигнал. Нажимаем на кнопку Add Signal(s).


  6. Задаем желаемый вид переходного процесса на панели Desired Response и соответственно вид передаточной функции процесса. Можно выбрать апериодический процесс (First-order characteristics), колебательный процесс (Second-order characteristics) или иной вид процесса (Custom reference model). Для нашего случая выбираем колебательный процесс.


  7. В поле Time constant указывается постоянная времени ($\,T\,$) передаточной функции процесса в секундах. В поле Overshoot (%) величина перерегулирования ($\, \sigma \,$). Соотношения между постоянной времени колебательного звена и временем переходного процесса ($\, t_{п.п.} \,$) и коэффициентом демпфирования ($\, \zeta \,$) и перерегулированием выражаются зависимостями [1]:


    $T = \frac{4 t_{п.п.}}{\zeta},$


    $\zeta = -\frac{ln \, \sigma}{\sqrt{\pi^2 + ln^{2}\, \sigma}}$


    Таким образом, максимальное значение постоянной времени, удовлетворяющее требованию, составляет 0.1725 с. Укажем постоянную времени, равную 0.1 с. Также вводим требуемой значение перерегулирования во второе поле. Подтверждаем изменения.


  8. В появившемся графическом окне приложения можно видеть два переходных процесса: текущий, т.е. переходный процесс системы до настройки регуляторов, и желаемый, по заданной передаточной функции. Нажимаем на кнопку Tune для настройки регуляторов. Выбирая настраиваемые блоки на панели Data Browser в разделе Data Preview можно просмотреть вид передаточной функции контроллера и подобранные параметры. При выборе текущей задачи настройки в разделе Tuning Goals отображаются входные и выходные сигналы системы, а также передаточная функция процесса. Ниже показаны характеристики переходного процесса. Видно, что эти значения соответствуют требуемым.


  9. Для автоматического обновления параметров регуляторов переходим во вкладку CONTROL SYSTEM и нажимаем кнопку Update Blocks.



Результаты моделирования системы с настроенным регулятором для максимального уровня входного сигнала показаны ниже.





Литература


  1. Modern Control Engineering (5th Edition). Katsuhiko Ogata
Подробнее..

Настройка ПИД-регуляторов так ли страшен черт, как его малюют? Часть 3. Response Optimizer

05.08.2020 12:20:05 | Автор: admin


В данной статье рассмотрим процесс настройки регулятора нелинейной модели электропривода с помощью инструмента Response Optimizer.


До сих пор мы рассматривали только линейные системы (часть 1 и часть 2). Они нужны для понимания принципа работы настоящей (нелинейной) системы и грубого определения ее характеристик. Однако на практике приходится иметь дело именно с нелинейной моделью.


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


Сегодня рассмотрим систему, где вместо идеального датчика скорости используется инкрементальный энкодер. Он формирует три цифровых сигнала A, B и Z, на основе которых определяются угловое положение и скорость объекта управления.


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


Модель системы


Ниже показана модель рассматриваемой системы.



Помимо уже знакомых подсистем электропривода, нагрузки и регулятора скорости, она включает в себя:


  • датчик скорости (подсистема Sensor),



  • функцию обработки сигналов от энкодера, реализуемая в цифровом вычислителе (подсистема Incremental shaft decoder)




Все параметры системы приведены в первой части. Разрешение энкодера составляет 256 имп/об.


Результаты моделирования до настройки регулятора ($W_{р}(s) = 1$) приведены ниже.





Пусть реакция системы на единичный импульс должна соответствовать следующим требованиям:


  • перерегулирование (Overshoot) не более 8%,
  • время нарастания (Rise time) менее чем 0.3 с,
  • время переходного процесса (Settling time) менее чем 0.85 с.

Кроме того, регулятор должен ограничивать напряжение, подаваемое на обмотку двигателя, до значения напряжения питания. Это означает, в регуляторе необходимо применить метод для борьбы с интегральным насыщением.


Настраиваем контроллер


Приложение Response Optimizer располагается во вкладке APPS окна модели Simulink, в разделе CONTROL SYSTEMS.


Поскольку инструмент использует численные методы оптимизации, во время процесса расчет модели будет выполняться многократно. Поэтому перед настройкой в блоке SIMULATE окна модели активируем опцию Fast Restart для уменьшения времени, затрачиваемого на эти действия.


Настройка регуляторов осуществляется в соответствии со следующим алгоритмом:


  1. Создаем MATLAB переменные, соответствующие параметрам регулятора, в окне Model Explorer и присваиваем их значениям начальные приближения.


    В качестве начальных приближений в нашем случае можно взять настроенные значения регулятора из первой части.



  2. Записываем переменные в соответствующие поля в окне параметров блока PID Controller.



  3. Открываем инструмент Response Optimizer. Слева в разделе Model Workspace на панели Data Browser показаны созданные ранее переменные.


  4. Определяем список оптимизируемых параметров. Для этого нажимаем на кнопку None редактируемого поля Design Variables Set.



    В выпадающем меню нажимаем New.... В правом списке открывшегося окна Create Design Variables Set расположены переменные модели, а в левом параметры для оптимизации. Выделяем переменные и нажимаем на кнопку со стрелкой, расположенной между двумя списками, для переноса их в левый список.


    Опционально можно указать границы диапазоны оптимизируемых параметров в столбцах Minimum и Maximum.



  5. Выбираем задачу оптимизации. В блоке REQUIREMENTS нажимаем на кнопку New и в выпадающем меню в разделе TIME-DOMAIN REQUIREMENTS выбираем опцию Step Response Envelope.



  6. Задаем характеристики требуемого переходного процесса в появившемся окне в разделе Specify Step Response Characteristics.



  7. Задаем сигнал, к которому предъявляются требования по переходному процессу. В разделе Select Signals to Bound нажимаем на кнопку с плюсом рядом со списком. Переходим в модель и выбираем необходимый сигнал. В нашем случае сигнал Speed. Возвращаемся в окно инструмента. В левом списке открывшегося окна Create Signal Set выбираем сигнал и нажимаем на кнопку со стрелкой. Завершаем выбор сигналов нажатием ОК.



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


    В разделе Data на панели Data Browser расположены три переменные: DesignVars содержит информацию о списке оптимизированных параметров, Sig свойства выбранного сигнала и StepRespEnvelope информацию о требованиях к переходному процессу.


    Построим переходный процесс до настройки регулятора. Для этого выбираем переменную Sig и нажимаем на кнопку Plot Model Response, расположенную в блоке PLOTS.



    Видно, что переходный процесс не удовлетворяет поставленным требованиях.


  8. Оптимизируем параметры регулятора. Выбираем переменную DesignVars и нажимаем на кнопку с зеленым треугольником в блоке OPTIMIZE.


    Результаты процесса оптимизации отображаются в окне прогресса.



    В графическом окне можно видеть новый переходный процесс с оптимизированными параметрами регулятора (толстая линия), а также переходные процессы, построенные на предыдущих итерациях (тонкие линии).




Результаты моделирования системы с настроенным регулятором показаны ниже.




Подробнее..

Настройка ПИД-регуляторов так ли страшен черт, как его малюют? Часть 4. Frequency Response Based PID Tuner

12.08.2020 12:22:47 | Автор: admin


Среда Simulink предоставляет возможность исследования нелинеаризуемых систем и настройки их регуляторов с помощью метода гармонического анализа. Одним из инструментов, использующих данный метод, является Frequency Response Based PID Tuner.


В предыдущей статье мы рассматривали систему с инкрементальным энкодером. Сегодня добавим в линейную модель драйвер управления электродвигателем, реализующий импульсное управление.


Модель системы


Рассматриваемая система приведена ниже.



Драйвер управления двигателем:



Добавление блока управления двигателем вынуждает модифицировать блоки регулятора



и электропривода



Результаты моделирования при отработке входного сигнала 150 об/мин без регулятора показаны ниже. Из их анализа видно, что:


  • Выходная координата системы управления не достигает заданного значения, т.е. в системе присутствует статическая ошибка;
  • Напряжение на обмотках двигателя достигает максимального значения (напряжения питания) при малых входных сигналах.




Пусть реакция системы на единичный импульс должна соответствовать следующим требованиям:


  • Перерегулирование (Overshoot) не более 10%;
  • Время нарастания (Rise time) менее чем 0.8 с;

При попытке настроить регулятор описанным в первом части способом в окне приложения PID Tuner появится предупреждение о невозможности линеаризации системы.



Настраиваем контроллер


Приложение Frequency Response Based PID Tuner располагается в окне параметров блока PID Controller в выпадающем меню Select tuning method. Для его запуска необходимо нажать кнопку Tune.



В открывшемся окне представлено краткое описание работы метода, а также параметры настройки эксперимента.



Алгоритм задания цели эксперимента:


  1. Указать количество расчетов моделей (Number of simulations): 2 расчета для систем с возмущающими воздействиями, 1 расчет для систем без возмущающих воздействий. Поскольку в данной системе их нет, то выбираем 1 расчет.
  2. Указать тип системы (Plant information): асимптотически устойчивая система, либо система с астатизмом первого порядка (система имеет один интеграл). В данном случае система асимптотически устойчива.
  3. Задание времени начала моделирования $t_{0}$ и продолжительности моделирования $t_{span}$. Эксперимент рекомендуется начинать, когда система вышла на установившейся режим, т.е. когда закончился переходный процесс. Установим начало эксперимента в 0.2 с. Продолжительность моделирования определяется требуемым временем нарастания согласно формуле $t_{span} = 50 t_{r}$.
  4. Задать амплитуды тестовых сигналов. Амплитуды сигналов рекомендуется брать такими, чтобы значения превышали амплитуды шумов в системе, но не выходили за ее ограничения. В данном случае указываем амплитуды сигналов, равными 1.
  5. Указать требования к переходному процессу (Design Specifications). Значение требуемой полосы пропускания определяется формулой $\omega_{b} = 2/t_{r}$. В нашем случае оно равно 4.83 рад/с. Величина перерегулирования 10% примерно соответствует запасу по фазе 60, поэтому оставляем это значение без изменения.

Далее, нажимаем кнопку Tune для запуска эксперимента. После завершения эксперимента настроенные параметры регулятора появятся на панели Tuning Results.



Нажимая кнопку Update PID Block, новые параметры автоматически изменятся в соответствующих полях окна параметров блока регулятора.


Результаты моделирования системы с настроенным регулятором для нескольких входных сигналов представлены ниже.





Полученные эпюры близки к результатам расчета линейной модели из первой части.

Подробнее..

Настройка ПИД-регуляторов так ли страшен черт, как его малюют? Часть 5. Closed-Loop PID Autotuner

19.08.2020 20:12:15 | Автор: admin


Заключающая статья серии, посвященной автоматизированным способам настройки ПИД-регуляторов в среде Simulink, в которой мы рассмотрим применение блока автоматической настройки Closed-Loop PID Autotuner.


Этот блок похож на ранее рассмотренный инструмент Frequency Response Based PID Tuner: он также базируется на методе гармонического анализа. Располагается блок в разделе Simulink Control Design библиотеки Simulink.


Сразу стоит сказать, что система аналогична приведенной в предыдущей статье, поэтому все результаты моделирования можно посмотреть там же.


Модель системы


Рассматриваемая система приведена ниже.



Содержимое всех подсистем, кроме подсистемы регулятора, было рассмотрено в предыдущих статьях: Driver, Electric actuator, Load.


Для того чтобы использовать блок Closed-Loop PID Autotuner, необходимо включить его последовательно с блоком PID Controller, как показано ниже.



На порт входа 1 приходит сигнал ошибки с дискриминатора, на порт 2 сигнал обратной связи; в данном случае угловая скорость объекта управления. В подсистеме Tune enable формируется сигнал начала и завершения эксперимента по настройке параметров регулятора.



В модель добавлены блоки Display для регистрации выполнения эксперимента в процентах
(% conv) и подобранных параметров регулятора (pid gains).


Предъявим к этой системе такие же требования, как к системе из предыдущей статьи.


Настраиваем контроллер


Окно параметров блока Closed-Loop PID Autotune позволяет выбрать тип используемого в системе регулятора, его форму, задавать цель эксперимента, а также его параметры.



Желаемое значение полосы пропускания (Target bandwidth) рассчитывается также, как в предыдущей статье. В нашем случае оно равно 4.83 рад/c.


Если используемый в системе регулятор цифрового типа, то в блоке автонастройки указывается его период квантования; при применении непрерывного регулятора задается шаг расчета модели при выполнении эксперимента (Experiment sample time). Рекомендуемое значение шага моделирования составляет $0.02/\omega_{b}$. В нашем случае это значение равно 0.0041.


Во вкладке Experiment задаются параметры эксперимента. Рассматриваемая система является устойчивой, поэтому тип системы (Plant Type) указываем как Stable. Знак системы (Plant Sign) указывает на свойство совпадения знака выходной и входной координат. В данном случае оставляем этот параметр без изменения. Далее указывается амплитуда тестового гармонического сигнала (Sine Amplitudes) в соответствии с рекомендациями, приведенными в предыдущем параграфе. Устанавливаем амплитуду, равную 1.


Время начала эксперимента выбирается из расчета перехода системы в установившийся режим без регулятора. Время завершения эксперимента рекомендуется рассчитывать по формуле $200/\omega_{b}$. Для нашей системы время начало эксперимента будет $t_{start} = 0.1$ с, а время завершения $t_{end} = 42$ с. Оба значения указываются в полях Step time соответствующих блоков Step в подсистеме Tune enable.


Следует отметить, что время завершения моделирования (Stop Time) необходимо указывать больше, чем время окончания эксперимента, иначе процесс настройки параметров регулятора не завершится.


После расчета модели подобранные параметры отобразятся в блоке Display.



Эти значения придется записать в соответствующие поля блока PID Controller вручную.


Для нормального функционирования системы переводим тумблер Manual Switch в подсистеме Tune Enable на вход нулевого сигнала. Таким образом, блок автонастройки не включится при моделировании системы.


Можно заметить, что рассчитанные параметры с помощью блока Closed-Loop PID Autotune практически совпадают с параметрами, полученными с помощью инструмента Frequency Response Based PID Tuner.

Подробнее..

Квалификация инструментов для разработки встраиваемого ПО

25.12.2020 08:10:45 | Автор: admin
Привет, хабр! В этой статье я хочу максимально просто и доступно рассказать про то, как доказывается, что ваши средства разработки и верификации подходят для создания систем повышенной надежности. Это очень важный и далеко не самый простой вопрос, и моя цель ответить на него как можно более понятным языком. В самой статье я обобщил указания из отраслевых стандартов, таких как КТ-178 или Р-331 (встраиваемое ПО в авиации), ГОСТ Р ИСО 26262-8 (встраиваемое ПО в автомобилестроении). Так что добро пожаловать под кат


Квалификация зачем она?


Отраслевые стандарты, такие как КТ-178 или ИСО 26262, описывают процессы создания ПО повышенной надежности. Если следовать этим описаниям, то создание такого ПО превратится в бюрократический ад, который будет длиться вечно. Но существует программное обеспечение, которое позволяет автоматизировать значительную часть этих процессов. Такое ПО называется инструментом. И если вы применяете инструмент, то он должен быть надежным (ИСО 26262 даже вводит термин уверенность в инструменте). Для подтверждения надежности инструмента проводится его квалификация.

Квалификация теория


В отраслевых стандартах есть понятие уровня безопасности. В разных стандартах они называются по-разному: Уровень ПО в КТ-178, Уровни Полноты Безопасности автомобиля в ИСО 26262. А для средств разработки применяются уровни квалификации инструментов (КТ-178) или уровни классификации инструментов (ИСО 26262). Эти уровни назначаются по критичности инструментов чем больше влияния оказывает инструмент на разработку, тем более высокий уровень квалификации будет ему назначен. При этом одним из главных критериев по определению влияния инструмента является мера его влияния на результирующее ПО.
В качестве примера можно рассмотреть генератор исходного кода и статический анализатор кода. Сгенерированный код попадает в прошивку устройства, которое будет установлено на борт самолета или автомобиля. Таким образом, генератор кода оказывает непосредственное влияние на результирующее ПО. Так как генератор кода сложная штука, и может генерировать код с ошибками, то к качеству этого генератора кода предъявляются строгие требования и уровень его квалификации будет максимальным. Другое дело статический анализатор, результат работы которого не попадает в бортовое ПО и степень его влияния минимальна. Поэтому для статического анализатора уровень квалификации будет ниже, чем для генератора кода.
А еще уровень квалификации напрямую влияет на трудозатраты: так, для авиации, для квалификации инструмента по наивысшему уровню КТ-178С, требуется выполнение 76 контрольных мероприятий, а по низшему только 14.
Еще один важный момент квалификация инструментов проводится не разработчиком инструмента, а непосредственно разработчиком ПО, причем квалификация должна проводиться для каждого проекта!

Квалификация заметки по практике


Как было сказано в теоретической части, квалификация инструментов это затратный процесс, однако он упрощается несколькими способами:

  • Поддержка процесса квалификации производителями инструментов (вендоров)
  • Указания по квалификации инструментов из стандартов


Рассмотрим их по порядку. В первую очередь, сами вендоры поставляют пакеты поддержки квалификации инструментов. Во вторую отраслевые стандарты содержат указания по квалификации инструментов, которые могут сократить объем работ.

Хотелось бы остановиться на втором пункте. Опять будем рассматривать генератор кода. Сгенерированный с его помощью код все равно должен тестироваться, будет собираться покрытие кода, проводится его анализ, т. е. верифицироваться.
Отраслевые стандарты говорят нам о том, что если мы будем квалифицировать инструменты, которые отвечают за верификацию кода, то квалификация самого генератора кода будет не нужна. Таким образом, сами стандарты содержат указания, следуя которым вы можете значительно сократить затраты на квалификацию.

Для квалификации инструментов верификации стандарты предписывают демонстрацию их поведения в нормальных условиях. На практике это выглядит следующим образом:

  1. Вендор поставляет набор шаблонов документов, нормативных документов и опорных тестов для инструмента и их эталонные результаты.
  2. Вы заполняете шаблоны документов и запускаете предоставленные тесты в своем окружении.
  3. Результаты тестов, запущенных вами, сравниваются с эталонами, и при расхождении результатов вы устраняете расхождение.


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

Инструменты MathWorks и их квалификация


Такие инструменты как Simulink, DSP Toolbox, Control System Toolbox это стандарт индустрии для разработки систем управления, цифровой обработки сигналов. Неудивительно, что их применяют в авиации, автомобилестроении и прочих отраслях. Из разработанных моделей генерируется C/C++ код, который ездит и летает. Естественно, что перед разработчиками встает вопрос квалификации инструментов. И квалификация инструментов MathWorks для КТ-178С осуществляется для инструментов верификации моделей и кода:



А для ISO 26262 поставляются сертификаты для:

  • Simulink Check
  • Simulink Coverage
  • Simulink Requirements
  • Simulink Design Verifier
  • Simulink Test
  • Simulink Report Generator
  • Polyspace Bug Finder
  • Polyspace Code Prover
  • Embedded Coder
  • HDL Coder
  • PLC Coder


В зависимости от отрасли предоставляются пакеты поддержки квалификации инструментов DO Qualification Kit для авиации или IEC Certification Kit для автомобильной, железнодорожной и других отраслей.

Вместо выводов


В данной статье был дан обобщенный обзор процесса квалификации инструментов в соответствии с отраслевыми стандартами. В ходе написания данной статьи, я руководствовался следующими источниками:
  1. Р-330, Руководство по квалификации программных инструментов, в частности:

  • п. 2.0 Назначение квалификации инструмента
  • п. 3.1. Уровни квалификации
  • Справочные материалы D, вопрос D7

  1. ГОСТ Р ИСО 26262-8, Глава 11, Уверенность в использовании инструментального программного обеспечения

Если вам интересно как создаются системы повышенной надежности, то напишите в комментариях, что требуется рассмотреть в следующих статьях.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru