Чтобы интегрировать сгенерированный код с внешним кодом или сгенерировать код, который выполняет кодирование стандартов и инструкций, можно сконфигурировать, как элементы данных в модели, такие как параметры блоков и линии сигналов, появляются в сгенерированном коде. Можно сконфигурировать настройки генерации кода по умолчанию для категорий элементов данных и сконфигурировать отдельные элементы при помощи API отображений редактора или кода Отображений Кода. Например, можно сконфигурировать настройки, которые управляют размещением объявлений и определений в сгенерированном и внешнем (экспортируемый и импортированный) файлы и именование переменных, которые представляют элементы данных в сгенерированном коде.
В этом примере показано, как сконфигурировать элементы данных для генерации кода, например, модель rtwdemo_configrpinterface
.
Открытая модель rtwdemo_configrpinterface.
в качестве примера
model = 'rtwdemo_configrpinterface';
open_system(model)
Пример показывает, как сконфигурировать эти элементы данных модели для генерации кода:
Inport
блоки In1
, In2
, In3
, и In4
Outport
блок Out1
Параметры модели K1
, Table1
A
без обозначения даты Table2
Локальное хранилище данных mode
Сигнальные линии, полученные от интерполяционной таблицы, блокируют Table1
и Table2
X
состояния (задержка)
Inport
БлокиОткройте приложение Simulink Coder.
Во вкладке C Code выберите Code Interface> Default Code Mappings.
В редакторе Отображений Кода, под Inports и Outports, избранной категорией Inports. Установите класс памяти по умолчанию на ImportedExternPointer
.
Outport
БлокНа вкладке Data Defaults, под Inports и Outports, избранными Выходными портами категории. Установите класс памяти по умолчанию на ExportedGlobal
.
На вкладке Data Defaults, под Параметрами, избранными Параметрами модели категории. Текст ссылки 'Auto' will be inlined
указывает, что генератор кода сконфигурирован, чтобы встроить параметры модели по умолчанию. В данном примере сконфигурируйте параметры модели, чтобы быть настраиваемыми. Нажмите 'Auto' will be inlined
. Диалоговое окно Model Configuration Parameters открывается.
Установите поведение параметра Значения по умолчанию параметра конфигурации модели на Tunable
. Сохраните изменение и закройте диалоговое окно. В редакторе Отображений Кода текст ссылки превращается в 'Auto' will be tunable
.
В редакторе Отображений Кода, с выбранной категорией Параметров модели, устанавливает класс памяти на ExportedGlobal
.
На вкладке Data Defaults, под Сигналами, избранными Сигналами категории, состояниями и внутренними данными. Установите класс памяти по умолчанию на 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. Расширьте Аргументы Параметра модели. По умолчанию класс памяти для каждого аргумента параметра модели установлен в Auto
, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. Если оптимизация не возможна, генератор кода применяет настройку по умолчанию модели. В данном примере оставьте набор класса памяти Auto
.
Расширьте Параметры модели. По умолчанию класс памяти для каждого параметра модели установлен в Auto
. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображений Кода, под Параметрами модели, избранные параметры K1
, Table1
, и Table2
. Установите класс памяти на Model default: ExportedGlobal
.
Сконфигурируйте идентификаторы кода для параметров модели с именами, которые включают префиксный mp_
, когда требования задают. В редакторе Отображений Кода выберите параметр модели K1
. В Property Inspector расширьте узел Кода. Установите свойство Identifier класса памяти на mp_K1
. Для параметров Table1
и Table2
, установите Идентификатор на mp_Table1
и mp_Table2
.
В редакторе Отображений Кода кликните по вкладке Data Stores. Расширьте Локальные Хранилища данных. Класс памяти для режима хранилища данных установлен в Автоматический, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображений Кода выберите локальное хранилище данных mode
. Установите класс памяти на Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для хранилища данных с именем, которое включает префиксный ds_
. В редакторе Отображений Кода выберите совместно использованное локальное хранилище данных mode
. В Property Inspector расширьте узел Кода. Установите свойство Identifier класса памяти на ds_mode
.
В редакторе Отображений Кода кликните по вкладке Signals/States. Расширьте состояния. Класс памяти для состояния установлен в Auto
, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображений Кода выберите X
состояния. Установите класс памяти на
Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для состояния с именем, которое включает префиксный dstate_
, когда требования задают. В редакторе Отображений Кода выберите X
состояния. В Property Inspector расширьте узел Кода. Затем установите свойство Identifier класса памяти на
dstate_X
.
Добавьте сигналы, что вы хотите сконфигурировать к отображениям типового кодекса. В данном примере добавьте в отображения типового кодекса выходные сигналы для двух блоков интерполяционной таблицы. Затем сконфигурируйте те сигналы.
В редакторе Отображений Кода кликните по вкладке Signals/States. Никакие сигналы не перечислены.
Добавьте сигналы в отображения кода. Поскольку выходные сигналы интерполяционной таблицы блокируют Table1
и Table2
, в модели выберите сигнал, сделайте паузу на замещающем знаке, который, кажется, выше или ниже сигнальной линии открывает строку меню и нажимает Add Signal button. В редакторе Отображений Кода узел Сигналов расширяет и перечисляет имена или идентификаторы блока двух сигналов, что вы добавили. Если сигнал решает к объекту сигнала, решимость сигнализировать, что объектный значок появляется справа от имени элемента или идентификатора портов. Класс памяти для каждого сигнала установлен в Auto
, что означает, что генератор кода может устранить соответствующие нормы в целях оптимизации. В данном примере вы хотите избежать оптимизации и для генератора кода, чтобы использовать установку класса памяти по умолчанию, ExportedGlobal
.
В редакторе Отображений Кода выберите выходные сигналы для блоков Table1
и Table2
. Установите класс памяти на Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для выходных сигналов для двух блоков интерполяционной таблицы с именами, которые включают префиксный dout
. В редакторе Отображений Кода выберите Table1:1
сигнала. В Property Inspector расширьте узел Кода. Установите свойство 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
Совместно использованные locoal хранилища данных с классом памяти 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
.To избегают оптимизации, применяют настройку по умолчанию. Кроме того, сконфигурируйте код identifer для выходного порта. В вызове setOutport
, задайте объект, возвращенный coder.mapping.api.get
, Outport
имя блока и аргументы пары "имя-значение" для класса памяти и кода 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_configrpinterface/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_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 13.712s
2. Просмотрите код. Например, в rtwdemo_configrpinterface.c, найдите, где эти переменные используются в функции точки входа шага: input1
, input2
, input3
, input4
вывод
, mp_K1
, ds_mode
, dstate_X
, dout_Table1
, и dout_Table2
.