Оцените функцию 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. Если блок является частью модели, можно использовать среду моделирования для дальнейшего тестирования системы.
Чтобы задать вызов внешней функции 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 определяет интерфейс функции для внешнего кода C.
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-функциональный блок:
legacy_code('slblock_generate', def)Откроется новое окно модели, содержащее SimpTableWrap блок.
Совет
Создание блока S-Function является одноразовой задачей. После создания блока его можно повторно использовать в нескольких моделях.
Сохраните модель в рабочей папке как: s_func_simptablewrap.
Создайте файл компилятора целевого языка (TLC) для блока S-Function:
legacy_code('sfcn_tlc_generate', def)Файл TLC является компонентом S-функции, которая определяет, как генератор кода создает код для блока.
Дополнительные сведения об использовании прежнего инструмента кода см. в разделе:
При интеграции внешнего кода C с моделью Simulink перед использованием кода проверьте функциональность внешнего кода функции C как автономного компонента.
Открытие модели rtwdemo_ValidateLegacyCodeVrsSim. Эта модель проверяет созданный блок S-функций.

Блок синусоидальной волны выдает выходные значения из [-2: 2].
Диапазон входных значений таблицы подстановки - от [-1: 1].
Выходные данные таблицы подстановки представляют собой абсолютное значение входных данных.
Выходные данные таблицы поиска обрезают выходные данные в пределах входных значений.
Моделирование модели.
Просмотрите результаты проверки, открыв Validation и в этой подсистеме щелкните на блоке Scope.
На следующем рисунке показаны результаты проверки. Внешний код C и блок таблицы поиска Simulink обеспечивают одинаковые выходные значения.

Закройте модель проверки.
После проверки функциональности внешнего кода функции C в качестве автономного компонента проверьте S-функцию в модели. Используйте тестовую модель электрического жгута для завершения проверки.
Примечание
Для выполнения следующей процедуры требуется лицензия Stateflow ®.
Открытый rtwdemo_throttlecntrl_extfunccall и сохраните копию в throttlecntrl_extfunccall в доступной для записи папке на вашем пути MATLAB.
Осмотрите PI_ctrl_1 и PI_ctrl_2 подсистем.
Блоки подстановки были заменены блоком, созданным с помощью инструмента «Устаревший код».
Проверьте настройки параметров блока для SimpTableWrap и SimpTableWrap1.
Закройте диалоговые окна «Параметр блока» и окна подсистемы PI.
Откройте модель тестового электрического жгута, щелкните правой кнопкой мыши значок Unit_Under_Test
Блок модели и выберите Параметры блока (Model Reference).
Задать для имени модели значение throttlecntrl_extfunccall. Нажмите кнопку ОК.
Обновите схему модели тестового кабеля.
Смоделировать тестовый жгут.
Результаты моделирования соответствуют ожидаемым золотым значениям.

Сохранить и закрыть throttlecntrl_extfunccall и throttlecntrl_testharness.
Генератор кода использует файл TLC для обработки блока S-Function. Вызовы кода C, встроенного в S-функциональный блок:
Может использовать объекты данных.
Являются объектом сворачивания выражения, операции, которая объединяет несколько вычислений в один выходной расчет.
Открытый throttlecntrl_extfunccall.
Создайте код для модели.
Проверьте созданный код в файлеthrottlecntrl_extfunccall.c.
Закрыть throttlecntrl_extfunccall и throttlecntrl_testharness.
Можно легко интегрировать внешние функции в модель и сгенерированный код с помощью инструмента «Код прежней версии».
Проверьте функциональность внешнего кода функции C, который интегрируется в модель как автономный компонент.
После проверки функциональности внешнего кода функции C в качестве автономного компонента проверьте S-функцию в модели.