exponenta event banner

Вызов внешних функций 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

Чтобы задать вызов внешней функции 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 определяет интерфейс функции для внешнего кода C.

      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-функциональный блок:

      legacy_code('slblock_generate', def)

      Откроется новое окно модели, содержащее SimpTableWrap блок.

      Совет

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

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

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

    legacy_code('sfcn_tlc_generate', def)

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

Дополнительные сведения об использовании прежнего инструмента кода см. в разделе:

Проверка внешнего кода в среде Simulink

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

  1. Открытие модели rtwdemo_ValidateLegacyCodeVrsSim. Эта модель проверяет созданный блок S-функций.

    • Блок синусоидальной волны выдает выходные значения из [-2: 2].

    • Диапазон входных значений таблицы подстановки - от [-1: 1].

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

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

  2. Моделирование модели.

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

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

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

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

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

Примечание

Для выполнения следующей процедуры требуется лицензия Stateflow ®.

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

  2. Осмотрите PI_ctrl_1 и PI_ctrl_2 подсистем.

    1. Блоки подстановки были заменены блоком, созданным с помощью инструмента «Устаревший код».

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

    3. Закройте диалоговые окна «Параметр блока» и окна подсистемы PI.

  3. Откройте модель тестового электрического жгута, щелкните правой кнопкой мыши значок Unit_Under_Test Блок модели и выберите Параметры блока (Model Reference).

  4. Задать для имени модели значение throttlecntrl_extfunccall. Нажмите кнопку ОК.

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

  6. Смоделировать тестовый жгут.

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

  7. Сохранить и закрыть throttlecntrl_extfunccall и throttlecntrl_testharness.

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

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

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

  • Являются объектом сворачивания выражения, операции, которая объединяет несколько вычислений в один выходной расчет.

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

  2. Создайте код для модели.

  3. Проверьте созданный код в файлеthrottlecntrl_extfunccall.c.

  4. Закрыть throttlecntrl_extfunccall и throttlecntrl_testharness.

Ключевые моменты

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

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

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

Связанные темы