Вызовите внешние функции C

Об этом примере

Изучение целей

  • Выполните функцию 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

Включайте внешние функции C в модель

Модели Simulink являются одной частью Модельно-ориентированного проектирования. Для многих приложений проект также включает набор существования ранее C созданные функции, протестированные (проверенный), и подтвердил за пределами MATLAB® и окружения Simulink. Можно интегрировать эти функции легко в модель и сгенерированный код. Можно использовать внешний код С в сгенерированном коде, чтобы получить доступ к аппаратным устройствам и внешним файлам данных во время быстрых запусков симуляции.

Этот пример показывает вам, как создать пользовательский блок, который вызывает внешнюю функцию C. Когда блок является частью модели, можно использовать в своих интересах среду симуляции, чтобы протестировать систему далее.

Создайте блок, который вызывает функцию C

Чтобы задать вызов внешней функции C, используйте блок S-Function. Можно автоматизировать процесс создания блока S-Function при помощи Legacy Code Tool Simulink. Используя этот инструмент, задайте интерфейс для своей внешней функции C. Инструмент затем использует тот интерфейс, чтобы автоматизировать создание блока S-Function.

  1. Сделайте копии файлов SimpleTable.c и SimpleTable.h, расположенный в папке matlabroot/toolbox/rtw/rtwdemos/EmbeddedCoderOverview/stage_4_files открытый. Поместите копии в свою рабочую папку.

  2. Создайте блок S-Function, который вызывает заданную функцию на каждом временном шаге в процессе моделирования:

    1. В командном окне MATLAB создайте функциональную интерфейсную структуру определения:

      def=legacy_code('initialize')

      Структура данных def задает функциональный интерфейс к внешнему коду С.

      def = 
      
                        SFunctionName: ''
          InitializeConditionsFcnSpec: ''
                        OutputFcnSpec: ''
                         StartFcnSpec: ''
                     TerminateFcnSpec: ''
                          HeaderFiles: {}
                          SourceFiles: {}
                         HostLibFiles: {}
                       TargetLibFiles: {}
                             IncPaths: {}
                             SrcPaths: {}
                             LibPaths: {}
                           SampleTime: 'inherited'
                              Options: [1x1 struct]
    2. Заполните функциональную интерфейсную структуру определения путем ввода следующих команд:

      def.OutputFcnSpec=['double y1 = SimpleTable(double u1,',...
         'double p1[], double p2[], int16 p3)'];
      def.HeaderFiles = {'SimpleTable.h'};
      def.SourceFiles = {'SimpleTable.c'};
      def.SFunctionName = 'SimpTableWrap';
    3. Создайте S-функцию:

      legacy_code('sfcn_cmex_generate', def)
    4. Скомпилируйте S-функцию:

      legacy_code('compile', def)
    5. Создайте блок S-Function:

      legacy_code('slblock_generate', def)

      Новое окно модели открывается, который содержит SimpTableWrap блок.

      Совет

      Создание блока S-Function является одноразовой задачей. Если блок существует, можно снова использовать его в многоуровневых моделях.

  3. Сохраните модель в свою рабочую папку как: s_func_simptablewrap.

  4. Создайте файл Компилятора выходного языка (TLC) для блока S-Function:

    legacy_code('sfcn_tlc_generate', def)

    Файл TLC является компонентом S-функции, которая задает, как генератор кода производит код для блока.

Для получения дополнительной информации об использовании Legacy Code Tool см.:

Подтвердите внешний код в окружении Simulink

Когда вы интегрируете внешний код С с моделью Simulink, перед использованием кода, подтверждаете функциональность внешнего кода функции C как автономный компонент.

  1. Откройте модель rtwdemo_ValidateLegacyCodeVrsSim. Эта модель подтверждает Блок s-function, который вы создали.

    • Блок Sine Wave производит выходные значения из [-2: 2].

    • Входной диапазон интерполяционной таблицы от [-1: 1].

    • Выход от интерполяционной таблицы является абсолютным значением входа.

    • Интерполяционная таблица вывела, отсекает выход во входных пределах.

  2. Симулируйте модель.

  3. Просмотрите результаты валидации путем открытия Validation подсистема и, в той подсистеме, кликая по блоку Scope.

    Следующий рисунок показывает результаты валидации. Внешний код С и блок Интерполяционной таблицы Simulink обеспечивают те же выходные значения.

  4. Закройте модель валидации.

Подтвердите код С как часть модели

После того, как вы подтверждаете функциональность внешнего кода функции C как автономный компонент, подтверждаете S-функцию в модели. Используйте модель тестовой обвязки, чтобы завершить валидацию.

Примечание

Следующая процедура требует лицензии Stateflow®.

  1. Открытый rtwdemo_throttlecntrl_extfunccall и сохраните копию в throttlecntrl_extfunccall в перезаписываемой папке на вашем пути MATLAB.

  2. Исследуйте PI_ctrl_1 и PI_ctrl_2 подсистемы.

    1. Блоки Lookup были заменены блоком, вы создали использование Legacy Code Tool.

    2. Исследуйте настройки параметров блоков на SimpTableWrap и SimpTableWrap1.

    3. Закройте диалоговые окна Block Parameter и окна подсистемы PI.

  3. Откройте модель тестовой обвязки, щелкните правой кнопкой по Unit_Under_Test Блок Model, и выбирает Block Parameters (ModelReference).

  4. Установите Model name на throttlecntrl_extfunccall. Нажмите OK.

  5. Обновите диаграмму модели тестовой обвязки.

  6. Симулируйте тестовую обвязку.

    Результаты симуляции совпадают с ожидаемыми золотыми значениями.

  7. Сохраните и закройте throttlecntrl_extfunccall и throttlecntrl_testharness.

Вызовите функцию C от сгенерированного кода

Генератор кода использует файл TLC, чтобы обработать блок S-Function. Вызовы кода С встроили в блок S-Function:

  • Может использовать объекты данных.

  • Подвергаются expression folding, операция, которая комбинирует множественные вычисления в одно выходное вычисление.

  1. Открытый throttlecntrl_extfunccall.

  2. Сгенерируйте код для модели.

  3. Исследуйте сгенерированный код в filethrottlecntrl_extfunccall.c.

  4. Закройте throttlecntrl_extfunccall и throttlecntrl_testharness.

Ключевые пункты

  • Можно легко интегрировать внешние функции в типовой кодекс и сгенерированный код при помощи Legacy Code Tool.

  • Подтвердите функциональность внешнего кода функции C, который вы интегрируете в модель как автономный компонент.

  • После того, как вы подтверждаете функциональность внешнего кода функции C как автономный компонент, подтверждаете S-функцию в модели.

Похожие темы