Сконфигурируйте интерфейс данных модели для генерации кода C

Чтобы интегрировать сгенерированный код с внешним кодом или сгенерировать код, который выполняет кодирование стандартов и инструкций, можно сконфигурировать, как элементы данных в модели, такие как параметры блоков и линии сигналов, появляются в сгенерированном коде. Можно сконфигурировать настройки генерации кода по умолчанию для категорий элементов данных и сконфигурировать отдельные элементы при помощи API отображений редактора или кода Отображений Кода. Например, можно сконфигурировать настройки что:

  • Управляйте размещением объявлений и определений в сгенерированном и внешнем (экспортируемый и импортированный) файлы.

  • Пакет несколько элементов данных в структуры.

  • Примените спецификаторы типа хранения const и volatile.

В этом примере показано, как сконфигурировать элементы данных для генерации кода, например, модель rtwdemo_configinterface.

Исследуйте модель в качестве примера

Открытая модель rtwdemo_configinterface. в качестве примера

model = 'rtwdemo_configinterface';
open_system(model)

Пример показывает, как сконфигурировать эти элементы данных модели для генерации кода:

  • Inport блоки In1, In2, In3, и In4

  • Блок Outport Out1

  • Аргументы LOWER параметра модели и UPPER

  • Параметры модели K1, Table1, и Table2

  • Локальное хранилище данных mode

  • Сигнальные линии, полученные от интерполяционной таблицы, блокируют Table1 и Table2

  • X состояния (задержка)

Сконфигурируйте настройки по умолчанию для Inport Блоки

  1. Откройте приложение Embedded Coder.

  2. Во вкладке C Code выберите Code Interface> Default Code Mappings.

  3. В редакторе Отображений Кода, под Inports и Outports, избранной категорией Inports. Установите класс памяти по умолчанию на ImportFromFile.

  4. В Property Inspector, Заголовочном файле набора к exInDataLut.h.

Сконфигурируйте настройки по умолчанию для блока выходного порта

  1. На вкладке Data Defaults, под Inports и Outports, избранными Выходными портами категории. Установите класс памяти по умолчанию на ExportToFile.

  2. В Property Inspector, Заголовочном файле набора к exOutSys.h и файл определения к exOutSys.c.

Сконфигурируйте настройки по умолчанию для параметров

  1. На вкладке Data Defaults, под Параметрами, избранными аргументами Параметра модели категории. Оставьте набор класса памяти Default. С той установкой генератор кода выделяет отдельную область памяти для каждого экземпляра аргумента.

  2. Выберите Параметры модели категории. Текст ссылки 'Auto' will be inlined указывает, что генератор кода сконфигурирован, чтобы встроить параметры модели по умолчанию. В данном примере сконфигурируйте параметры модели, чтобы быть настраиваемыми. Нажмите 'Auto' will be inlined. Диалоговое окно Model Configuration Parameters открывается.

  3. Установите поведение параметра Значения по умолчанию параметра конфигурации модели на Tunable. Сохраните изменение и закройте диалоговое окно. В редакторе Отображений Кода текст ссылки превращается в 'Auto' will be tunable.

  4. В редакторе Отображений Кода, с выбранной категорией Параметров модели, устанавливает класс памяти на ConstVolatile.

Сконфигурируйте настройки по умолчанию для сигналов, состояний и хранилищ данных

  1. На вкладке Data Defaults, под Сигналами, избранными Сигналами категории, состояниями и внутренними данными. Установите класс памяти по умолчанию на FileScope.

  2. Сконфигурируйте отображения кода по умолчанию для разделяемых локальных хранилищ данных. Выберите категорию Разделяемые локальные хранилища данных. Установите класс памяти на Volatile.

  3. Сохраните модель.

Сконфигурируйте настройки генерации кода для отдельных блоков Inport

  1. В редакторе Отображений Кода кликните по вкладке Inports. Редактор перечисляет имена корневого уровня Inport и In Bus Element блоки, которые находятся в модели. Если порт решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента. Класс памяти для каждого импорта установлен в Auto, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере настройка по умолчанию модели задает класс памяти ImportedFromFile. Чтобы избежать избегают оптимизации и обеспечивают генератор кода, чтобы использовать настройку по умолчанию, установить класс памяти на Model default. Чтобы заменить настройку по умолчанию, задайте класс памяти, который удовлетворяет требования генерации кода для того импорта.

  2. Сконфигурируйте генератор кода, чтобы применить установку класса памяти по умолчанию на импорт In2, In3, и In4. Выберите строки для трех импорта. Затем для одного из выбранного импорта, устанавливает класс памяти на Model default: ImportFromFile. Класс памяти для трех выбранного импорта превращается в значение по умолчанию Модели: ImportFromFile.

  3. Для импорта In1, замените установку класса памяти по умолчанию. Установите класс памяти на ImportFromFile. В Property Inspector, Заголовочном файле набора к exInDataMem.h.

  4. Сконфигурируйте идентификаторы кода для импорта так, чтобы переменные в сгенерированном коде совпадали с интерфейсными именами во внешнем заголовке и файлах определения. В редакторе Отображений Кода выберите строку для каждого импорта. В Property Inspector, набор свойство Identifier к этим значениям: input1, input2, input3, и input4.

Сконфигурируйте настройки генерации кода для отдельных блоков выходного порта

  1. В редакторе Отображений Кода кликните по вкладке Outports. Редактор перечисляет имена корневого уровня Outport и Out Bus Element блоки, которые находятся в модели. Если порт решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента. Класс памяти для выходного порта в модели в качестве примера установлен в Auto, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации.

  2. Чтобы избежать оптимизации и обеспечить генератор кода, чтобы использовать настройку по умолчанию, установите класс памяти на Model default: ExportToFile. Класс памяти для выбранного выходного порта превращается в Model default: ExportToFile.

  3. Сконфигурируйте идентификатор кода для выходного порта так, чтобы переменная в сгенерированном коде совпадала с интерфейсным именем, используемым внешним кодом. В редакторе Отображений Кода выберите строку для выходного порта. В Property Inspector, набор свойство Identifier к output.

Сконфигурируйте настройки генерации кода для отдельных параметров

  1. В редакторе Отображений Кода кликните по вкладке Parameters. Расширьте Аргументы Параметра модели. По умолчанию класс памяти для каждого аргумента параметра модели установлен в Auto, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере оставьте набор класса памяти Auto.

  2. Расширьте Параметры модели. По умолчанию класс памяти для каждого параметра модели установлен в Auto. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, ConstVolatile.

  3. В редакторе Отображений Кода, под Параметрами модели, избранные параметры K1, Table1, и Table2. Установите класс памяти на Model default: ConstVolatile.

  4. Сконфигурируйте идентификаторы кода для параметров модели с именами, которые включают префиксный mp_, когда требования задают. В редакторе Отображений Кода выберите параметр модели K1. В Property Inspector расширьте узел Кода. Установите свойство Identifier класса памяти на mp_K1. Для параметров Table1 и Table2, установите Идентификатор на mp_Table1 и mp_Table2.

Сконфигурируйте настройки генерации кода для отдельных хранилищ данных

  1. В редакторе Отображений Кода кликните по вкладке Data Stores. Расширьте Локальные Хранилища данных. Класс памяти для режима хранилища данных установлен в Автоматический, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, Volatile.

  2. В редакторе Отображений Кода выберите локальное хранилище данных mode. Установите класс памяти на Model default: Volatile.

  3. Сконфигурируйте идентификатор кода для хранилища данных с именем, которое включает префиксный ds_. В редакторе Отображений Кода выберите совместно использованное локальное хранилище данных mode. В Property Inspector расширьте узел Кода. Установите свойство Identifier класса памяти на ds_mode.

Сконфигурируйте настройки генерации кода для отдельных государств

  1. В редакторе Отображений Кода кликните по вкладке Signals/States. Расширьте состояния. Класс памяти для состояния установлен в Auto, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, FileScope.

  2. В редакторе Отображений Кода выберите X состояния. Установите класс памяти на Model default: FileScope.

  3. Сконфигурируйте идентификатор кода для состояния с именем, которое включает префиксный dstate_, когда требования задают. В редакторе Отображений Кода выберите X состояния. В Property Inspector расширьте узел Кода. Затем установите свойство Identifier класса памяти на dstate_X.

Сконфигурируйте настройки генерации кода для отдельных сигналов

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

  1. В редакторе Отображений Кода кликните по вкладке Signals/States. Никакие сигналы не перечислены.

  2. Добавьте сигналы в отображения кода. Поскольку выходные сигналы интерполяционной таблицы блокируют Table1 и Table2, в модели выберите сигнал, сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню и нажимает Add Signal button. В редакторе Отображений Кода узел Сигналов расширяет и перечисляет имена или идентификаторы блока двух сигналов, что вы добавили. Если сигнал решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента или идентификатора портов. Класс памяти для каждого сигнала установлен в Auto, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, FileScope.

  3. В редакторе Отображений Кода выберите выходные сигналы для блоков Table1 и Table2. Установите класс памяти на Model default: FileScope.

  4. Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префиксный dout. В редакторе Отображений Кода выберите Table1:1 сигнала. В Property Inspector расширьте узел Кода. Установите свойство Identifier класса памяти на dout_Table1. Для Table2:1 сигнала, установите Идентификатор на dout_Table2.

  5. Сохраните модель.

Сконфигурируйте данные для генерации кода программно

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

1. Получите объект, который представляет отображения кода для модели путем вызова coder.mapping.api.get. Вы задаете возвращенный объект в качестве первого аргумента в последующих вызовах кода, сопоставляющего функции.

cm = coder.mapping.api.get(model);

2. Сконфигурируйте настройки генерации кода по умолчанию для категорий элементов данных с вызовами setDataDefaults. В каждом вызове включайте объект, возвращенный вызовом coder.mapping.api.get, имя категории элемента данных и аргументы пары "имя-значение", которые задают свойства класса памяти и класс памяти. Используйте setDataDefaults сконфигурировать эти настройки по умолчанию:

  • Inport блоки с классом памяти ImportFromFile и заголовочный файл exInDataLut.h

  • Выходной порт блокирует с классом памяти ExportToFile и заголовочный файл exOutSys.h и файл определения exOutSys.c

  • Аргументы параметра модели с настройкой значения по умолчанию генератора кода

  • Параметры модели с классом памяти ConstVolatile

  • Внутренние данные (сигналы, состояния и локальные хранилища данных) с классом памяти FileScope

  • Совместно использованные locoal хранилища данных с классом памяти Volatile

setDataDefault(cm,'Inports','StorageClass','ImportFromFile','HeaderFile','exInDataLut.h');
setDataDefault(cm,'Outports','StorageClass','ExportToFile','HeaderFile','exOutSys.h',...
'DefinitionFile','exOutSys.c');
setDataDefault(cm,'ModelParameterArguments','StorageClass','Default');
setDataDefault(cm,'ModelParameters','StorageClass','ConstVolatile');
setDataDefault(cm,'InternalData','StorageClass','FileScope');
setDataDefault(cm,'SharedLocalDataStore','StorageClass','Volatile');

Установите параметр конфигурации модели DefaultParameterBehavior к Tunable, так, чтобы параметры модели были доступны во время программы exeuction.

set_param(model,'DefaultParameterBehavior','Tunable');

3. Сконфигурируйте отдельный Inport блоки с вызовами setInport. Чтобы избежать оптимизации, примените настройку по умолчанию для Inport блоки к In2, In3, и In4. Для In1, замените настройку по умолчанию путем установки класса памяти на ImportFromFile и заголовочный файл к exInDataMem.h. Кроме того, сконфигурируйте идентификаторы кода для импорта так, чтобы глобальные переменные, которые представляют импорт в сгенерированном коде, совпадали с именами переменных во внешнем файле определения. В каждом вызове setInport, задайте объект, возвращенный coder.mapping.api.get, Inport имя блока и аргументы пары "имя-значение" для класса памяти и настроек свойства.

setInport(cm,'In1','StorageClass','ImportFromFile','HeaderFile','exInDataMem.h',...
    'Identifier','Input1');
setInport(cm,'In2','StorageClass','Model default','Identifier','Input2');
setInport(cm,'In3','StorageClass','Model default','Identifier','Input3');
setInport(cm,'In4','StorageClass','Model default','Identifier','Input4');

4. Сконфигурируйте отдельные настройки элемента данных для блока Outport Out1 с вызовом setOutport.To избегают оптимизации, применяют настройку по умолчанию. Кроме того, сконфигурируйте код identifer для выходного порта. В вызове setOutport, задайте объект, возвращенный coder.mapping.api.get, имя блока Выходного порта и аргументы пары "имя-значение" для класса памяти и кода identifer настройки свойства.

setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');

5. Сконфигурируйте отдельные параметры модели с вызовами setModelParameter.To избегают оптимизации, применяют настройку по умолчанию. Кроме того, сконфигурируйте код identifers для параметров. В каждом вызове setModelParameter, задайте объект, возвращенный coder.mapping.api.get, название параметра и аргументы пары "имя-значение" для класса памяти и кода identifer настройки свойства.

setModelParameter(cm,'K1','StorageClass','Model default','Identifier','mp_K1');
setModelParameter(cm,'Table1','StorageClass','Model default','Identifier','mp_Table1');
setModelParameter(cm,'Table2','StorageClass','Model default','Identifier','mp_Table2');

6. Сконфигурируйте отдельные настройки элемента данных для локального хранилища данных mode с вызовом setDataStore.To избегают оптимизации, применяют настройку по умолчанию. Кроме того, сконфигурируйте код identifer для хранилища данных. В вызове setDataStore, задайте объект, возвращенный coder.mapping.api.get, имя хранилища данных и аргументы пары "имя-значение" для класса памяти и кода identifer настройки свойства.

setDataStore(cm,'mode','StorageClass','Model default','Identifier','ds_mode');

7. Сконфигурируйте отдельные настройки элемента данных для X состояния с вызовом setState.To избегают оптимизации, применяют настройку по умолчанию. Кроме того, сконфигурируйте код identifer для состояния. В вызове setState, задайте объект, возвращенный coder.mapping.api.get, путь для блока, который использует состояние и аргументы пары "имя-значение" для класса памяти и кода identifer настройки свойства.

setState(cm,'rtwdemo_configinterface/Delay','StorageClass','Model default',...
    'Identifier','dstate_X');

8. Добавьте сигналы в отображения кода и сконфигурируйте их с вызовами setSignal.To добавляют указатели порта, чтобы добавить данные сигнала в отображения типового кодекса с вызовами get_param. Затем задайте указатели блока в вызове addSignals. Чтобы избежать оптимизации, примените свою настройку по умолчанию для сигналов. Кроме того, сконфигурируйте код identifers для сигналов. В каждом вызове setSignal, задайте объект, возвращенный coder.mapping.api.get, путь или указатель блока источника сигнала и аргументы пары "имя-значение" для класса памяти и кода identifer настройки свойства.

lut1D_ports = get_param('rtwdemo_configinterface/Table1','PortHandles');
lut2D_ports = get_param('rtwdemo_configinterface/Table2','PortHandles');

lut1D_outPort = lut1D_ports.Outport;
lut2D_outPort = lut2D_ports.Outport;

addSignal(cm,[lut1D_outPort,lut2D_outPort]);

setSignal(cm,lut1D_outPort,'StorageClass','Model default','Identifier','dout_Table1');
setSignal(cm,lut2D_outPort,'StorageClass','Model default','Identifier','dout_Table2');

Сгенерируйте и просмотрите код

1. Сгенерируйте код.

slbuild(model)
### Starting build procedure for: rtwdemo_configinterface
### Successful completion of code generation for: rtwdemo_configinterface

Build Summary

Top model targets built:

Model                    Action          Rebuild Reason                                    
===========================================================================================
rtwdemo_configinterface  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 11.593s

2. Просмотрите код. Например, в rtwdemo_configinterface.c, найдите, где эти переменные используются в функции точки входа шага: input1, input2, input3, input4вывод , mp_K1, ds_mode, dstate_X, dout_Table1, и dout_Table2.

Похожие темы