Повторное использование кода обеспечивает бизнес и технологические преимущества. С точки зрения бизнеса повторное использование кода экономит время и ресурсы. С технологической точки зрения повторное использование кода способствует согласованности и снижает требования к памяти. Другие соображения включают в себя:
Модуляция приложения
Повторное использование оптимизированного алгоритма
Взаимодействие с предопределенным набором данных
Разработка вариантов применения
Примеры многократно используемого аппаратно-независимого алгоритмического кода, который необходимо импортировать в среду Simulink ® для моделирования и генерации кода:
Служебные функции
Таблицы подстановки
Цифровые фильтры
Специализированные интеграторы
Модули управления пропорциональной интегральной производной (PID)
Для вызова многократно используемого внешнего кода алгоритма для моделирования и создания кода выполните итерацию задач, перечисленных в этой таблице.
| Задача | Действие | Дополнительные сведения |
|---|---|---|
| 1 | Просмотрите оценку внешних признаков кода и требований к интеграции. | Выбор потока операций интеграции внешнего кода |
| 2 | На основе языка программирования внешнего кода выберите интеграционный подход для добавления внешнего кода в модель Simulink. | Выбор интеграционного подхода |
| 3 | Проверьте поведение и производительность алгоритма путем моделирования модели. | Моделирование |
| 4 | Определите представление данных модели для генерации кода. | Обмен данными между внешним кодом C/C + + и моделью Simulink или сгенерированным кодом |
| 5 | Сконфигурируйте модель для создания кода. | Создание кода, соответствующего внешнему коду и конфигурации модели |
| 6 | Создание кода и отчета о создании кода. | Создание кода |
| 7 | Просмотрите сгенерированный интерфейс кода и метрики статического кода. | Анализ сгенерированного интерфейса кода и статических метрик кода |
| 8 | Создайте исполняемую программу из модели. | Создание интегрированного кода в среде Simulink |
| 9 | Убедитесь, что исполняемая программа работает так, как ожидалось. | Проверка численной эквивалентности |
| 10 | Убедитесь, что исполняемая программа работает так, как ожидалось. | Профилирование выполнения кода |
Существует несколько подходов для интеграции многоразового алгоритмического кода в среду Simulink для генерации кода. Некоторые подходы непосредственно интегрируют внешний код. Другие подходы преобразуют внешний код в элементы моделирования Simulink или Stateflow ® для моделирования, а затем для генерации кода из смоделированной конструкции. Выбор интеграционного подхода зависит от:
Язык программирования внешнего кода - MATLAB ®, C, C++ или Fortran
Ваш язык программирования и ваши предпочтения
Требования к производительности
Должен ли алгоритм моделировать непрерывную динамику времени или вы интегрируете алгоритм в приложение, использующее дискретное и непрерывное время
Хотите ли вы воспользоваться преимуществами конструирования на основе модели?
Уровень контроля над кодом, создаваемым генератором кода
Чтобы выбрать подход для многократно используемого алгоритма, см. подраздел, соответствующий языку программирования кода внешнего алгоритма.
Существует несколько подходов для интеграции внешнего кода MATLAB в среду Simulink. Следующая диаграмма и таблица помогают выбрать оптимальный подход к интеграции для приложения на основе требований к интеграции.

| Условие или требование | Действие | Дополнительные сведения | |
|---|---|---|---|
| 1 | Алгоритм должен моделировать непрерывную динамику состояния. | Запишите S-функцию MATLAB и, для генерации кода, соответствующий файл TLC для алгоритма. Добавьте в модель S-функцию. | |
| 2 | Внешний код соответствует коду MATLAB для подмножества генерации кода, и требуется вызвать код MATLAB из модели Simulink. | Добавьте в модель функциональный блок MATLAB. Вставьте код MATLAB в этот блок. | |
| 3 | Внешний код соответствует коду MATLAB для подмножества генерации кода, требуется вызвать код MATLAB из модели Simulink, а алгоритм включает итеративные вычисления, обрабатывающие большие потоки данных. | Добавьте в модель системный блок MATLAB. Вставьте код MATLAB в этот блок в качестве системного object™. | |
| 4 | Внешний код соответствует коду MATLAB для подмножества генерации кода, требуется вызвать код MATLAB из модели Simulink, а алгоритм включает логику проектирования, основанную на конечных автоматах и блок-схемах. | Добавьте в модель диаграмму Stateflow. Вызовите внешний код из диаграммы, используя MATLAB в качестве языка действий. | |
| 5 | Вы хотите использовать parfor для параллельных вычислений или типов данных интерфейса, доступных для MATLAB Coder™, Simulink Coder и Embedded Coder ®. Использоватьparfor, необходимо установить Toolbox™ параллельных вычислений. | Используйте программное обеспечение для создания кода C. Затем вызовите сгенерированный код как внешний код C. | |
| 6 | У вас есть опыт программирования C или C++, а внешний код MATLAB компактен и в основном использует конструкции C или C++. | Вручную преобразуйте код MATLAB в код C или C++. Выберите подход интеграции для кода C или C++. | |
| 7 | Разделы внешнего кода MATLAB соответствуют встроенным блокам. | Разработка алгоритма в контексте модели с использованием применимых встроенных блоков. |
Для встраивания внешнего кода MATLAB в функциональный блок MATLAB или генерации кода C или C++ из кода MATLAB с помощью программного обеспечения MATLAB Coder код MATLAB должен использовать функции и классы, поддерживаемые для генерации кода C/C + +.
В большинстве случаев внешний код, написанный на языке C или C++, можно интегрировать в среду Simulink, создав S-функции и TLC-файлы с помощью Legacy Code Tool. Этот инструмент использует спецификации, поставляемые в виде кода MATLAB, для преобразования существующих функций MATLAB в C MEX S-функции, которые можно включить в модели Simulink и вызвать из сгенерированного кода. Дополнительные сведения см. в разделах Реализация алгоритмов с использованием прежнего кода и Импорт вызовов внешнего кода в сгенерированный код с помощью прежнего кода.
По сравнению с альтернативными подходами, Legacy Code Tool является наиболее оптимальным выбором для создания кода, достаточно оптимизированного для встраиваемых систем. Рассмотрим альтернативные подходы при наличии одного или нескольких из следующих условий:
Внешний код использует глобальные переменные для обмена данными.
Опыт программирования ограничен.
Алгоритм должен моделировать дискретную и непрерывную динамику состояния.
Необходимо включить интегрированный внешний код в диаграмму Stateflow.
Внешний код требует интерфейса с фиксированной точкой.
Требуется максимальная гибкость для управления кодом, создаваемым генератором кода.
Необходимо быстро встроить вызов во внешний код в вызов coder.ceval функция, встроенная в функциональный блок MATLAB, и производительность не является проблемой.
Эта диаграмма и таблица помогают выбрать оптимальный подход к интеграции в соответствии с требованиями к интеграции.

| Условие или требование | Действие | Дополнительные сведения | |
|---|---|---|---|
| 1 | Требуется интегрировать внешний код C с сгенерированным кодом C++ или наоборот. | Подберите язык для созданного кода путем изменения языка внешнего кода. | Изменение языка программирования внешнего кода в соответствии с сгенерированным кодом |
| 2 | Алгоритм включает логику проектирования, основанную на конечных автоматах и блок-схемах. Или функция, которую требуется интегрировать, должна обмениваться данными с моделью с помощью глобальных переменных. Функция определяет глобальные переменные и использует их для записи выходных данных, а не для возврата значения (возврата) или записи выходных данных в аргумент. | Добавьте в модель диаграмму Stateflow. Вызовите внешний код из диаграммы, используя C в качестве языка действий. На диаграмме запишите код, вызывающий внешнюю функцию и считывающий и записывающий глобальные переменные. Для выполнения вычислений с выводом внешнего кода модель должна считываться из глобальной переменной во время выполнения. | Вставка внешнего кода в диаграммы потока состояний |
| 3 | Требуется включить внешний код C или C++ в диаграмму Stateflow для моделирования и создания кода. | Настройте модель, содержащую диаграмму, для применения внешнего кода C или C++. |
|
| 4 | Необходимо быстро внедрить вызов внешнего кода C или C++ в модель. Производительность не является проблемой. | Вызовите код C или C++ с помощью coder.ceval функция из блока функции MATLAB. |
|
| 5 | Приложение требует больше функций точки входа, чем обычно производит генератор кода - например, больше, чем, , и . Требуется максимальная гибкость для управления кодом, создаваемым генератором кода. | Вручную запишите файл S-функции и TLC. | |
| 6 | Требуется смоделировать и создать внешний код для дискретного приложения времени. Важное значение имеет оптимизация сгенерированного кода. Требуется простота использования с умеренной гибкостью для управления тем, какой код создает генератор кода. У вас есть опыт программирования на C или C++, но вы предпочитаете создавать файлы для добавления кода в модель. | Создайте файлы S-функций и TLC с помощью инструмента Legacy Code Tool. При необходимости уточните созданный код вручную в соответствии с требованиями приложения. (При изменении созданного кода изменения будут потеряны при регенерации файлов S-функции и TLC.) Для простых алгоритмов, написанных на языке C, рекомендуется использовать блок Simulink C Caller. | |
| 7 | Алгоритм должен моделировать дискретную и непрерывную динамику состояния для моделирования и быстрого прототипирования. Внешний код требует интерфейса с фиксированной точкой. Опыт программирования ограничен. Вам нужна простота использования с базовой гибкостью для управления тем, что создает генератор кода для быстрого прототипирования. | Создайте файлы S-функций и TLC с помощью построителя S-функций. При необходимости уточните созданный код вручную в соответствии с требованиями приложения. (При изменении созданного кода изменения будут потеряны при регенерации файлов S-функции и TLC.) |
Для интеграции внешнего кода C с сгенерированным кодом C++ или наоборот измените язык внешнего кода в соответствии с выбором языка программирования для сгенерированного кода. Варианты согласования языка программирования включают в себя:
Запись или перезапись внешнего кода в выбранном языке для созданного кода.
Если создается код C++, а внешним кодом является код C, для каждой функции C создайте файл заголовка, который прототипирует функцию. Используйте следующий формат:
#ifdef __cplusplus
extern "C" {
#endif
int my_c_function_wrapper();
#ifdef __cplusplus
}
#endifПрототип служит в качестве оболочки функции. Если компилятор поддерживает код C++, значение __cplusplus определяется. Спецификация соединения extern "C" указывает связь C без искажения имен.
Если создается код C, а внешним кодом является код C++, включите extern "C" спецификация связи в каждом .cpp файл. Например, в следующем примере показан код C++ в файле my_func.cpp:
extern "C" {
int my_cpp_function()
{
...
}
}Для интеграции внешнего кода Fortran необходимо записать S-функцию и соответствующий файл TLC.

См. Основные сведения о C/C + + S-функциях, Реализация алгоритмов с использованием кода Fortran, S-функции и генерация кода, Примеры S-функций Fortran.
Чтобы интегрировать внешний код, который применяется только к библиотечным диаграммам Stateflow для создания кода, для каждой библиотечной модели, которая вносит диаграмму в основную модель, выполните следующие действия. Затем создайте код.
В редакторе потока состояний откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters). Выберите параметр Использовать локальные пользовательские настройки кода (не наследовать от главной модели),
При создании кода в библиотечной модели сохраняются собственные пользовательские настройки кода.
Укажите пользовательский код в подпанелях.
Следуйте инструкциям в разделе Указание относительных путей к пользовательскому коду (поток состояний).
Если для моделирования заданы пользовательские параметры кода, их можно применить к созданию кода. Чтобы избежать двойного ввода одной и той же информации, выберите "Использовать те же пользовательские настройки кода, что и" Цель моделирования ".
Нажмите кнопку ОК.
После выполнения этих шагов для каждой библиотечной модели создайте код.
Для интеграции внешнего кода, который применяется ко всем диаграммам для создания кода:
Укажите параметры пользовательского кода для создания кода главной модели.
В диалоговом окне «Параметры конфигурации модели» выберите «Создание кода» > «Пользовательский код».
В текстовых полях пользовательского кода укажите пользовательский код.
Следуйте инструкциям в разделе Указание относительных путей к пользовательскому коду (поток состояний).
Если для моделирования заданы пользовательские параметры кода, их можно применить к созданию кода. Чтобы избежать двойного ввода одной и той же информации, выберите "Использовать те же пользовательские настройки кода, что и" Цель моделирования ".
Настройте создание кода для каждой библиотечной модели, которая вносит диаграмму в основную модель. В редакторе потока состояний откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters). Очистить параметр Использовать локальные пользовательские настройки кода (не наследовать от главной модели). Библиотечные диаграммы наследуют пользовательские настройки кода главной модели. Нажмите кнопку ОК.
Создать код.
Вызовите существующие внешние функции из моделирования или из сгенерированного кода с помощью прежнего инструмента кода.
Узнайте, как:
Оцените функцию C как часть моделирования модели Simulink ®.
Вызовите функцию C из кода, создаваемого из модели.
Сведения о модели примера см. в разделе Подготовка модели алгоритма управления для генерации кода C.
Процесс замены
Откройте пример модели, rtwdemo_PCG_Eval_P4.
Для многих приложений на основе моделей, помимо моделей Simulink ®, конструкция включает набор существующих функций C, которые были протестированы и проверены. Эти функции можно интегрировать в модель Simulink ® и создать код, использующий эти функции.
В этом примере создается пользовательский блок Simulink ®, вызывающий существующую функцию C. Затем блок включается в модель и тестируется вся система с помощью моделирования модели в Simulink ®.
В примере модели блоки подстановки (таблицы подстановки) в контроллерах PI можно заменить вызовами существующей функции C. Функция определена в файлах SimpleTable.c и SimpleTable.h.
Создать блок, вызывающий функцию C
Чтобы указать вызов существующей функции C, используйте блок S-Function. Можно автоматизировать создание блока S-Function с помощью инструмента Legacy Code Tool. В инструменте сначала указывается интерфейс для существующей функции C. Затем инструмент использует этот интерфейс для создания блока S-Function.
Для создания блока S-Function для существующей функции C используйте инструмент устаревшего кода. SimpleTable.c.
1. Создайте структуру, содержащую определение интерфейса функции.
def = legacy_code('initialize')
Можно использовать структуру def для определения интерфейса функции к существующему коду C.
legacy_code('sfcn_cmex_generate',def)
legacy_code('compile',def)
legacy_code('slblock_generate',def)
Сгенерированный блок S-Function вызывает функцию C в SimpleTable.c. Теперь этот S-функциональный блок можно использовать в моделях.
legacy_code('sfcn_tlc_generate',def)
Эта команда создает файл TLC, который является компонентом S-функции, определяющей способ создания кода для блока.
Проверка внешнего кода с помощью моделирования
При интеграции существующего кода C в модель Simulink ® следует проверить созданный блок S-Function .
Для проверки замены блоков Lookup сравните результаты моделирования, полученные блоками Lookup, с результатами, полученными новым блоком S-Function.
Блок синусоидальной волны выдает выходные значения из [-2: 2].
Диапазон входных значений таблицы подстановки - от [-1: 1].
Таблица поиска выводит абсолютное значение входного значения.
Таблица подстановки отсекает выходные данные на входных границах.
На рисунке показаны результаты проверки. Существующий код C и табличный блок Simulink ® дают одинаковые выходные значения .
Проверка кода C как части модели Simulink ®
После проверки существующего кода функции C в качестве автономного компонента проверьте S-функцию в модели. Для завершения проверки используйте тестовую модель электрического жгута.
Результаты моделирования соответствуют золотым значениям.
Вызов функции C из сгенерированного кода
Генератор кода использует файл TLC для обработки блока S-Function, как и любой другой блок. Генератор кода может реализовать сворачивание выражения с помощью блока S-Function, операции, которая объединяет несколько вычислений в одно вычисление вывода.
2. Проверьте созданный код в PI_Control_Reusable.c.
Созданный код теперь вызывает SimpleTable Функция С.
На рисунках показан сгенерированный код до и после интеграции кода C. Перед интеграцией код вызывает сгенерированную процедуру поиска. После интеграции сгенерированный код вызывает функцию C SimpleTable.

