exponenta event banner

Доступ к данным через функции с помощью классов хранения в словаре встроенного кодера

Чтобы заменить прямой доступ к данным в созданном коде собственными или устаревшими функциями, считывающими и записывающими данные пользовательским способом, можно включить доступ к функциям классов хранения. Эти классы хранения данных создаются в словаре Embedded Coder ®. Входы на корневом уровне, исходы на корневом уровне и параметры модели, использующие класс хранения, отображаются в созданном коде как вызовы указанных функций. Объявления и определения функций предоставляются в отдельных заголовках и исходных файлах, на которые указывает класс хранения.

Доступ к устаревшим данным по значению

Можно определить и применить класс хранения к входам корневого уровня, портам корневого уровня и параметрам модели, чтобы к ним можно было обращаться с помощью настраиваемых get и set функции. Такая настройка может быть полезна, например, для абстрактных уровней программного обеспечения, получения доступа к данным из внешнего файла или для управления доступом к критическим разделам кода.

В этом примере показано, как настроить класс хранения в словаре Embedded Coder Dictionary и сопоставить класс хранения с входами/выходами корневого уровня и параметрами модели в редакторе сопоставления кодов.

  1. Открыть пример модели rtwdemo_roll. В окне команды MATLAB выполните следующую команду:

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    Выполнение предыдущей команды дает эти вспомогательные файлы, необходимые для примера, который определяет get и set функции:

    Сохраните эти файлы в локальном пути.

  2. В коллекции «Приложения» в разделе «Создание кода» щелкните Встроенный кодер.

  3. Чтобы открыть Embedded Coder Dictionary, на вкладке C Code выберите Code Interface > Embedded Coder Dictionary.

  4. rtwdemo_roll модель имеет два класса хранения: SignalStruct и ParamStruct. Они уже созданы с помощью кнопки «Добавить». В этом примере используются эти классы хранения. Для создаваемого класса хранения можно выполнить следующие шаги.

  5. Для SignalStruct на панели «Инспектор свойств» обновите следующие значения свойств:

    • Доступ к данным Function

    • Файл заголовка для $R_Value.h

    Убедитесь, что для параметра Access Mode установлено значение Value. Для области данных установлено значение Imported по умолчанию и не может быть изменен.

    Для ParamStruct на панели «Инспектор свойств» обновите следующие значения свойств:

    • Доступ к данным Function

    • Файл заголовка для $R_Value.h

    Эти свойства уже заданы:

    • Режим доступа к Value

    • Инициализация данных в Static

    Классы хранения, используемые для параметров, могут иметь значение инициализации данных Auto,Static, или None.

  6. Откройте диалоговое окно «Параметры конфигурации». На панели инструментов на вкладке «Код C» нажмите кнопку «Параметры». Выберите «Создание кода» > «Пользовательский код» > «Дополнительные сведения о построении» > «Исходные файлы» и укажите:

    rtwdemo_roll_Value.c

  7. В приложении Embedded Coder откройте редактор Сопоставления кода. На вкладке «Значения по умолчанию» сопоставьте следующие категории элементов модели:

    • Ввод в SignalStruct

    • Отгрузка в SignalStruct

    • Параметры модели для ParamStruct

  8. Создайте модель и создайте код.

В созданном коде просмотрите файл rtwdemo_roll.c. Модель step функция использует указанное get и set функции для выполнения алгоритма. Созданный код получает доступ к устаревшим данным путем вызова пользовательского, рукописного get и set функции. Например, вот фрагмент кода для HDG_Ref inport:

if (get_HDG_Mode()) {
    /* Outputs for Atomic SubSystem: '<Root>/HeadingMode' */
    rtb_Sum1 = (get_HDG_Ref() - get_Psi()) * 0.015F * get_TAS();

    /* End of Outputs for SubSystem: '<Root>/HeadingMode' */
  } else {
    /* Outputs for Atomic SubSystem: '<Root>/RollAngleReference' */
    if ((real32_T)fabs(get_Turn_Knob()) >= 3.0F) {
      rtb_Sum1 = get_Turn_Knob();
    }
Можно создать код, вызывающий пользовательский код get и set функции, если написанные функции принимают и возвращают ожидаемые значения.

Доступ к устаревшим данным по указателю

Чтобы получить доступ к данным с помощью указателя, выполните все предыдущие действия, но внесите следующие изменения:

  • В словаре встроенного кодера для классов хранения SignalStruct и ParamStruct, укажите:

    • Режим доступа к Pointer

    • Файл заголовка для $R_Pointer.h

  • Выберите Параметры конфигурации > Создание кода > Пользовательский код > Дополнительные сведения о построении > Исходные файлы и замените rtwdemo_roll_Value.c с:

    rtwdemo_roll_Pointer.c

С доступом указателя, get функция теперь возвращает указатель, значение которого должно быть обособлено с помощью * перед использованием. Например, созданный код для HDG_Ref inport теперь выглядит следующим образом:

if (*get_HDG_Mode()) {
    /* Outputs for Atomic SubSystem: '<Root>/HeadingMode' */
    rtb_Sum1 = (*get_HDG_Ref() - *get_Psi()) * 0.015F * *get_TAS();

    /* End of Outputs for SubSystem: '<Root>/HeadingMode' */
  } else {
    /* Outputs for Atomic SubSystem: '<Root>/RollAngleReference' */
    if ((real32_T)fabs(tmp_1) >= 3.0F) {
      rtb_Sum1 = tmp_1;
    }

Создание собственного класса хранения в Embedded Coder Dictionary обеспечивает гибкость настройки имен функций и типов возврата. Можно также использовать класс хранения GetSet для доступа к данным через get и set функции. Дополнительные сведения см. в разделе Доступ к данным через функции с помощью класса хранения GetSet.

См. также

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