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

  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. Исследуйте сгенерированный код в файле throttlecntrl_extfunccall.c.

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

Ключевые точки

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

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

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

Похожие темы