Хранилище данных содержит данные, которые доступны в иерархии модели в или ниже уровня, на котором задано хранилище данных. Хранилища данных могут позволить подсистемам и моделям, на которые ссылаются, осуществлять обмен данными, не имея необходимость использовать порты I/O, чтобы передать данные от уровня до уровня. Смотрите Хранилища данных с Блоками памяти Хранилища данных (Simulink) для получения информации о хранилищах данных в Simulink®. Этот раздел предоставляет дополнительную информацию о генерации кода хранилища данных.
Чтобы управлять кодом, сгенерированным для Блока памяти Хранилища данных, примените класс памяти к хранилищу данных. Можно сопоставить Блок памяти Хранилища данных с объектом сигнала, который вы храните в рабочей области или словаре данных и генерации кода системы управления для блока путем применения класса памяти к объекту:
В модели выберите View> Model Data Editor.
В Model Data Editor выберите вкладку Data Stores.
Начните редактировать имя целевого Блока памяти Хранилища данных путем нажатия на соответствующую строку в столбце Name.
Рядом с именем нажмите кнопку и выберите Create and Resolve.
В диалоговом окне Create New Data, набор Value к Simulink.Signal
. Опционально, используйте Location выпадающий список, чтобы выбрать рабочую область для того, чтобы хранить получившийся объект Simulink.Signal
.
Нажмите Create. Объект Simulink.Signal
, который имеет то же имя как хранилище данных, появляется в целевой рабочей области. Simulink выбирает параметры блоков Data store name must resolve to Simulink signal object.
Диалоговое окно свойства для объекта открывается.
Используйте Storage class выпадающий список, чтобы применить класс целевой системы хранения.
Когда Блок памяти Хранилища данных сопоставлен с объектом сигнала, отображение между Data store name и именем объекта сигнала должно быть непосредственным. Если две или больше тождественно именованных сущности сопоставляют с тем же объектом сигнала, конфликт по совпадению имен отмечается как ошибка во время генерации кода. Смотрите Конфликты Твердости в Настройке Объектов Сигнала для Генерации кода (Simulink) для получения дополнительной информации.
Можно управлять, как Блоки памяти Хранилища данных в модели хранятся и представленный в сгенерированном коде путем присвоения классов памяти и вводят спецификаторы. Вы выполняете в этом почти точно тот же способ, которым вы присваиваете классы памяти и вводите спецификаторы для состояний блока.
Блоки памяти Хранилища данных, как состояния блока, имеют класс памяти Auto
по умолчанию, и их память хранится в векторе DWork
. Символьное имя места хранения основано на имени хранилища данных.
Можно сгенерировать код от нескольких Блоков памяти Хранилища данных, которые имеют то же имя хранилища данных согласно следующему ограничению: самое большее один из тождественно именованных блоков может иметь класс памяти кроме Auto
. Об ошибке сообщают, если это условие не соблюдают.
Для блоков с классом памяти Auto
генератор кода производит уникальное символьное имя для каждого блока, чтобы избежать столкновений имени. Для Блоков памяти Хранилища данных с классами памяти кроме Auto
сгенерированный код использует имя хранилища данных в качестве символа.
В следующей модели блок Data Store Write пишет в память, объявленную по условию Блок памяти Хранилища myData
:
Чтобы управлять объявлением устройства хранения данных для Блока памяти Хранилища данных, используйте Code Generation> Signal object class и Code Generation> Storage class выпадающие списки диалогового окна Блока памяти Хранилища данных. Установите Signal object class на Simulink.Signal
(значение по умолчанию) и выберите класс памяти из Storage class выпадающий список. Следующие данные показывают диалоговое окно Блока памяти Хранилища данных для предыдущей модели.
Чтобы применить классы памяти к хранилищам данных, можно альтернативно использовать вкладку Data Stores в Model Data Editor (в модели, View> Model Data Editor).
Блоки памяти Хранилища данных являются невиртуальными, потому что код сгенерирован для их инициализации в .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; |
Для получения информации о применении классов памяти смотрите, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.
Блок Data Store Read является невиртуальным блоком, который копирует значение хранилища данных к его буферу вывода, когда это выполняется. Поскольку значение буферизуется, нисходящие блоки, соединенные с выводом чтения хранилища данных, используют то же значение, даже если блок Data Store Write обновляет хранилище данных промежуточное выполнение двух из нисходящих блоков.
Следующие данные показывают модель, что использование блокируется, чьи приоритеты были изменены, чтобы достигнуть особого порядка выполнения:
Следующий порядок выполнения применяется:
Блок Data Store Read буферизует текущее значение хранилища данных A
при его выводе.
Блок Abs1 использует буферизированный вывод Чтения Хранилища данных.
Блок Data Store Write обновляет хранилище данных.
Блок Abs использует буферизированный вывод Чтения Хранилища данных.
Поскольку вывод Чтения Хранилища данных является буфером, и Abs и Abs1 используют то же значение: значение хранилища данных в то время, когда Чтение Хранилища данных выполняется.
Следующие данные показывают другой пример:
В этом примере применяется следующий порядок выполнения:
Блок Data Store Read буферизует текущее значение хранилища данных A
при его выводе.
Атомарная подсистема выполняется.
Блок Sum добавляет вывод Атомарной подсистемы к выводу Чтения Хранилища данных.
Simulink принимает, что Атомарная подсистема может обновить хранилище данных, таким образом, Simulink буферизует хранилище данных. Атомарная подсистема выполняется после того, как Чтение Хранилища данных буферизует свой вывод, и буфер обеспечивает путь к блоку Sum, чтобы использовать значение хранилища данных, как это было когда выполняемое Чтение Хранилища данных.
В некоторых случаях генератор кода решает, что может оптимизировать далеко буфер вывода для блока Data Store Read, и сгенерированный код относится к хранилищу данных непосредственно, а не буферизированному значению его. Следующие данные показывают пример:
В сгенерированном коде аргумент функции fabs()
является хранилищем данных A
, а не буферизированное значение.
Можно использовать хранилище данных, чтобы совместно использовать часть данных между экземплярами допускающей повторное использование модели, на которую ссылаются (см., Осуществляют обмен данными Среди Образцовых Экземпляров, на которые Ссылаются (Simulink)), или модель, которую вы конфигурируете, чтобы сгенерировать повторно используемый код (путем установки параметра конфигурации Code interface packaging на Reusable function
). Если вы реализуете хранилище данных как Блок памяти Хранилища данных и выбираете параметр Share across model instances:
По умолчанию хранилище данных появляется в сгенерированном коде как отдельный глобальный символ.
Если у вас есть Embedded Coder®, чтобы ограничить получают доступ таким образом, что только код, сгенерированный из модели, может использовать хранилище данных, сконфигурируйте хранилище данных, чтобы появиться как static
путем применения пользовательского класса памяти FileScope
. Для получения дополнительной информации о FileScope
и других пользовательских классах памяти, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code (Embedded Coder).
Если вы используете больше чем одно хранилище данных, чтобы обеспечить глобальный доступ к нескольким сигналам в сгенерированном коде, можно объединить сигналы в одну переменную структуры при помощи одного хранилища данных. Эта комбинация данных сигнала может помочь вам интегрировать код, сгенерированный из модели с другим существующим кодом, который требует данных в формате структуры.
Этот пример показывает, как сохранить несколько образцовых сигналов в структуре в сгенерированном коде с помощью одного хранилища данных. Чтобы сохранить несколько сигналов в хранилище данных, вы конфигурируете хранилище данных, чтобы принять составной сигнал, такой как невиртуальный сигнал шины или массив невиртуальных сигналов шины.
Откройте модель в качестве примера ex_bus_struct_in_code.
Модель содержит три подсистемы, которые выполняют вычисления на входных параметрах от верхнего уровня модели. В каждой подсистеме Блок памяти Хранилища данных хранит промежуточное звено вычисленный сигнал.
Сгенерируйте код с моделью. В отчете генерации кода просмотрите файл ex_bus_struct_in_code.c
. Код задает глобальную переменную для каждого хранилища данных.
real_T BioBTURate; real_T CoalBTURate; real_T GasBTURate;
Предположим, что вы хотите интегрировать код, сгенерированный из модели в качестве примера с другим существующим кодом. Предположим также, что существующий код требует доступа к данным из этих трех хранилищ данных в одной переменной структуры. Можно использовать хранилище данных, чтобы собрать целевые данные в структуре в сгенерированном коде.
Сконфигурируйте хранилище данных, чтобы содержать несколько сигналов путем создания типа шины, чтобы использовать в качестве типа данных хранилища данных. Задайте тип шины с помощью той же иерархии элементов как структура, что вы хотите появиться в сгенерированном коде.
Откройте инструмент Bus Editor.
buseditor
Задайте новый тип шины Raw_BTU_Rate
с одним элементом для каждого из трех целевых сигналов. Назовите элементы BioBTU
, GasBTU
и CoalBTU
.
В верхнем уровне модели в качестве примера добавьте Блок памяти Хранилища данных.
В Редакторе Simulink выберите View> Model Data Editor.
В Model Data Editor осмотрите вкладку Data Stores.
Для нового Блока памяти Хранилища данных используйте столбец Name, чтобы установить имя хранилища данных на Raw_BTU_Data
.
Используйте столбец Data Type, чтобы установить тип данных хранилища данных к Bus: Raw_BTU_Rate
.
Установите Change view выпадающий список на Code
.
Используйте столбец Storage Class, чтобы применить класс памяти ExportedGlobal
.
Чтобы записать в определенный элемент хранилища данных, используйте блок Data Store Write. На вкладке Element Assignment в диалоговом окне можно задать, чтобы записать в один элемент, набор элементов или целое содержимое хранилища данных.
Откройте подсистему Biomass Calc.
Удалите Блок памяти Хранилища данных BioBTURate
.
В диалоговом окне блока для блока Data Store Write, набор Data store name к Raw_BTU_Data
.
На вкладке Element Assignment, под Signals in the bus, расширяют содержимое хранилища данных Raw_BTU_Data
. Кликните по элементу BioBTU
, и затем нажмите Select. Нажмите OK.
Измените Gas Calc и подсистемы Coal Calc так же.
Удалите Блок памяти Хранилища данных в каждой подсистеме.
В каждом диалоговом окне блока Data Store Write, набор Data store name к Raw_BTU_Data
.
В подсистеме Gas Calc используйте блок Data Store Write, чтобы записать в элемент хранилища данных 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
.