Автоматическая генерация кода в MATLAB для встраиваемых систем.

Автор uran, Среда, апреля 11, 2018, 07:22:05

« предыдущая тема - следующая тема »
Вниз

uran

Среда, апреля 11, 2018, 07:22:05 Последнее редактирование: Понедельник, апреля 16, 2018, 20:50:47 от uran
Исполнитель: Саяпин Олег Юрьевич, Фарзалиев Андрей, 641 об
Научный руководитель: Русинов Владислав Леонидович
Автоматическая генерация кода в MATLAB для встраиваемых систем.


Переход от языка ассемблер к С около 40 лет назад привел к большому количеству разногласий из-за повышения уровня абстракции и опасений по оптимальности скомпилированного ассемблерного кода. По рейтингу IEEE на 2017 год, язык программирования С является одним из самых популярных в мире.
С точки зрения встраиваемых систем, ведущие компания мира переходят на процесс разработки с автоматической генерацией кода из системных моделей. Это обусловлено:
1) Сложностью систем -- количество и сложность алгоритмов растет
2)Растущими издержками на написание кода (~ 10 млн строк кода на средний автомобиль) -- где взять столько программистов, которые не только умеют писать код, но и понимают прикладную область?
3) Сложностью верификации больших объемов кода -- как доказать, что весь код работоспособен?
4) Сложностью переиспользования алгоритмов при переходе на другую элементную базу

Подход к автоматической генерации кода основан на концепции модельно-ориентированного проектирования встраиваемых систем.
Модельно-ориентированное проектирование предлагает математический и визуальный подход для проектирования сложных систем управления и обработки сигналов. В центре процесса разработки находится системная модель, которая используется для проектирования, анализа, симуляции, автоматической генерации кода и верификации.
Инженеры создают модель, описывающую поведение встраиваемой системы. Модель, которая состоит из блочных диаграмм, текстовых программ и других графических элементов, является исполняемой спецификацией, которая позволяет инженерам запускать симуляции для тестирования идей и верификации проекта на протяжении всего процесса разработки.
Такой подход дает нам следующие преимущества:
1) Быстро получать оптимизированный С/С++/VHDL/Verilog/PLC код из алгоритмов на языке MATLAB и моделей Simulink
2) Вместо растраты времени на написание кода, сфокусироваться на проверке работоспособности различных решений задачи на уровне моделей Simulink
4) Быстро вносить изменения и исправления ошибок, если такие были выявлены
5) Быстрый перенос алгоритмов между ЭКБ, например, перенос алгоритмов с микропроцессора на ПЛИС
6) Избегать ошибок ручного кодирования при написании алгоритмов, а также обеспечивать соответствие кода нашим внутренним стандартам
Код, создаваемый с помощью средств автоматической генерации кода MATLAB, обладает четкостью и эффективностью кода, написанного профессиональным программистом, и пригоден как для построения различных отладочных платформ, так и для массово выпускаемых изделий.

Примеры успешного применения

Примеры успешного применения модельно-ориентированное проектирование в своих разработках крупных компаний
Компания Nissan Motor Co., LTD, используя продукты MathWorks для проектирования при создании системы уменьшения выхлопа, сертифицированной по California Air Resources Board (CARB) для стандарта Partial Zero Emission Vehicle (PZEV), сократила время разработки на 50 %, уменьшила число датчиков и получила премию от управления по охране окружающей среды (США).
Компания ABB также применила продукты корпорации MathWorks для проектирования разработки и проверки ПО системы управления силовых электронных блоков управления AC 800РЕС для силовых преобразователей. В результате время и стоимость разработки сократились, процесс разработки стал более эффективным, качество генерируемого кода заметно повысилось.


                                                            Средства MATLAB для создания кода
Simulink Coder  (ранее Real-Time Workshop ) создает и исполняет C и C + + код из моделей Simulink  , диаграмм и функций MATLAB . Созданный исходный код может быть использован в приложениях реального времени или в приложениях, которые не требуют выполнения в реальном времени. Этот код также может использоваться для ускорения моделирования, быстрого прототипирования и аппаратно-программного тестирования (Hardware In the Loop). Вы можете настраивать параметры и наблюдать за сигналами в созданном коде, используя Simulink или взаимодействовать с кодом вне среды MATLAB и Simulink.

Embedded Coder генерирует читаемый, компактный и быстрый С/С++ код для использования на встроенных процессорах, отладочных платах и микроконтроллерах. Embedded Coder включает дополнительные возможности конфигурации и оптимизации в продуктах MATLAB Coder и Simulink Coder для детальной настройки над функциями сгенерированного кода, файлами и данными. Данные возможности улучшают производительность кода, облегчают интеграцию с существующим кодом, типами данных и параметрами калибровки. Вы можете включить программные среды сторонних производителей в процесс разработки «под ключ» для развертывания на встроенных системах. Embedded Coder имеет встроенную поддержку программных стандартов AUTOSAR и ASAP2. Также предоставляет отчеты трассировки, документирование кода и автоматическую программную верификацию для соответствия процессу разработки по стандартам DO-178, IEC 61508 и ISO 26262.

HDL Coder - это продукт для генерации полноценного Verilog и VHDL-кода по Simulink моделям и Stateflow диаграммам. Пакет расширяет возможности разработки аппаратных устройств в среде MATLAB и обеспечивает генерацию VHDL и Verilog кода c побитовым и цикловым соответствием исходной модели Simulink. HDL Coder позволяет создавать аппаратные устройства на основе программируемых логических интегральных схем (ПЛИС/FPGA) и специализированных интегральных схем (СИС /ASIC), разрабатывать прототипы, тестировать и проверять HDL-реализации Simulink-моделей. HDL Coder генерирует читаемый и изменяемый VHDL или Verilog-код без аппаратной привязки к конкретной платформе.

Simulink PLC Coder - данный продукт позволяет автоматически генерировать соответствующий стандарту IEC 61131 код для программируемых логических контроллеров (PLC) и программируемых контроллеров автоматизации (PAC). Simulink PLC Coder позволяет использовать Модельно-ориентированное проектирование для промышленного и силового оборудования, управляемого PLC и PAC При помощи Simulink PLC Coder, инженеры могут автоматически генерировать код для промышленных систем управления, включая замкнутые системы и системы контроля с обратной связью.



                                            Методика генерации С-кода из модели Simulink
Методика включает следующие этапы:
1)  Создание Simulink-модели в соответствии с заданным алгоритмом и ее отладка;
2)  Доработка Simulink-модели с учетом дискретных преобразований сигналов;
3)  Преобразование Simulink-модели в модель для расчетов с фиксированной точкой;
4)  генерация С-кода из модели Simulink;
5)  Тестирование сгенерированного С-кода;
6)  Интеграция  сгенерированного С-кода в среду разработки процессора.

                                          Демонстрационно-практическая часть

В качестве демонстрационного примера будет реализован алгоритм скалярного управления асинхронным двигателем с помощью модели Simulink и преобразования этого алгоритма в исходный код  на языке Си, с последующим его компиляцией и исполнением  на отладочной плате с микроконтроллером STM32F103C8T6.
С принципом скалярного управления асинхронным двигателем можно ознакомиться по ссылке: http://engineering-solutions.ru/motorcontrol/scalar/

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

Входы модели:
scalar_freq - задание  частоты (Гц)
scalar_ampl - амплитуда выходного напряжения  
Выходы модели:
u_abc - выходы напряжение фаз A,B,C
Вычисление тригонометрических функций sin, cos сосредоточены в блоке Power supply (функция).

Для моделирования реализованного алгоритма была создана модель, в которой описанный регулятор (EmbeddedFOC.mdl) соединен с моделью асинхронного  электродвигателя из библиотеки SimPowerSystems


Результаты моделирования в Simulink при разных задающих частотах:



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


Затем сгенерировать код для EmbeddedFOC.mdl (нажать Ctrl+B) в открытой Simulink модели.

В итоге получаем исходные файлы



             
  Код не плохо прокомментирован. Есть описания каждой функции и переменной. Имена функций и переменных четко совпадают с их предназначением. Что дает неоценимую пользу для программиста, он может легко разобраться в коде и в случаи чего изменить его или подогнать под себя.
В общем сгенерированный код представляет собой набор функций и переменных.
Для программиста, для работы  важны лишь 2 функции:
void EmbeddedFOC_initialize(void) - эта функция, как видно из названия, используется для инициализации модели, созданной в Simulink. Она не принимает и не возвращает никаких значений. Вызывается в функции Main до основной работы сгенерированного кода. Без нее никаких вычислений в следующей функции не будет.
    void EmbeddedFOC_step(void) - функция, прокомментированная генератором кода, как модельно ступенчатая (Model step function). В этой функции и происходят все вычисления. Она не принимает и не возвращает  никаких значений. Работает   она со следующими глобально-объявленными структурами данных:
EmbeddedFOC_U - структура входных данных.  В ней хранятся 2 переменных  типа float:
scalar_freq - переменная для задания нужной чистоты выходного сигнала ( входной параметр scalar_freq в модели Simulink). Значение переменной задается в Гц.
scalar_ampl - переменная для задания нужной амплитуды выходного сигнала ( входной параметр scalar_ ampl в модели Simulink). Значение переменной задается от 0 до 1 (нормированное значение).
EmbeddedFOC_Y - структура выходных данных. В ней храниться массив из трех элементов:
u_abc[0] -  этот элемент содержит расчетные значения для фазы A (нормированное значение от -1 до 1).
u_abc[1] - фазы B.
u_abc[2] - фазы C.
Эти значения позволяют изменить скважность ШИМ. Более подробную информацию о том, как при помощи ШИМ  управлять асинхронным двигателем, можно найти перейдя по следующим ссылкам:
http://www.avislab.com/blog/stm32-pmsm_ru/
http://www.bpec.ru/wp-content/uploads/2016/06/Асинхронный-двигатель-2012.pdf
http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR495.htm


Для убедительности  работоспособности сгенерированного из Matlab кода, я  скомпилировал и исполнил его на  отладочной плате с  32 битным микроконтроллером STM32F103C8T6.


Результат - получение с помощью 4-битого ЦАП сигнала синусоидальной формы, амплитуда и чистота которого задается с потенциометра с помощью встроенного в микроконтроллер  12 битого АЦП.




Размер получившегося исходного файла 10Кб.
Файл с исходным кодом Scalar1.7z в конце статьи.

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

Используемые ресурсы:
http://lab18.ipu.ru/projects/conf2011/1/18.htm
https://akpc806a.wordpress.com/2013/02/27/реализация-векторного-частотного-пр/


ran

#1
Среда, апреля 11, 2018, 08:11:39 Последнее редактирование: Среда, апреля 11, 2018, 08:13:14 от ran
Что "на основе Matlab"? Встраиваемые системы, что-ли? Наверное, имелось в виду: "Автоматическая генерация кода в MATLAB для встраиваемых систем"?

кингофзеринг

А можно поподробнее об области применения данного метода,в каких сферах кроме автомобильной промышленности он может быть использован?


uran

     Вы наверно имели в виду, где еще успешно применялось модельно-ориентированное проектирование, а в частности автоматическая генерация кода. Если да то вот  очень хороший пример:  https://matlab.ru/articles/Israel_Aerospace_Industries_rus.pdf
     Другие истории успеха можно найти перейдя по следующей ссылке:  https://matlab.ru/success-story/

ran

Хороший доклад. Эту тему, конечно, нужно развивать.

mds

В общем сгенерированный код представляет собой набор функций и переменных.
Для программиста, для работы  важны лишь 2 функции:
void EmbeddedFOC_initialize(void) - эта функция, как видно из названия, используется для инициализации модели, созданной в Simulink. Она не принимает и не возвращает никаких значений. Вызывается в функции Main до основной работы сгенерированного кода. Без нее никаких вычислений в следующей функции не будет.

Весьма  интересное и спорное умозаключение.

uran

Я наверно неправильно выразился, прошу прощение, если что, я хотел сказать, что из получившегося кода, для работы потребуется вызвать лишь 2 функции. И не вызвав "void EmbeddedFOC_initialize(void)"  в функции Main, при следующем вызове функции void EmbeddedFOC_step(void) у нас значения в массиве u_abc[] не будут изменяться, они так и останутся равны нулю.

Вверх