Выполните функцию 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_1
и PI_ctrl_2
подсистемы.
Блоки Lookup были заменены блоком, вы создали использование Legacy Code Tool.
Исследуйте настройки параметров блоков на SimpTableWrap
и SimpTableWrap1
.
Закройте диалоговые окна Block Parameter и окна подсистемы PI.
Откройте модель тестовой обвязки, щелкните правой кнопкой по Unit_Under_Test
Блок Model, и выбирает 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-функцию в модели.