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

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

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

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

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

model = 'rtwdemo_configrpinterface';
open_system(model)

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

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

  • Outport блочное Out1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. Для входных In1, переопределите настройку класса памяти по умолчанию. Установите класс памяти на ImportedExtern.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 блоки с классом памяти ImportedExternPointer

  • Outport блоки с классом памяти ExportedGlobal

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

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

  • Общие локальные хранилища данных с ExportedGlobal классов памяти

setDataDefault(cm,'Inports','StorageClass','ImportedExternPointer');
setDataDefault(cm,'Outports','StorageClass','ExportedGlobal');
setDataDefault(cm,'ModelParameters','StorageClass','ExportedGlobal');
setDataDefault(cm,'InternalData','StorageClass','ExportedGlobal');
setDataDefault(cm,'SharedLocalDataStore','StorageClass','ExportedGlobal');

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

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

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

setInport(cm,'In1','StorageClass','ImportedExtern','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Чтобы избежать оптимизации, примените строение по умолчанию. Кроме того, сконфигурируйте идентификатор кода для исходящего порта. В вызове 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_configrpinterface/Delay','StorageClass','Model default',...
    'Identifier','dstate_X');

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

lut1D_ports = get_param('rtwdemo_configrpinterface/Table1','PortHandles');
lut2D_ports = get_param('rtwdemo_configrpinterface/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_configrpinterface
### Successful completion of code generation for: rtwdemo_configrpinterface

Build Summary

Top model targets built:

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

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте