Чтобы интегрировать сгенерированный код с вашим собственным внешним кодом, можно сконфигурировать элементы данных в модели, такие как сигнальные линии и параметры блоков, чтобы появиться в сгенерированном коде как глобальные переменные. Используйте пользовательские классы памяти и типы данных к:
Экспортируйте или импортируйте названные типы числовых данных (typedef
).
Управляйте размещением объявлений и определений в сгенерированном и внешнем (экспортируемый и импортированный) файлы.
Пакет несколько элементов данных в структуры.
Примените спецификаторы типа хранения const
и volatile
.
Запустите скрипт prepare_rtwdemo_advsc
, который готовит модель rtwdemo_advsc
в качестве примера для этого примера. Сохраните модель в перезаписываемую папку.
run(fullfile(matlabroot,'examples','ecoder','main','prepare_rtwdemo_advsc'))
Эти данные сконфигурированы для генерации кода:
Параметры UPPER
ниже
, LIMIT
, K1
, и K2
(Stateflow)
Интерполяционные таблицы Object
, Table1
, и Table2
Сигналы Input1
, Input2
, Input3
, Input4
, и output
Состояния X
(задержка) и mode
(память хранилища данных)
1. В Редакторе Simulink откройте приложение Embedded Coder.
2. В модели выберите блок Gain.
3. В Property Inspector, рядом со значением параметра Усиления, кликают по кнопке действий (три вертикальных точки) и выбирают K1 (Model Workspace)> Explore.
Model Explorer показывает содержимое рабочего пространства модели. Рабочая область содержит Simulink.Parameter
и Simulink.LookupTable
объекты, которые устанавливают значения параметров, такие как постоянные скаляры и данные об интерполяционной таблице, для блоков в модели.
4. В нижней части окна Simulink Editor кликните по вкладке Model Data Editor.
5. В Model Data Editor кликните по вкладке Signals. Рассмотрите типы данных, перечисленные для сигналов. Несколько сигналов используют пользовательский тип данных MYTYPE
. В базовом рабочем пространстве, Simulink.AliasType
объект, MYTYPE
, действия как псевдоним для типа данных с плавающей точкой, с двойной точностью double
.
Предположим, что вы хотите сконфигурировать сгенерированный код к:
Экспортируйте объявление выходного сигнала output
к сгенерированному заголовочному файлу под названием outSigs.h
.
Импортируйте определения (выделение памяти) и объявления входных сигналов input1
через input4
из вашего внешнего кода. Вы обеспечиваете объявления в заголовочном файле под названием inputSigs.h
и определения в исходном файле под названием globalSigs.c
.
Экспортируйте параметры и интерполяционные таблицы, такие как K1
и Table1
, как const volatile
глобальные переменные заданы в tunableParams.c
и объявленный в tunableParams.h
.
Примените спецификатор типа хранения C volatile
к состояниям блока, таким как Unit Delay утверждают state_X
, и к хранилищам данных, таким как mode
.
Чтобы достигнуть этих целей, примените классы памяти к элементам данных.
1. Кликните по вкладке Code Mappings - C.
2. В редакторе Отображений Кода кликните по вкладке Data Defaults.
3. Для Inports, Класса памяти набора к ImportFromFile
.
3. В Property Inspector, набор HeaderFile к inputSigs.h
.
В качестве альтернативы, чтобы сконфигурировать сигналы в командной строке, используйте эти команды:
coder.mapping.create('rtwdemo_advsc') coder.mapping.defaults.set('rtwdemo_advsc','Inports',... 'StorageClass','ImportFromFile',... 'HeaderFile','inputSigs.h')
Включать внешний исходный файл globalSigs.c
при компиляции и соединении сгенерированного кода, используйте Исходные файлы параметра конфигурации модели.
1. В редакторе Отображений Кода, для Выходных портов, Класса памяти набора к ExportToFile
.
2. В Property Inspector, набор HeaderFile к outSigs.h
.
3. Для Параметров модели, Класса памяти набора к ConstVolatile
.
4. В Property Inspector, набор HeaderFile к tunableParams.h
и DefinitionFile к tunableParams.c
.
5. Для Внутренних данных, Класса памяти набора к Volatile
.
coder.mapping.defaults.set('rtwdemo_advsc','Outports',... 'StorageClass','ExportToFile',... 'HeaderFile','outSigs.h') coder.mapping.defaults.set('rtwdemo_advsc','LocalParameters',... 'StorageClass','ConstVolatile',... 'HeaderFile','tunableParams.h',... 'DefinitionFile','tunableParams.c') coder.mapping.defaults.set('rtwdemo_advsc','InternalData',... 'StorageClass','Volatile')
Сконфигурируйте параметры и интерполяционные таблицы.
1. Кликните по вкладке Model Data Editor.
2. В Model Data Editor кликните по вкладке Parameters.
3. В поле содержимого Фильтра введите model workspace
.
4. Для каждого параметра и интерполяционной таблицы в рабочем пространстве модели, кликните по строке таблицы. Затем в Property Inspector расширьте Секцию кода и и установите Класс памяти на Model default
. С этой установкой параметры и интерполяционные таблицы получают настройки генерации кода, которые вы задали как отображения кода по умолчанию для параметров модели.
mdlwks = get_param('rtwdemo_advsc','ModelWorkspace'); paramNames = evalin(mdlwks,'whos'); paramNames = {paramNames.name}; for i = 1:length(paramNames) temp = getVariable(mdlwks,paramNames{i}); temp = copy(temp); temp.CoderInfo.StorageClass = 'Model default'; assignin(mdlwks,paramNames{i},copy(temp)) end
Сконфигурируйте хранилища данных.
1. На вкладке Хранилищ данных, для хранилища данных mode
, установите Класс памяти на Model default
. Хранилище данных получает настройки генерации кода, которые вы задали для Внутренних данных.
set_param('rtwdemo_advsc/Data Store Memory','StateStorageClass',... 'Model default')
2. Измените настройки Глобальных переменных параметра конфигурации модели от $R$N$M
к $N$M
. С этой установкой глобальные переменные в сгенерированном коде имеют имена, которые совпадают с соответствующими элементами данных в модели. В этом случае, маркерный $R
представляет имя модели, rtwdemo_advsc
.
set_param('rtwdemo_advsc','CustomSymbolStrGlobalVar','$N$M')
Экспортировать определение типов (typedef
) из MYTYPE
от сгенерированного кода сконфигурируйте DataScope
свойство объекта MYTYPE
типа данных при помощи командной строки или диалогового окна свойства объекта. Экспортируйте определение заголовочному файлу под названием
myTypes.h
.
MYTYPE.DataScope = 'Exported'; MYTYPE.HeaderFile = 'myTypes.h';
Можно включать (#include
) этот экспортируемый заголовочный файл во внешнем исходном файле globalSigs.c
в котором вы выделяете память для входных сигналов input1
через input4
.
1. Сконфигурируйте модель, чтобы сгенерировать код только.
2. Сгенерируйте код.
set_param('rtwdemo_advsc','GenCodeOnly','on') rtwbuild('rtwdemo_advsc')
### Starting build procedure for: rtwdemo_advsc ### Successful completion of code generation for: rtwdemo_advsc
3. Просмотрите служебный файл myTypes.h
. Файл использует typedef
операторы, чтобы задать типы данных real и сложные типы данных MYTYPE
и cMYTYPE
.
file = fullfile('rtwdemo_advsc_ert_rtw','myTypes.h'); rtwdemodbtype(file,'typedef real_T MYTYPE;','typedef creal_T cMYTYPE;',1,1)
typedef real_T MYTYPE; typedef creal_T cMYTYPE;
4. Просмотрите файл данных outSigs.h
. Файл использует extern
ключевое слово, чтобы экспортировать объявление выходного сигнала output
.
file = fullfile('rtwdemo_advsc_ert_rtw','outSigs.h'); rtwdemodbtype(file,'/* Exported data declaration */','extern MYTYPE output;',1,1)
/* Exported data declaration */ /* Declaration for custom storage class: ExportToFile */ extern MYTYPE output; /* '<Root>/Out1' */
5. Просмотрите файл rtwdemo_advsc_private.h
. Файл использует #include
оператор, чтобы включать импортированный заголовочный файл inputSigs.h
.
6. Просмотрите файл данных tunableParams.c
. Файл задает глобальные переменные, которые соответствуют объектам параметра и объектам интерполяционной таблицы в рабочем пространстве модели. Объекты интерполяционной таблицы появляются как структуры, определения типа которых находятся в rtwdemo_advsc_types.h.
file = fullfile('rtwdemo_advsc_ert_rtw','tunableParams.c'); rtwdemodbtype(file,'/* Definition for custom storage class: ConstVolatile */',... '* File trailer for generated code.',1,0)
/* Definition for custom storage class: ConstVolatile */ const volatile int8_T K1 = 2; /* Referenced by: '<Root>/Gain' */ const volatile int8_T K2 = 3; /* Referenced by: '<Root>/Stateflow Chart' */ const volatile MYTYPE LOWER = -10.0; /* Referenced by: '<Root>/Constant2' */ const volatile Table1_Type Table1 = { { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }, { -1.0, -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99, 1.0 } } ; /* Referenced by: '<Root>/Table1' */ const volatile Table2_Type Table2 = { { 1.0, 2.0, 3.0 }, { 1.0, 2.0, 3.0 }, { 4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0 } } ; /* Referenced by: '<Root>/Table2' */ const volatile MYTYPE UPPER = 10.0; /* Referenced by: '<Root>/Constant1' */ /*
7. Просмотрите файл rtwdemo_advsc.c
. Файл выделяет память для экспортируемого output
сигнала,
state_X
состояния, и хранилище данных
mode
. Определения состояния и хранилища данных используют спецификатор volatile
.
file = fullfile('rtwdemo_advsc_ert_rtw','rtwdemo_advsc.c'); rtwdemodbtype(file,'/* Exported data definition */','volatile MYTYPE state_X;',1,1)
/* Exported data definition */ /* Definition for custom storage class: ExportToFile */ MYTYPE output; /* '<Root>/Out1' */ /* Volatile memory section */ /* Definition for custom storage class: Volatile */ volatile boolean_T mode; /* '<Root>/Data Store Memory' */ volatile MYTYPE state_X; /* '<Root>/Delay' */
Когда вы заканчиваете свой сеанс работы с MATLAB, переменные, и возражает, что вы создаете в базовом рабочем пространстве, таком как MYTYPE
, не сохраняться. Чтобы постоянно сохранить эти переменные и объекты, рассмотрите соединение модели со словарем данных.
Во вкладке Simulink® Editor Modeling, в галерее Design, выбирают Data Dictionary.
В диалоговом окне Model Properties нажмите New.
В диалоговом окне Create a New Data Dictionary, Имени файла набора к myDict
и нажмите Save.
В диалоговом окне Model Properties нажмите Apply.
Нажмите данные о Migrate.
Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.
Нажать ОК.
В качестве альтернативы, чтобы вручную переместить данные в словарь данных, можно использовать программируемые команды:
1. Создайте список переменных, и возражает, что ваша модель использует. В этом случае единственный член списка является MYTYPE.
usedVars = {Simulink.findVars('rtwdemo_advsc','SourceType','base workspace').Name};
2. Создайте новый словарь данных в своей текущей папке. Соедините модель с этим новым словарем.
myDictObj = Simulink.data.dictionary.create('myDict.sldd'); set_param('rtwdemo_advsc','DataDictionary','myDict.sldd')
3. Импортируйте только переменные интереса (в этом случае, MYTYPE) от базового рабочего пространства до словаря данных.
importFromBaseWorkspace(myDictObj,'clearWorkspaceVars',true,'varList',usedVars); saveChanges(myDictObj);
Словарь данных постоянно хранит MYTYPE
. Чтобы просмотреть содержимое словаря, кликните по значку словаря данных в нижнем левом углу модели и выберите Data Dictionary. Затем в панели Иерархии модели Model Explorer выберите узел Данных проектирования.
Для получения дополнительной информации о применении классов памяти к элементам данных, смотрите, Применяют Встроенные и Индивидуально настраиваемые Классы памяти к Элементам данных.