Гибкий класс памяти для различных контекстов иерархии модели

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

Этот пример использует топ-модель одно экземпляра ex_mdlreftop_dd, который ссылается на модель ex_mdlrefbot_dd мультиэкземпляра три раза. Обе модели совместно используют словарь данных ex_mdlref_dd.sldd. Когда вы задаете класс памяти в словаре разделяемых данных, можно применить класс к элементам данных в обеих моделях.

  1. Откройте модель ex_mdlreftop_dd в качестве примера.

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    ex_mdlreftop_dd
  2. Откройте словарь разделяемых данных. На вкладке Modeling нажмите Design> Data Dictionary.

  3. Откройте разделяемый Словарь Embedded Coder. В панели Model Hierarchy Model Explorer расширьте ex_mdlref_dd узел и нажимает Embedded Coder Dictionary. На правой панели нажмите Open Embedded Coder Dictionary.

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

  5. Для нового класса памяти MultiInstance_copy, в панели Property Inspector, набор Name к MyStorageClass. От встроенной версии, которую вы скопировали, класс памяти уже имеет эти значения свойств:

    • Use different property settings for single-instance and multi-instance data выбран.

    • Single-instance storage> Storage Type установлен в Unstructured.

    • Multi-instance storage> Storage Type установлен в Structured.

    Когда вы применяете MyStorageClass к элементу данных Словарь Embedded Coder реализует настройки одно экземпляра или настройки мультиэкземпляра в зависимости от типа данных и контекста модели в иерархии модели - ссылки. Рассмотрите реализации для различных настроек в предварительном просмотре псевдокода.

  6. Примените класс памяти к внутренним элементам данных путем определения его как значения по умолчанию словаря. В Словаре Embedded Coder нажмите Configure Defaults. Для строки Signals, states, and internal data, набор Storage Class к MyStorageClass. Нажмите OK.

    Поскольку ex_mdlreftop_dd и ex_mdlrefbot_dd совместно используйте словарь ex_mdlref_dd.sldd, обе модели используют MyStorageClass как класс памяти по умолчанию для внутренних данных.

  7. Откройте приложение Embedded Coder для модели ex_mdlreftop_dd.

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

  9. Рассмотрите сгенерированный код для модели, на которую ссылаются. Чтобы открыть модель, на которую ссылаются, в редакторе, дважды кликните блок Model, CounterA. Код образца модели появляется в Представлении кода. В ex_mdlrefbot_dd.h, код образца модели задает структуру класса памяти, в которой он хранит внутренние данные модели, на которую ссылаются.

    /* Storage class 'MyStorageClass', for model 'ex_mdlrefbot_dd' */
    typedef struct {
      real_T PreviousOutput_DSTATE;        /* '<Root>/Previous Output' */
    } ex_mdlrefbot_dd_MyStorageClass;
    
    /* Real-time Model Data Structure */
    struct ex_mdlrefbot_dd_tag_RTM {
      const char_T **errorStatus;
      ex_mdlrefbot_dd_MyStorageClass *MyStorageClass_ex_mdlrefbot_dd;
    };

    Поскольку модель, на которую ссылаются, является мультиэкземпляром, определение реализует настройки данных мультиэкземпляра MyStorageClass. Код образца модели хранит внутренние данные в структуре ex_mdlrefbot_dd_MyStorageClass.

  10. Перейдите назад топ-модели и рассмотрите сгенерированный код. В ex_mdlreftop_dd.c, код топ-модели задает свои внутренние данные для каждого блока Model путем инстанцирования класса памяти модели, на которую ссылаются, ex_mdlrefbot_dd_MyStorageClass.

    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterA_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterB_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterC_InstanceData;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterA;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterB;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterC;

    Поскольку топ-модель является одно экземпляром, эти определения реализуют настройки данных одно экземпляра MyStorageClass. Топ-модель также группирует его собственные внутренние данные как автономные переменные при помощи настроек данных одно экземпляра. Код топ-модели не содержит определение структуры для внутренних данных.

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте