Выполните функцию C как часть симуляции модели.
Вызовите внешнюю функцию C от сгенерированного кода.
Способность открыться и изменить модели Simulink® и подсистемы.
Способность установить образцовые параметры конфигурации.
Способность считать код С.
Установленный, поддерживаемый компилятор C.
Файл модели rtwdemo_throttlecntrl_extfunccall
Файл модели rtwdemo_ValidateLegacyCodeVrsSim
/toolbox/rtw/rtwdemos/EmbeddedCoderOverview/stage_4_files/SimpleTable.c
/toolbox/rtw/rtwdemos/EmbeddedCoderOverview/stage_4_files/SimpleTable.h
Модели Simulink являются одной частью Модельно-ориентированного проектирования. Для многих приложений проект также включает набор существования ранее C созданные функции, протестированные (проверенный), и подтвердил за пределами MATLAB® и окружения Simulink. Можно интегрировать эти функции легко в модель и сгенерированный код. Можно использовать внешний код С в сгенерированном коде, чтобы получить доступ к аппаратным устройствам и внешним файлам данных во время быстрых выполнений симуляции.
Этот пример показывает вам, как создать авторский блок, который вызывает внешнюю функцию C. Когда блок является частью модели, можно использовать в своих интересах среду симуляции, чтобы протестировать систему далее.
Чтобы задать вызов внешней функции C, используйте Блок s-function. Можно автоматизировать процесс создания Блока s-function при помощи Legacy Code Tool Simulink. Используя этот инструмент, задайте интерфейс для своей внешней функции C. Инструмент затем использует тот интерфейс, чтобы автоматизировать создание Блока s-function.
Сделайте копии файлов SimpleTable.c
и SimpleTable.h
, расположенным в папке
(открытый). Поместите копии в свою рабочую папку.matlabroot/toolbox/rtw/rtwdemos/EmbeddedCoderOverview/stage_4_files
Создайте Блок s-function, который вызывает заданную функцию на каждом временном шаге во время симуляции:
В Окне Команды MATLAB создайте функциональную интерфейсную структуру определения:
def=legacy_code('initialize')
Структура данных def
задает функциональный интерфейс к внешнему коду С.
def = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles: {} SourceFiles: {} HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime: 'inherited' Options: [1x1 struct]
Заполните функциональную интерфейсную структуру определения путем ввода следующих команд:
def.OutputFcnSpec=['double y1 = SimpleTable(double u1,',... 'double p1[], double p2[], int16 p3)']; def.HeaderFiles = {'SimpleTable.h'}; def.SourceFiles = {'SimpleTable.c'}; def.SFunctionName = 'SimpTableWrap';
Создайте S-функцию:
legacy_code('sfcn_cmex_generate', def)
Скомпилируйте S-функцию:
legacy_code('compile', def)
Создайте Блок s-function:
legacy_code('slblock_generate', def)
Новое окно модели открывается, который содержит блок SimpTableWrap
.
Создание Блока s-function является одноразовой задачей. Если блок существует, можно снова использовать его в многоуровневых моделях.
Сохраните модель в свою рабочую папку как: s_func_simptablewrap
.
Создайте файл Компилятора выходного языка (TLC) для Блока s-function:
legacy_code('sfcn_tlc_generate', def)
Файл TLC является компонентом S-функции, которая задает, как генератор кода производит код для блока.
Для получения дополнительной информации об использовании Legacy Code Tool см.:
Когда вы интегрируете внешний код С с моделью Simulink, перед использованием кода, подтверждаете функциональность внешнего кода функции C как автономный компонент.
Откройте модель rtwdemo_ValidateLegacyCodeVrsSim
. Эта модель подтверждает Блок s-function, который вы создали.
Блок Sine Wave производит выходные значения из [-2: 2].
Входной диапазон интерполяционной таблицы от [-1: 1].
Вывод от интерполяционной таблицы является абсолютным значением входа.
Интерполяционная таблица вывела, отсекает вывод во входных пределах.
Моделируйте модель.
Просмотрите результаты валидации путем открытия подсистемы Validation
и, в той подсистеме, нажатия на блок Scope.
Следующие данные показывают результаты валидации. Внешний код С и блок Интерполяционной таблицы Simulink обеспечивают те же выходные значения.
Закройте модель валидации.
После того, как вы подтверждаете функциональность внешнего кода функции C как автономный компонент, подтверждаете S-функцию в модели. Используйте модель тестовой обвязки, чтобы завершить валидацию.
Следующая процедура требует лицензии Stateflow®.
Откройте rtwdemo_throttlecntrl_extfunccall
и сохраните копию в throttlecntrl_extfunccall
в перезаписываемой папке на вашем пути MATLAB.
Исследуйте подсистемы PI_ctrl_2
и PI_ctrl_1
.
Блоки поиска были заменены блоком, вы создали использование Legacy Code Tool.
Отметьте настройки параметров блоков SimpTableWrap
и SimpTableWrap1
.
Закройте диалоговые окна Block Parameter и окна подсистемы PI.
Откройте модель тестовой обвязки, щелкните правой кнопкой по Unit_Under_Test
Model block и выберите Block Parameters (ModelReference).
Установите Model name на throttlecntrl_extfunccall
. Нажмите OK.
Обновите диаграмму модели тестовой обвязки.
Моделируйте тестовую обвязку.
Результаты симуляции совпадают с ожидаемыми золотыми значениями.
Сохраните и закройте throttlecntrl_extfunccall
и throttlecntrl_testharness
.
Генератор кода использует файл TLC, чтобы обработать Блок s-function. Вызовы кода С встроили в Блок s-function:
Может использовать объекты данных.
Подвергаются expression folding, операция, которая комбинирует множественные вычисления в одно выходное вычисление.
Открытый throttlecntrl_extfunccall
.
Сгенерируйте код для модели.
Исследуйте сгенерированный код в filethrottlecntrl_extfunccall.c
.
Закройте throttlecntrl_extfunccall
и throttlecntrl_testharness
.
Можно легко интегрировать внешние функции в типовой кодекс и сгенерированный код при помощи Legacy Code Tool.
Подтвердите функциональность внешнего кода функции C, который вы интегрируете в модель как автономный компонент.
После того, как вы подтверждаете функциональность внешнего кода функции C как автономный компонент, подтверждаете S-функцию в модели.