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

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

  • Модульное исполнение приложения

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

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

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

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

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

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

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

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

  • Управляющие модули пропорциональной интегральной производной (PID)

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

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

ЗадачаДействиеБольше информации
1Рассмотрите свою оценку внешних характеристик кода и требований интегрирования.Выберите External Code Integration Workflow (Embedded Coder)
2На основе языка программирования внешнего кода выберите подход интегрирования, чтобы добавить внешний код в модель Simulink.Выберите Integration Approach (Embedded Coder)
3Проверьте поведение алгоритма и производительность путем симуляции модели.Симуляция (Simulink)
4Задайте представление данных модели для генерации кода.Обменивайтесь Данными Между Внешним Кодом C/C++ и Типовым кодексом Simulink или Сгенерированным кодом (Embedded Coder)
5Сконфигурируйте модель для генерации кода.Сгенерируйте код, который совпадает с внешним видом внешнего кода (Embedded Coder) и настройка модели (Embedded Coder)
6Сгенерируйте код и отчет генерации кода.Генерация кода (Embedded Coder)
7Рассмотрите интерфейс сгенерированного кода и статические метрики кода.Анализируйте интерфейс сгенерированного кода (Embedded Coder) и статические метрики кода (Embedded Coder)
8Создайте исполняемую программу из модели.Создайте интегрированный код в окружении Simulink (Embedded Coder)
9Проверьте, что исполняемая программа ведет себя как ожидалось.Числовая эквивалентность, тестирующая (Embedded Coder)
10Проверьте, что исполняемая программа выполняет как ожидалось.Выполнение кода, профилирующее (Embedded Coder)

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

Несколько подходов доступны для интеграции допускающего повторное использование алгоритмического кода в окружение 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 or C++ (Embedded Coder)

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

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

Подходы интегрирования для внешнего кода C or C++

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

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

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

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

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

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

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

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

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

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

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

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

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

7Алгоритм должен смоделировать дискретную и непрерывную динамику состояния для симуляции и быстрого прототипирования. Внешний код требует интерфейса фиксированной точки. Программирование опыта ограничивается. Вы хотите простоту использования с основной гибкостью для управления, какой код генератор кода производит для быстрого прототипирования.Сгенерируйте S-функцию и файлы TLC при помощи Разработчика S-функции. При необходимости совершенствуйте сгенерированный код вручную, чтобы соответствовать требованиям к приложению. (Если вы изменяете сгенерированный код, вы теряете изменения, если вы регенерируете 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.

Смотрите Основы S-функции C/C++ (Simulink), Алгоритмы Реализации Используя код на языке Фортран (Simulink), S-функции и Генерация кода (Embedded Coder), andFortran Примеры S-функции (Simulink).

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

Интегрируйте внешний код для графиков библиотеки

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

  1. В редакторе Stateflow откройте диалоговое окно Model Configurations. Выберите параметр 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 Configuration. Очистите параметр Use local custom code settings (do not inherit from main model). Графики библиотеки наследовали настройки пользовательского кода вашей основной модели. Нажмите OK.

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

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

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

Узнать, как к:

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

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

Для получения информации о модели в качестве примера смотрите, Генерируют код С от Алгоритма управления для Встраиваемой системы (Embedded Coder).

Заменяющий процесс

Откройте модель в качестве примера, 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.

Чтобы подтвердить замену блоков Поиска, сравните результаты симуляции, произведенные блоками Поиска с результатами, приведенными новым Блоком 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.

Похожие темы