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

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

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

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

  • Применить проверку типа склада const и volatile.

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

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

Откройте пример модели rtwdemo_configinterface.

model = 'rtwdemo_configinterface';
open_system(model)

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

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

  • Блок вывода Out1

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

  • Моделируйте параметры K1, Table1, и Table2

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

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

  • Конечные X (задержка)

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

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

  2. На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений.

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

  4. В Property Inspector установите значение файла заголовка на exInDataLut.h.

Настройте настройки по умолчанию для блока Outport

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

  2. В Property Inspector установите значение файла заголовка на exOutSys.h и файл определения для exOutSys.c.

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

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

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

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

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

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

  1. На вкладке Data Defaults, в разделе Signals, выберите категорию Signals, states и внутренние данные. Установите класс памяти по умолчанию на 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Настройте настройки генерации кода для отдельных состояний

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

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

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

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

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

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

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

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

  4. Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префикс dout. В редакторе Отображения выберите сигнал Table1:1. В Property Inspector разверните узел Code. Установите свойство класса памяти 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

  • Блоки Outport с классом памяти ExportTo File и заголовочный файл exOutSys.h и файл определения exOutSys.c

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

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

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

  • Общие локальные хранилища данных с 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. Сконфигурируйте отдельные настройки элемента данных для Out1 блоков Outport с вызовом setOutportЧтобы избежать оптимизации, примените строение по умолчанию. Кроме того, сконфигурируйте идентификатор кода для исходящего порта. В вызове setOutport, задайте объект, возвращенный coder.mapping.api.get, имя блока Outport и аргументы пары "имя-значение" для настроек классов памяти и идентификатора кода.

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

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

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Чтобы избежать оптимизации, примените строение по умолчанию. Кроме того, сконфигурируйте идентификатор кода для хранилища данных. В вызове setDataStore, задайте объект, возвращенный coder.mapping.api.get, имя хранилища данных и аргументы пары "имя-значение" для параметров классов памяти и идентификатора кода.

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

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

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

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

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, output, mp_K1, ds_mode, dstate_X, dout_Table1, и dout_Table2.

Похожие темы