Вызов переиспользуемого кода внешнего алгоритма для симуляции и генерации кода

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

  • Модуляризация приложения

  • Повторное использование оптимизированного алгоритма

  • Взаимодействие с предопределенным набором данных

  • Разработка вариантов приложения

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

  • Служебные функции

  • Интерполяционные таблицы

  • Цифровые фильтры

  • Специализированные интеграторы

  • Пропорционально-интегрально-производные (ПИД) модули управления

Рабочий процесс

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

ЗадачаДействиеДополнительная информация
1Проверьте оценку характеристик внешнего кода и требований к интегрированию.Выберите рабочий процесс интегрирования внешнего кода
2На основе языка программирования внешнего кода выберите интеграционный подход, чтобы добавить внешний код к модели Simulink.Выбор Интегрирования подхода
3Проверьте поведение и эффективность алгоритма путем симуляции модели.Симуляция
4Задайте представление данных моделей для генерации кода.Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом
5Сконфигурируйте модель для генерации кода.Сгенерируйте код, который совпадает с внешним видом внешнего кода и строением модели
6Сгенерируйте код и отчет генерации кода.Генерация кода
7Проверьте сгенерированный интерфейс кода и статические метрики кода.Анализируйте сгенерированный интерфейс кода и статические метрики кода
8Создайте исполняемую программу из модели.Создайте интегрированный код в окружение Simulink
9Проверьте, что исполняемая программа работает должным образом.Численная проверка эквивалентности
10Проверьте, что исполняемая программа работает должным образом.Профилирование выполнения кода

Выбор Интегрирования подхода

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

  • Язык программирования внешнего кода - MATLAB®, C, C++ или Фортран

  • Ваш языковой опыт и выборы программирования

  • Требования к эффективности

  • Должен ли алгоритм моделировать непрерывную динамику времени, или вы интегрируете алгоритм в приложение, которое использует дискретное и непрерывное время

  • Хотите ли вы воспользоваться преимуществами Модельно-ориентированное проектирование

  • Уровень контроля, необходимый для кода, который производит генератор кода

Чтобы выбрать подход для переиспользуемого алгоритма, смотрите подразделы, которые соответствуют языку программирования вашего кода внешнего алгоритма.

Интеграционные подходы для внешнего кода MATLAB

Для интеграции внешнего кода MATLAB в окружение Simulink доступно несколько подходов. Следующая схема и таблица помогают вам выбрать оптимальный подход к интегрированию для вашего приложения на основе требований к интегрированию.

 Условие или требованиеДействиеДополнительная информация
1Алгоритм должен смоделировать непрерывную динамику состояний.Напишите S-функцию MATLAB и, для генерации кода, соответствующий файл TLC для алгоритма. Добавьте S-функцию к своей модели.
2Внешний код соответствует коду MATLAB для подмножества генерации кода, и вы хотите вызвать код MATLAB из модели Simulink.Добавьте блок MATLAB Function к модели. Встройте код MATLAB в этот блок.
3Внешний код соответствует коду MATLAB для подмножества генерации кода, вы хотите вызвать код MATLAB из модели Simulink, и ваш алгоритм включает итерационные расчеты, которые обрабатывают большие потоки данных.Добавьте блок MATLAB System к модели. Встройте код MATLAB в этот блок как системный object™.
4Внешний код соответствует коду MATLAB для подмножества генерации кода, вы хотите вызвать код MATLAB из модели Simulink, и ваш алгоритм включает проект себя логику, которая основана на машинах состояний и графиках потока.Добавьте диаграмму Stateflow к модели. Вызовите внешний код из графика, используя MATLAB в качестве языка действий.
5Вы хотите использовать parfor функция для параллельных вычислений или типов данных интерфейса, которые доступны для MATLAB Coder™, Simulink Coder и Embedded Coder®. Использовать parforНеобходимо установить Parallel Computing Toolbox™.Используйте программное обеспечение для генерации кода С. Затем вызовите этот сгенерированный код как внешний Код С.
6У вас есть опыт программирования на C или C++, и внешний код MATLAB компактен и в основном использует конструкции C или C++.Вручную преобразуйте код MATLAB в код C or C++. Выберите интегрирование подход для кода C or C++.

Интеграционные подходы для внешнего кода C или C++

7Разделы внешнего кода MATLAB сопоставлены со встроенными блоками.Разрабатывайте алгоритм в контексте модели, используя применимые встроенные блоки.

Чтобы встраивать внешний код MATLAB в блок MATLAB Function или сгенерировать код C or C++ из кода MATLAB с помощью программного обеспечения MATLAB Coder, код MATLAB должен использовать функции и классы, поддерживаемые для генерации кода C/C + +.

Интеграционные подходы для внешнего кода C или C++

В большинстве случаев можно интегрировать внешний код, написанный на C или C++, в окружение Simulink, сгенерировав S-функции и файлы TLC с помощью Legacy Code Tool. Этот инструмент использует спецификации, которые вы поставляете в качестве кода MATLAB, чтобы преобразовать существующие функции MATLAB в S-функции C MEX, которые можно включить в модели Simulink и вызвать из сгенерированного кода. Для получения дополнительной информации смотрите Реализация Алгоритмов с использованием Legacy Code Tool и Импорт Вызовов во Внешний Код в Сгенерированный Код с помощью Legacy Code Tool.

По сравнению с альтернативными подходами, Legacy Code Tool является наиболее оптимальным выбором для генерации кода, оптимизированного достаточно для встраиваемых систем. Рассмотрите альтернативные подходы, если существует одно или несколько из следующих условий:

  • Внешний код использует глобальные переменные для обмена данными.

  • Опыт программирования ограничен.

  • Алгоритм должен смоделировать дискретную и непрерывную динамику состояний.

  • Необходимо включить интегрированный внешний код в диаграмму Stateflow.

  • Внешний код требует интерфейса с фиксированной точкой.

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

  • Вы быстро хотите встраивать вызов к внешнему коду в вызов к coder.ceval функция, которая встроена в блок MATLAB Function, и эффективность не является проблемой.

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

 Условие или требованиеДействиеДополнительная информация
1Вы хотите интегрировать внешний код С с сгенерированным кодом С++ или наоборотСоответствие языковому выбору сгенерированного кода путем изменения языка внешнего кода.Измените язык программирования внешнего кода, чтобы соответствовать сгенерированному коду
2Ваш алгоритм включает проект себя логику, которая основана на машинах состояний и графиках потока. Или функция, которую вы хотите интегрировать, должна обмениваться данными с моделью с помощью глобальных переменных. Функция задает глобальные переменные и использует их для записи выхода, а не для возврата значения (return) или записи выхода в аргумент.Добавьте диаграмму Stateflow к модели. Вызовите внешний код из графика, используя C в качестве языка действий. На графике напишите код, который вызывает внешнюю функцию и читает и записывает в глобальные переменные. Чтобы выполнить вычисления с выходом внешнего кода, модель должна считываться с глобальной переменной во время выполнения.Вставка внешнего кода в диаграммы Stateflow
3Вы хотите включить внешние коды C or C++ в диаграмму Stateflow для симуляции и генерации кода.Сконфигурируйте модель, которая содержит график, чтобы применить внешний код C or C++.
4Вы быстро хотите встраивать вызов внешних кодов C or C++ в модель. Эффективность не является проблемой.Вызовите код C or C++ с помощью coder.ceval функция из блока MATLAB Function.
5Приложение требует больше функций точки входа, чем обычно производит генератор кода - например, больше, чем model_step, model_initialize, и model_terminate. Вы хотите максимальную гибкость для управления тем, какой код производит генератор кода.Вручную запишите S-функцию и файл TLC.
6Вы хотите симулировать и сгенерировать внешний код для приложения дискретного времени. Оптимизация сгенерированного кода необходима. Вы хотите простоты использования с умеренной гибкостью для управления тем, какой код производит генератор кода. У вас есть опыт программирования на C или C++, но вы предпочитаете генерировать файлы для добавления кода к модели.

Сгенерируйте S-функции и файлы TLC с помощью Legacy Code Tool. При необходимости доработайте сгенерированный код вручную в соответствии с требованиями приложения. (Если вы измените сгенерированный код, вы потеряете изменения, если регенерируете файлы S-функции и TLC.)

Для простых алгоритмов, написанных на C, рассмотрите использование блока Simulink C Caller.

7Алгоритм должен смоделировать дискретную и непрерывную динамику состояний для симуляции и быстрого прототипирования. Внешний код требует интерфейса с фиксированной точкой. Опыт программирования ограничен. Вы хотите простоты использования с основной гибкостью для управления тем, какой код производит генератор кода для быстрого прототипирования.Сгенерируйте файлы S-функции и TLC с помощью S-Function Builder. При необходимости доработайте сгенерированный код вручную в соответствии с требованиями приложения. (Если вы измените сгенерированный код, вы потеряете изменения, если регенерируете файлы S-функции и TLC.)

Измените язык программирования внешнего кода, чтобы соответствовать сгенерированному коду

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

  • Запись или перезапись внешнего кода на языке выбора для сгенерированного кода.

  • Если вы генерируете код С++, а внешний код является кодом С, для каждой функции C создайте заголовочный файл, который прототипирует функцию. Использовать следующий формат:

    #ifdef __cplusplus
    extern "C" {
    #endif
    int my_c_function_wrapper();
    #ifdef __cplusplus
    }
    #endif

    Прототип служит оберткой функции. Если ваш компилятор поддерживает код С++, значение __cplusplus задан. Спецификация редактирования extern "C" задает редактирование C без управления именами.

  • Если вы генерируете код С, а внешний код является кодом С++, включите extern "C" спецификация редактирования в каждом .cpp файл. Например, в следующем примере показан код С++ в файле my_func.cpp:

    extern "C" {
    
    int my_cpp_function()
    {
      ...
    }
    }

Интеграционные подходы к внешнему коду на языке Фортран

Чтобы интегрировать внешний код Фортран, запишите S-функцию и соответствующие файлы TLC.

См. Основы C/C + + S-Function, Реализация алгоритмов с использованием кода на языке Фортран, S-функций и генерации кода и Примеры S-Function Фортран.

Вставка внешнего кода в диаграммы Stateflow

Интеграция внешнего кода для библиотечных Графиков

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

  1. В редакторе Stateflow откройте диалоговое окно Model Параметры Конфигурации. Выберите Use local custom code settings (do not inherit from main model) параметра,

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

  2. Укажите свой пользовательский код в подпанелях.

    Следуйте инструкциям в разделе «Задание относительных путей к пользовательскому коду» (Stateflow).

    Если вы задали пользовательские настройки кода для симуляции, можно применить эти настройки к генерации кода. Чтобы избежать ввода одной и той же информации дважды, выберите Use the same custom code settings as Simulation Target.

  3. Нажмите OK.

Завершив эти шаги для каждой модели библиотеки, сгенерируйте код.

Интеграция внешнего кода для всех графиков

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

  1. Задайте пользовательские опции кода для генерации кода вашей основной модели.

    1. В диалоговом окне Model Configuration Parameters выберите Code Generation > Custom Code.

    2. В текстовых полях пользовательского кода укажите свой пользовательский код.

      Следуйте инструкциям в разделе «Задание относительных путей к пользовательскому коду» (Stateflow).

      Если вы задали пользовательские настройки кода для симуляции, можно применить эти настройки к генерации кода. Чтобы избежать ввода одной и той же информации дважды, выберите Use the same custom code settings as Simulation Target.

  2. Сконфигурируйте генерацию кода для каждой библиотечной модели, которая вносит вклад в график вашей основной модели. В редакторе Stateflow откройте диалоговое окно Model Параметры Конфигурации. Очистить Use local custom code settings (do not inherit from main model) параметра. Библиотека графиков наследовать пользовательские настройки кода вашей основной модели. Нажмите OK.

  3. Сгенерируйте код.

Вызов внешнего кода С из модели и сгенерированного кода

Вызовите существующие, внешние функции из симуляции или из сгенерированного кода с помощью Legacy Code Tool.

Узнать, как:

  • Оцените функцию C как часть симуляции модели Simulink ®.

  • Вызовите функцию C из кода, который вы генерируете из модели.

Для получения информации о примере см. Раздел «Подготовка модели алгоритма управления для генерации кода C».

Процесс замены

Откройте модель примера, rtwdemo_PCG_Eval_P4.

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

В этом примере вы создаете пользовательский блок Simulink ®, который вызывает существующую функцию C. Затем вы включаете блок в модель и тестируете общую систему посредством симуляции модели в Simulink ®.

В модели примера можно заменить Интерполяционные блоки (интерполяционные таблицы) в ПИ-контроллеры вызовами существующей функции C. Функция определяется в файлах SimpleTable.c и SimpleTable.h.

Просмотрите SimpleTable.c.

Просмотрите SimpleTable.h.

Создайте блок, который вызывает функцию C

Чтобы задать вызов существующей функции C, используйте блок S-Function. Можно автоматизировать создание блока S-Function с помощью Legacy Code Tool. В инструменте вы сначала задаете интерфейс для существующей функции C. Затем инструмент использует этот интерфейс, чтобы создать блок S-Function.

Используйте Legacy Code Tool, чтобы создать блок S-Function для существующей функции C в SimpleTable.c.

1. Создайте структуру, которая будет содержать определение интерфейса функции.

def = legacy_code('initialize')

Можно использовать структуру def для определения интерфейса функции к существующему коду С

2. Заполните поля структуры.

3. Создайте S-функцию.

legacy_code('sfcn_cmex_generate',def)

4. Скомпилируйте S-функцию.

legacy_code('compile',def)

5. Создайте блок S-Function.

legacy_code('slblock_generate',def)

Сгенерированный блок S-Function вызывает функцию C в SimpleTable.c. Теперь можно использовать этот блок S-Function в моделях.

6. Создайте файл TLC.

legacy_code('sfcn_tlc_generate',def)

Эта команда создает файл TLC, который является компонентом S-Функции, которая задает, как сгенерировать код для блока.

Валидация внешнего кода посредством симуляции

Когда вы интегрируете существующий код С в модель Simulink ®, проверьте сгенерированный блок S-Function .

Чтобы подтвердить замену блоков Lookup, сравните результаты симуляции, произведенные блоками Lookup, с результатами, полученными новым блоком S-Function.

1. Откройте модель валидации.

  • Блок Sine Wave производит выходные значения из [-2: 2].

  • Входная область значений интерполяционной таблицы от [-1: 1].

  • Интерполяционная таблица выводит абсолютное значение входа.

  • Интерполяционная таблица отсекает выход на входе пределов.

2. Запустите модель валидации.

Рисунок показывает результаты валидации. Существующий код С и блок таблицы Simulink ® выдают одинаковые выходные значения .

Проверьте код С как часть модели Simulink ®

После проверки существующего кода функции C как автономного компонента проверьте S-функцию в модели. Чтобы завершить валидацию, используйте модель тестовой обвязки.

1. Откройте тестовую обвязку.

2. Запустите тестовую обвязку.

Результаты симуляции совпадают с золотыми значениями.

Вызов функции C из сгенерированного кода

Генератор кода использует файл TLC, чтобы обработать блок S-Function, как и любой другой блок. Генератор кода может реализовать складывание выражения с блоком S-Function, операцией, которая объединяет несколько расчеты в одно выходное вычисление.

1. Создайте полную модель.

2. Исследуйте сгенерированный код в PI_Control_Reusable.c.

Сгенерированный код теперь вызывает SimpleTable Функция C.

Рисунки показывают сгенерированный код до и после интегрирования кода С. Перед интегрированием код вызывает сгенерированную стандартную программу поиска. После интегрирования сгенерированный код вызывает функцию C SimpleTable.

Похожие темы