Чтобы интегрировать сгенерированный код с внешним кодом или сгенерировать код, соответствующий стандартам кодирования и руководствам, можно сконфигурировать, как элементы данных в модели, такие как параметры блоков и линий сигналов, появляются в сгенерированном коде. Можно настроить настройки генерации кода по умолчанию для категорий элементов данных и сконфигурировать отдельные элементы с помощью редактора Отображения или API отображений кода. Например, можно сконфигурировать параметры, которые управляют размещением объявлений и определений в сгенерированных и внешних (экспортированных и импортированных) файлах и именованием переменных, которые представляют элементы данных в сгенерированном коде.
В этом примере показано, как сконфигурировать элементы данных для генерации кода, например, модели rtwdemo_configrpinterface
.
Откройте пример модели rtwdemo_configrpinterface.
model = 'rtwdemo_configrpinterface';
open_system(model)
Пример показывает, как сконфигурировать эти элементы данных моделей для генерации кода:
Inport
блоки In1
, In2
, In3
, и In4
Outport
блочное Out1
Моделируйте параметры K1
, Table1
, a
nd Table2
Локальное хранилище данных mode
Сигнальные линии, полученные из блоков интерполяционной таблицы Table1
и Table2
Конечные X
(задержка)
Inport
БлокиОткройте приложение Simulink Coder.
На вкладке Кода С выберите Код Интерфейс > По умолчанию Код Отображений.
В редакторе Отображения в разделе Inports и Outports выберите категорию Inports. Установите класс памяти по умолчанию равным ImportedExternPointer
.
Outport
БлокНа вкладке Data Defaults, в разделе Inports and Outports, выберите категорию Outports. Установите класс памяти по умолчанию равным ExportedGlobal
.
На вкладке Данных Значения по умолчанию, в разделе Параметров, выберите Параметры модели категории. Ссылка на текстовое 'Auto' will be inlined
указывает, что генератор кода сконфигурирован на встроенные параметры модели по умолчанию. В данном примере сконфигурируйте параметры модели, чтобы они были настраиваемыми. Нажмите 'Auto' will be inlined
. Откроется диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).
Установите параметр конфигурации модели Поведение параметра по умолчанию в Tunable
. Сохраните изменения и закройте диалоговое окно. В редакторе Отображения текст ссылки изменяется на 'Auto' will be tunable
.
В редакторе Отображения, с выбранной категорией параметров модели, установите класс памяти равным ExportedGlobal
.
На вкладке Data Defaults, в разделе Signals, выберите категорию Signals, states и внутренние данные. Установите класс памяти по умолчанию равным ExportedGlobal
.
Сконфигурируйте отображения кода по умолчанию для общих локальных хранилищ данных. Выберите категорию Общие локальные хранилища данных. Установите класс памяти равным ExportedGlobal
.
Сохраните модель.
Inport
БлокиВ редакторе Отображения перейдите на вкладку Inports. Редактор перечисляет имена корневых Inport
и In Bus Element
блоки, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для каждого входного порта установлен на Auto
, что означает, что генератор кода может исключить соответствующий код для целей оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти ImportedExternPointer
. Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным Model default
. Чтобы переопределить строение по умолчанию, задайте класс памяти, соответствующий требованиям генерации кода для этого входного порта.
Сконфигурируйте генератор кода, чтобы применить настройку класса памяти по умолчанию к входным портам In2
, In3
, и In4
. Выберите строки для трех входных портов. Затем для одного из выбранных входных портов установите класс памяти равным Model default: ImportedExternPointer
. Класс памяти для трех выбранных входных портов изменяется на Model default: ImportedExternPointer
.
Для входных In1
, переопределите настройку класса памяти по умолчанию. Установите класс памяти на ImportedExtern.
Сконфигурируйте идентификаторы кода для входных портов так, чтобы переменные в сгенерированном коде совпадали с именами интерфейсов во внешних файлах заголовка и определения. В редакторе Отображения выберите строку для каждого входного порта. В Property Inspector установите свойство Identifier на следующие значения: input1
, input2
, input3
, и input4
.
В редакторе Отображения перейдите на вкладку Outports. Редактор перечисляет имена корневых Outport
и Out Bus Element
блоки и элементы шины, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для выходного порта в модели примера установлен на Auto
, что означает, что генератор кода может исключить соответствующий код для целей оптимизации.
Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным ExportedGlobal
. Класс памяти для выбранного выходного порта изменяется на Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для исходящего порта так, чтобы переменная в сгенерированном коде совпадала с именем интерфейса, используемого внешним кодом. В редакторе Отображения выберите строку для вывода. В Property Inspector задайте значение свойства Identifier output
.
В редакторе Отображения перейдите на вкладку Parameters. Разверните раздел Model Parameter Аргументов. По умолчанию класс памяти для каждого аргумента параметра модели установлен на Auto
, что означает, что генератор кода может исключить соответствующий код для целей оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере оставьте класс памяти установленным на Auto
.
Разверните раздел «Параметры модели». По умолчанию класс памяти для каждого параметра модели устанавливается на Auto
. В данном примере необходимо избежать оптимизации и использовать генератором кода настройку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Кода Отображений под Параметры модели выберите параметры K1
, Table1
, и Table2
. Установите класс памяти равным Model default: ExportedGlobal
.
Сконфигурируйте идентификаторы кода для параметров модели с именами, которые включают префикс mp_
, как указано в требованиях. В редакторе Отображения выберите параметр модели K1
. В Property Inspector разверните узел Code. Установите свойство класса памяти Identifier на mp_K1
. Для параметров Table1
и Table2
, установите идентификатор равным mp_Table1
и mp_Table2
.
В редакторе Отображения перейдите на вкладку Data Stores. Разверните раздел «Локальные хранилища данных». Класс памяти для режима хранения данных установлен в Auto, что означает, что генератор кода может исключить соответствующий код для целей оптимизации. В данном примере необходимо избежать оптимизации и использовать генератором кода настройку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображения выберите локальное хранилище данных mode
. Установите класс памяти равным Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для хранилища данных с именем, которое включает префикс ds_
. В редакторе Отображения выберите общее локальное хранилище данных mode
. В Property Inspector разверните узел Code. Установите свойство класса памяти Identifier на ds_mode
.
В редакторе Отображения перейдите на вкладку Signals/States. Расширение государств. Класс памяти для состояния установлен в Auto
, что означает, что генератор кода может исключить соответствующий код для целей оптимизации. В данном примере необходимо избежать оптимизации и использовать генератором кода настройку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображения выберите состояние X
. Установите класс памяти равным Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для состояния с именем, которое включает префикс dstate_
, как указано в требованиях. В редакторе Отображения выберите состояние X
. В Property Inspector разверните узел Code. Затем установите свойство класса памяти Identifier на dstate_X
.
Добавьте сигналы, которые вы хотите сконфигурировать, к отображениям кода модели. В данном примере добавьте к коду модели отображений выходных сигналов для двух блоков интерполяционной таблицы. Затем сконфигурируйте эти сигналы.
В редакторе Отображения перейдите на вкладку Signals/States. Сигналы не перечислены.
Добавьте сигналы к отображениям кода. Для выходных сигналов блоков интерполяционной таблицы Table1
и Table2
, в модели, выберите сигнал, пауза на многоточии, которая появляется выше или ниже сигнальной линии, чтобы открыть панель действий и нажмите кнопку Add Signal. В редакторе Code Mappings узел Signals расширяется и приводит имена или идентификаторы блоков двух добавленных сигналов. Если сигнал разрешается к объекту сигнала, справа от имени элемента или идентификатора порта появляется значок разрешения к объекту сигнала. Класс памяти для каждого сигнала устанавливается на Auto
, что означает, что генератор кода может исключить соответствующий код для целей оптимизации. В данном примере необходимо избежать оптимизации и использовать генератором кода настройку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Code Mappings выберите выходные сигналы для блоков Table1
и Table2
. Установите класс памяти равным Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префикс dout
. В редакторе Отображения выберите сигнал Table1:1
. В Property Inspector разверните узел Code. Установите свойство класса памяти Identifier на dout_Table1
. Для Table2:1 сигналов
, установите идентификатор равным dout_Table2
.
Сохраните модель.
Кроме того, используйте 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
.