Сконфигурируйте интерфейсы функции точки входа для Simulink функциональные и функциональные блоки вызывающей стороны

С Embedded Coder® можно настроить сгенерированный C и интерфейсы функции C++ для блоков Function Caller и Simulink Function. Функциональная настройка интерфейса кода поддерживает более легкое интегрирование сгенерированного кода с функциями или вызовами функции во внешнем коде и индивидуальными настройками для кодирования стандартов или конструктивных требований.

Можно настроить сгенерированный C и интерфейсы функции C++ для:

  • Функции Global Simulink®

  • Экспортируемый определил объем функций Simulink

Вы не можете настроить сгенерированный функциональный интерфейс для ограниченного по объему блока Simulink Function, который не расположен на корневом уровне модели. Для получения дополнительной информации смотрите Ограниченный по объему и Глобальная переменная Обзор Функциональных блоков Simulink.

Путем открытия диалогового окна от выбранного блока Simulink Function или Function Caller можно настроить прототипа функции, сгенерированного для того блока. Ваши изменения для выбранного блока также обновляют другой соответствующий Simulink Function и блоки Function Caller в модели. Функциональная видимость, глобальная переменная или ограниченный по объему, установленный в функциональном блоке Trigger Port определяют, какие функциональные атрибуты можно изменить:

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

  • Для экспортируемой ограниченной по объему функции можно изменить спецификаторы типа аргумента и порядок аргументов. Вы не можете изменить функцию и имена аргумента.

Ваши изменения графически не изменяют модель и не влияют на прототипа функции Simulink, заданного в блоке.

Embedded Coder поддерживает настройку интерфейса функции Simulink кода для моделей, сконфигурированных с основанными на ERT системными конечными файлами, за исключением системных конечных файлов AUTOSAR.

Сконфигурируйте сгенерированный интерфейс функции C для глобальной переменной функциональный блок Simulink

В этом примере показано, как настроить интерфейс функции C, который генератор кода производит для глобального блока Simulink Function.

  1. Открытая модель rtwdemo_functions в качестве примера. Сохраните копию модели к перезаписываемому местоположению.

  2. В галерее Apps откройте приложение Embedded Coder.

  3. На вкладке C Code выберите Code Interface> Individual Element Code Mappings.

  4. В редакторе Отображений Кода кликните по вкладке Functions.

  5. В строке для Simulink Function:f3, кликните по функциональной гиперссылке предварительного просмотра. Диалоговое окно Function Interface C/C++ показывает Simulink function prototype y = f3(u) и C/C++ function prototype как void f3(rtu_u, * rty_y). Предварительный просмотр для C/C++ function prototype обновляется, когда вы вносите изменения.

  6. Сконфигурируйте имя функции и аргументы.

    • Измените функцию и имена идентификатора аргумента. Параметр конфигурации модели Subsystem method arguments задает правило именования значения по умолчанию для аргументов Simulink Function. Изменения, которые вы вносите в диалоговом окне Function Interface C/C++, заменяют правило именования значения по умолчанию.

      В поле C/C++ function name, и в столбце C/C++ Identifier Name для каждого аргумента функции Simulink, вводят пользовательское имя или называющий правило. Задайте допустимые символы C-идентификатора, макросы формата идентификатора или комбинацию символов и макросов. В данном примере назовите функциональный function3 и для аргументов войдите, именование управляют $N$M.

      Чтобы видеть советы о доступных макросах, установите свой курсор на C/C++ function name и C/C++ Identifier Name. Для получения дополнительной информации о правилах именования идентификатора, смотрите Управление форматом Идентификатора.

    • Для аргумента u, установите C/C++ Type Qualifier на Pointer to const.

    • Переупорядочьте аргументы. Перетащите y строка аргумента выше u строка аргумента.

  7. Проверьте свои изменения путем проверки предварительного просмотра прототипа функции.

  8. Нажмите Apply. Ваши модификации, сделанный ли с блоком Simulink Function или блоком Function Caller, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.

    Опционально, можно изменить C/C++ return argument от void к y. В этом случае прототипом функции C является y = function3(const * u).

  9. Сохраните свои изменения путем нажатия на OK.

  10. Сохраните модель.

  11. Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.

  12. В представлении Code откройте сгенерированный файл rtwdemo_functions.c и ищите function3. Сгенерированный функциональный код отражает изменения в сгенерированном прототипе функции C.

    void function3(real_T *y, const real_T *u)
    {
      rtY.TicToc10 = rtDWork.Delay_DSTATE;
    
      rtDWork.Delay_DSTATE = (int8_T)(int32_T)-(int32_T)rtY.TicToc10;
    
      adder(rtB.Subtract, rtU.U2, *u, &rtB.FunctionCaller);
      
      *y = rtB.FunctionCaller;
    }

Сконфигурируйте сгенерированный интерфейс функции C для экспортируемого ограниченного по объему функционального блока Simulink

В этом примере показано, как настроить интерфейс функции C, который генератор кода производит для экспортируемого, ограниченного по объему блока Simulink Function.

Для экспортируемой, ограниченной по объему функции можно изменить сгенерированный возвращаемый аргумент, спецификаторы типа аргумента и порядок аргументов. Вы не можете поменять сгенерированное имя функции и имена аргумента.

  1. Откройте модель rtwdemo_functions. Сохраните его в перезаписываемое местоположение.

  2. Измените видимость глобального функционального f3 от глобальной переменной до ограниченного по объему. Откройте блок Simulink Function f3. В функциональном блоке дважды кликните блок Trigger Port f3. В диалоговом окне параметров блоков, набор Function visibility к scoped. Нажмите Apply и OK.

  3. В галерее Apps откройте приложение Embedded Coder.

  4. Во вкладке C Code кликните по вкладке Code Mappings - C.

  5. В редакторе Отображений Кода кликните по вкладке Functions.

  6. В строке для функции f3, кликните по функциональной гиперссылке предварительного просмотра. Диалоговое окно Function Interface C/C++ показывает Simulink function prototype y = f3(u) и C/C++ function prototype как y = rtwdemo_functions_f3(rtu_u). Предварительный просмотр для C/C++ function prototype обновляется, когда вы вносите изменения.

    Для моделей, что вы конфигурируете для C multi-instantiable код, интерфейсный предварительный просмотр для ограниченных по объему функций Simulink включает self аргумент. self аргумент является указателем на версию модели реального времени (RT_MODEL) структура данных, которая хранит данные мультиэкземпляра, сопоставленные с допускающими повторное использование функциями.

    Если параметр конфигурации модели Code interface packaging установлен в Reusable function и Total number of instances allowed per top model установлен в Multiple, аргумент появляется как self, указание, что генератор кода производит сам структура.

    Если параметр конфигурации модели Code interface packaging установлен в Reusable function или Total number of instances allowed per top model установлен в Multiple, аргумент появляется как [self], указание, что аргумент является дополнительным. Генератор кода производит self структура, только если вы используете модель в качестве топ-модели и Code interface packaging, установлена в Reusable function или если вы используете модель в качестве модели, на которую ссылаются, и Total number of instances allowed per top model установлен в Multiple.

    Для получения дополнительной информации о конфигурировании модели для multi-instantiable генерации кода, смотрите, Генерируют Повторно используемый Код от Функциональных блоков Simulink.

  7. Сконфигурируйте аргументы. В данном примере сконфигурируйте u аргумент. Установите C/C++ type Qualifier на Pointer to const.

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

  9. Нажмите Apply. Ваши модификации, сделанный ли с блоком Simulink Function или блоком Function Caller, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.

    Опционально, можно изменить C/C++ return argument от y к void. В этом случае прототипом функции C является void = rtwdemo_functions_f3(* rty_y, const * rtu_u).

  10. Сохраните свое изменение путем нажатия на OK.

  11. Сохраните модель.

  12. Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.

  13. В представлении Code откройте сгенерированный файл rtwdemo_functions.c и ищите rtwdemo_functions_f3. Сгенерированный функциональный код отражает изменения в сгенерированном прототипе функции C.

    real_T rtwdemo_functions_f3(const real_T *rtu_u)
    {
      real_T rty_y_0;
    
      rtY.TicToc10 = rtDWork.Delay_DSTATE;
    
      rtDWork.Delay_DSTATE = (int8_T)(int32_T)-(int32_T)rtY.TicToc10;
    
      adder(rtB.Subtract, rtU.U2, *rtu_u, &rtB.FunctionCaller);
      
      rty_y_0 = rtB.FunctionCaller;
    
      return rty_y_0;
    }

Сконфигурируйте сгенерированный интерфейс функции C++ для экспортируемого ограниченного по объему функционального блока Simulink

В этом примере показано, как настроить интерфейс функции C++, который генератор кода производит для экспортируемого ограниченного по объему блока Simulink Function.

Для экспортируемой ограниченной по объему функции можно изменить сгенерированный возвращаемый аргумент, спецификаторы типа аргумента и порядок аргументов. Вы не можете поменять сгенерированное имя функции и имена аргумента.

  1. Откройте модель rtwdemo_functions. Сохраните его в перезаписываемую рабочую область.

  2. Измените видимость глобального функционального f3 от глобальной переменной до ограниченного по объему. Откройте блок Simulink Function f3. В функциональном блоке дважды кликните блок Trigger Port f3. В диалоговом окне параметров блоков, набор Function visibility к scoped. Нажмите Apply и OK.

  3. В галерее Apps откройте приложение Embedded Coder.

  4. Установите параметр конфигурации модели Language на C++.

  5. Откройте Сконфигурировать диалоговое окно Function Interface C/C++. Щелкните правой кнопкой по блоку Simulink Function f3. В контекстном меню выберите C/C++ Code> Configure C/C++ Function Interface. Диалоговое окно показывает Simulink function prototype y = f3(u) и C/C++ function prototype как y = rtwdemo_functions_f3(rtu_u). Предварительный просмотр для C/C++ function prototype обновляется, когда вы вносите изменения.

  6. Сконфигурируйте аргументы. В данном примере сконфигурируйте u аргумент. Установите C/C++ type Qualifier на Pointer to const.

  7. Нажмите Apply. Ваши модификации, сделанный ли с блоком Simulink Function или блоком Function Caller, влияют на генерацию кода для блока Simulink Function и соответствующих блоков Function Caller в модели.

    Опционально, можно изменить C/C++ return argument от y к void. В этом случае прототипом функции C++ является void = rtwdemo_functions_f3(* rty_y, const * rtu_u).

  8. Сохраните свое изменение путем нажатия на OK.

  9. Сохраните модель.

  10. Убедитесь, что блок Simulink Function не выбран. Затем сгенерируйте код для модели.

  11. В представлении Code откройте сгенерированный файл rtwdemo_functions.cpp и ищите функциональный f3. Сгенерированный функциональный код отражает изменения в сгенерированном прототипе функции C++.

    real_T rtwdemo_functionsModelClass::f3(const real_T *rtu_u)
    {
      real_T rty_y_0;
    
      rtY.TicToc10 = rtDWork.Delay_DSTATE;
    
      rtDWork.Delay_DSTATE = static_cast<int8_T>(static_cast<int32_T>
        (-static_cast<int32_T>(rtY.TicToc10)));
    
      adder(rtB.Subtract, rtU.U2, *rtu_u, &rtB.FunctionCaller);
      
      rty_y_0 = rtB.FunctionCaller;
    
      return rty_y_0;
    }

Ограничения интерфейса функции Simulink кода

  • Для генерации Кода С++ глобальные функции Simulink несовместимы с интерфейсами класса C++ для функций точки входа модели.

  • Настройка интерфейса функции Simulink кода не поддерживает функции Simulink и функционирует вызывающие стороны в Stateflow®.