Хранилище данных содержит данные, доступные в иерархии модели на уровне или ниже уровня, на котором определено хранилище данных. Хранилища данных позволяют подсистемам и ссылочным моделям совместно использовать данные без использования портов ввода-вывода для передачи данных с уровня на уровень. Сведения о хранилищах данных в Simulink ® см. в разделе Хранилища данных с блоками памяти хранилища данных. В этом разделе представлена дополнительная информация о создании кода хранилища данных.
Чтобы управлять кодом, созданным для блока памяти хранилища данных, примените класс хранения к хранилищу данных. Можно связать блок памяти хранилища данных с сигнальным объектом, который хранится в рабочей области или словаре данных, и управлять генерацией кода для блока, применив класс хранения к объекту:
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В редакторе данных модели выберите вкладку Хранилища данных (Data Stores).
Начните редактирование имени целевого блока памяти хранилища данных, щелкнув соответствующую строку в столбце «Имя».
Рядом с именем нажмите кнопку
и выберите Создать и разрешить.
В диалоговом окне «Создание новых данных» задайте для параметра «Значение» значение Simulink.Signal. При необходимости используйте выпадающий список Расположение (Location), чтобы выбрать рабочую область для хранения результирующего Simulink.Signal объект.
Щелкните Создать (Create). Simulink.Signal объект, имя которого совпадает с именем хранилища данных, появляется в целевой рабочей области. Simulink выбирает параметр блока Имя хранилища данных должно разрешаться в объект сигнала Simulink.
После открытия диалогового окна свойств объекта нажмите «ОК».
В приложении Simulink Coder или Embedded Coder откройте редактор Сопоставления кода. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов отдельных элементов.
На вкладке Хранилища данных примените целевой класс хранения.
Примечание
Когда блок памяти хранилища данных связан с сигнальным объектом, соответствие между именем хранилища данных и именем сигнального объекта должно быть один к одному. Если два или более идентично именованных объекта сопоставляются с одним и тем же сигнальным объектом, конфликт имен помечается как ошибка во время генерации кода. Дополнительные сведения см. в разделе Разрешение конфликтов в конфигурации сигнальных объектов для генерации кода.
Можно управлять сохранением и представлением блоков памяти хранилища данных в модели в сгенерированном коде путем назначения классов хранения и квалификаторов типов. Это выполняется почти точно так же, как при назначении классов хранения и квалификаторов типов для состояний блоков.
Блоки памяти хранилища данных, как и состояния блоков, имеют Auto класс хранения по умолчанию, и их память хранится в DWork вектор. Символическое имя склада основано на имени хранилища данных.
Можно создать код из нескольких блоков памяти хранилища данных, имеющих одно и то же имя хранилища данных, с учетом следующих ограничений: не более одного из идентично именованных блоков могут иметь класс хранения, отличный от Auto. Если это условие не выполнено, выдается сообщение об ошибке.
Для блоков с Auto класс хранения, генератор кода создает уникальное символьное имя для каждого блока, чтобы избежать конфликтов имен. Для блоков памяти хранилища данных с классами хранения, отличными от Autoсгенерированный код использует имя хранилища данных в качестве символа.
В следующей модели блок записи хранилища данных выполняет запись в память, объявленную блоком памяти хранилища данных myData:

Для управления объявлением хранилища для блока памяти хранилища данных в приложении кодера используйте редактор сопоставлений кода. На вкладке Хранилища данных выберите класс хранения для блока.
Блоки памяти хранилища данных не являются виртуальными, так как создается код для их инициализации в .c и .cpp файлы и их объявления в файлах заголовков. В следующей таблице показано, как код, сгенерированный для блока памяти хранилища данных в предыдущей модели, отличается для различных классов хранения. В таблице приведены объявления переменных и MdlOutputs код, сгенерированный для myData блок.
|
Класс хранения |
Декларация |
Кодекс |
|---|---|---|
|
|
В typedef struct
D_Work_tag
{
real_T myData;
}
D_Work;В /* Block states (auto storage) */ D_Work model_DWork; |
model_DWork.myData = rtb_SineWave; |
|
|
В /* Exported block states */ real_T myData; В extern real_T myData; |
myData = rtb_SineWave; |
|
|
В extern real_T myData; |
myData = rtb_SineWave; |
|
|
В extern real_T *myData; |
(*myData) = rtb_SineWave; |
Сведения о применении классов хранения см. в разделе Конфигурация генерации кода C для элементов интерфейса модели.
Для моделей ERT можно сохранить размеры многомерных массивов в хранилищах данных. Дополнительные сведения см. в разделе Сохранение размеров многомерных массивов в сгенерированном коде.
Блок чтения хранилища данных - это невиртуальный блок, который копирует значение хранилища данных в выходной буфер при его выполнении. Поскольку значение буферизуется, дочерние блоки, соединенные с выходом хранилища данных, считывают, используют одно и то же значение, даже если блок записи хранилища данных обновляет хранилище данных между выполнением двух дочерних блоков.
На следующем рисунке показана модель, которая использует блоки, приоритеты которых были изменены для достижения определенного порядка выполнения:


Применяется следующий порядок выполнения:
Блок «» Чтение хранилища данных «» буферизирует текущее значение хранилища данных A на его выходе.
Блок Abs1 использует буферизованные выходные данные чтения хранилища данных.
Блок записи хранилища данных обновляет хранилище данных.
Блок Abs использует буферизованные выходные данные чтения хранилища данных.
Поскольку вывод Data Store Read является буфером, и Abs, и Abs1 используют одно и то же значение: значение хранилища данных во время выполнения Data Store Read.
На следующем рисунке показан другой пример:


В этом примере применяется следующий порядок выполнения:
Блок «» Чтение хранилища данных «» буферизирует текущее значение хранилища данных A на его выходе.
Атомная подсистема выполняется.
Блок Sum добавляет выходные данные Atomic Subsystem к выходным данным Data Store Read.
Simulink предполагает, что Atomic Subsystem может обновить хранилище данных, поэтому Simulink буферизирует хранилище данных. Atomic Subsystem выполняется после того, как Data Store Read буферизирует свои выходные данные, и буфер обеспечивает способ использования блоком Sum значения хранилища данных, как это было при выполнении Data Store Read.
В некоторых случаях генератор кода определяет, что он может оптимизировать выходной буфер для блока чтения хранилища данных, и сгенерированный код ссылается непосредственно на хранилище данных, а не на его буферизированное значение. На следующем рисунке показан пример:


В созданном коде аргумент fabs() функция - хранилище данных A вместо буферизированного значения.
Хранилище данных можно использовать для совместного использования части данных между экземплярами повторно используемой ссылочной модели (см. раздел Совместное использование данных среди ссылочных экземпляров модели) или моделью, настроенной для создания кода для повторного ввода (путем установки для параметра конфигурации Code interface packaging значения Reusable function). Если хранилище данных реализовано как блок памяти хранилища данных и выбран параметр Общий доступ для экземпляров модели:
По умолчанию хранилище данных отображается в сгенерированном коде как отдельный глобальный символ.
Если у вас есть Embedded Coder ®, чтобы ограничить доступ таким образом, чтобы только код, созданный из модели, мог использовать хранилище данных, настройте хранилище данных так, чтобы оно отображалось какstatic применяя класс хранения FileScope. Для получения дополнительной информации о FileScope и другие классы хранения см. в разделе Выбор класса хранения для представления управляющих данных в сгенерированном коде.
При использовании нескольких хранилищ данных для обеспечения глобального доступа к нескольким сигналам в сгенерированном коде можно объединить сигналы в одну структурную переменную с помощью одного хранилища данных. Эта комбинация сигнальных данных может помочь интегрировать код, сгенерированный из модели, с другим существующим кодом, требующим данных в структурном формате.
В этом примере показано, как сохранить несколько сигналов модели в структуре в сгенерированном коде с использованием одного хранилища данных. Для хранения нескольких сигналов в хранилище данных необходимо настроить хранилище данных на прием составного сигнала, такого как сигнал невиртуальной шины или массив сигналов невиртуальной шины.
Откройте пример ex_bus_struct_in_code модели.
Модель содержит три подсистемы, которые выполняют вычисления на входах с верхнего уровня модели. В каждой подсистеме блок памяти хранилища данных хранит промежуточный вычисленный сигнал.
Создайте код с моделью. В отчете о создании кода просмотрите файл ex_bus_struct_in_code.c. Код определяет глобальную переменную для каждого хранилища данных.
real_T BioBTURate; real_T CoalBTURate; real_T GasBTURate;
Предположим, что требуется интегрировать код, созданный из модели примера, с другим существующим кодом. Предположим также, что существующий код требует доступа к данным из трех хранилищ данных в одной структурной переменной. Хранилище данных можно использовать для сборки целевых данных в структуре в сгенерированном коде.
Настройте хранилище данных так, чтобы оно содержало несколько сигналов, создав тип шины для использования в качестве типа данных хранилища данных. Определите тип шины с использованием той же иерархии элементов, что и структура, которая должна отображаться в сгенерированном коде.
Откройте инструмент «Редактор шины».
buseditor
Определение нового типа шины Raw_BTU_Rate с одним элементом для каждого из трех целевых сигналов. Назовите элементы BioBTU, GasBTU, и CoalBTU.

На верхнем уровне примерной модели добавьте блок памяти хранилища данных.
На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).
В редакторе данных модели проверьте вкладку Хранилища данных (Data Stores).
Для нового блока памяти хранилища данных используйте столбец «Имя», чтобы задать для имени хранилища данных значение Raw_BTU_Data.
Используйте столбец «Тип данных», чтобы задать тип данных хранилища данных равным Bus: Raw_BTU_Rate.
В редакторе Сопоставления кодов на вкладке Хранилища данных примените класс хранения ExportedGlobal кому Raw_BTU_Data.
Для записи в определенный элемент хранилища данных используйте блок записи хранилища данных. На вкладке Назначение элемента (Element Assignment) диалогового окна можно указать запись в один элемент, коллекцию элементов или все содержимое хранилища данных.
Откройте подсистему расчета биомассы.
Удаление блока памяти хранилища данных BioBTURate.
В диалоговом окне блока «Запись в хранилище данных» задайте для параметра «Имя хранилища данных» значение Raw_BTU_Data.
На вкладке «Назначение элемента» в разделе «Сигналы на шине» разверните содержимое хранилища данных. Raw_BTU_Data. Щелкните элемент BioBTUи нажмите кнопку «» Выбрать «». Нажмите кнопку «» ОК «».

Аналогичным образом измените подсистемы газового и угольного расчетов.
Удалите блок памяти хранилища данных в каждой подсистеме.
В каждом диалоговом окне блока записи хранилища данных задайте для параметра «Имя хранилища данных» значение Raw_BTU_Data.
В подсистеме Gas Calc используйте блок записи хранилища данных для записи в элемент хранилища данных. GasBTU. В подсистеме Coal Calc выполните запись в элемент CoalBTU.
Создайте код для примерной модели.
В отчете о создании кода просмотрите файл ex_bus_struct_in_code_types.h. Код определяет структуру, соответствующую типу шины. Raw_BTU_Rate.
typedef struct {
real_T BioBTU;
real_T GasBTU;
real_T CoalBTU;
} Raw_BTU_Rate;
Просмотр файла ex_bus_struct_in_code.c. Код представляет хранилище данных с глобальной переменной Raw_BTU_Data типа структуры Raw_BTU_Rate. В функции шага модели код присваивает данные из вычисленных сигналов полям глобальной переменной. Raw_BTU_Data.