Чтобы интегрировать сгенерированный код с внешним кодом или сгенерировать код, соответствующий стандартам кодирования и руководствам, можно сконфигурировать, как элементы данных в модели, такие как параметры блоков и линий сигналов, появляются в сгенерированном коде. Можно настроить настройки генерации кода по умолчанию для категорий элементов данных и сконфигурировать отдельные элементы с помощью редактора Отображения или 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 БлокиОткройте приложение 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.