Оцените функцию 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 с помощью Simulink Legacy Code Tool. Используя этот инструмент, задайте интерфейс для вашей внешней функции 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
.
Создайте файл Target Language Compiler (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
.
Закройте диалоговые окна Параметров блоков и окна подсистемы ПИ.
Откройте тестовую обвязку модель, щелкните правой кнопкой мыши по 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
.
Сгенерируйте код для модели.
Исследуйте сгенерированный код в файле throttlecntrl_extfunccall.c
.
Закройте throttlecntrl_extfunccall
и throttlecntrl_testharness
.
Можно легко интегрировать внешние функции в модель и сгенерированный код с помощью Legacy Code Tool.
Проверьте функциональность кода внешней функции C, которую вы интегрируете в модель как автономный компонент.
После проверки функциональности кода внешней функции C как автономного компонента проверьте S-функцию в модели.