В этом примере показано, как использовать один класс памяти во всей иерархии модели для генерации кода, который неструктурирован для данных с одним экземпляром и структурирован для данных с мультиобразцами. Когда иерархия модели содержит данные с одним экземпляром и мультиобразцом, используйте гибкий класс памяти, чтобы задать настройки для этих двух контекстов вместо создания двух отдельных классов памяти.
Этот пример использует одну модель верхней части экземпляра ex_mdlreftop_dd
, который ссылается на модель с мультиобразцами ex_mdlrefbot_dd
три раза. Обе модели совместно используют словарь данных ex_mdlref_dd.sldd
. Когда вы задаете класс памяти в словаре разделяемых данных, можно применить класс к элементам данных в обеих моделях.
Откройте пример модели ex_mdlreftop_dd
.
addpath(fullfile(docroot,'toolbox','ecoder','examples')) ex_mdlreftop_dd
Откройте разделяемые данные. На вкладке Modeling щелкните Design > Data Dictionary.
Откройте общий словарь Embedded Coder. На панели Model Hierarchy Model Explorer разверните ex_mdlref_dd
Узел и нажатие кнопки Embedded Coder Dictionary. На правой панели нажмите кнопку Open Embedded Coder Dictionary.
Чтобы создать класс памяти, нажмите Add.
Для нового класса памяти на панели 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 реализует настройки одного экземпляра или настройки мультиобразцов в зависимости от типа данных и контекста модели в иерархии моделей-ссылок. Проверьте реализации для различных настроек в предпросмотре псевдокода.
Примените класс памяти к внутренним элементам данных путем определения его как словаря по умолчанию. В словаре Embedded Coder Dictionary нажмите Configure Defaults. Для строки Signals, states, and internal data установите Storage Class равным MyStorageClass
. Нажмите OK.
Потому что ex_mdlreftop_dd
и ex_mdlrefbot_dd
совместное использование словаря ex_mdlref_dd.sldd
обе модели используют MyStorageClass
как класс памяти по умолчанию для внутренних данных.
Откройте приложение Embedded Coder для модели ex_mdlreftop_dd
.
Сгенерируйте код для модели.
Проверьте сгенерированный код для ссылочной модели. Чтобы открыть ссылку на модель в редакторе, дважды кликните блок 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
.
Вернитесь к верхней модели и проверьте сгенерированный код. В 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
. Верхняя часть также упаковывает свои собственные внутренние данные как автономные переменные с помощью настроек данных одного экземпляра. Код верхней модели не содержит определения структуры для внутренних данных.