Чтобы интегрировать сгенерированный код с вашим собственным внешним кодом, можно сконфигурировать элементы данных в модели, такие как сигнальные линии и параметры блоков, чтобы появиться в сгенерированном коде как глобальные переменные. Используйте пользовательские классы памяти и пользовательские типы данных к:
Экспортируйте или импортируйте названные типы числовых данных (typedef
).
Управляйте размещением объявлений и определений в сгенерированном и внешнем (экспортируемый и импортированный) файлы.
Пакет несколько элементов данных в структуры.
Примените спецификаторы типа хранения const
и volatile
.
Запустите скрипт prepare_rtwdemo_advsc
, который готовит модель rtwdemo_advsc
в качестве примера к этому примеру.
run(fullfile(matlabroot,'examples','ecoder','main','prepare_rtwdemo_advsc'))
В модели выберите View> Property Inspector.
В модели выберите блок Gain.
В Property Inspector, рядом со значением параметра Усиления, кликают по кнопке действий (с тремя вертикальными точками) и выбирают K1> Explore.
Model Explorer показывает вам содержимое рабочего пространства модели. Рабочая область содержит Simulink.Parameter
, и Simulink.LookupTable
возражает что значения параметров набора, такие как постоянные скаляры и данные об интерполяционной таблице, для блоков в модели.
В модели выберите Display> Signals и Ports> Port Data Types, чтобы отобразить типы данных сигнала. Многие сигналы используют пользовательский тип данных MYTYPE
. В базовом рабочем пространстве объект Simulink.AliasType
, MYTYPE
, действует как псевдоним для типа данных с плавающей точкой, с двойной точностью double
.
Предположим, что вы хотите сконфигурировать сгенерированный код к:
Экспортируйте объявление выходного сигнала output
к сгенерированному заголовочному файлу под названием outSigs.h
.
Импортируйте определения (выделение памяти) и объявления входных сигналов input1
через input4
из вашего внешнего кода. Вы обеспечиваете объявления в заголовочном файле под названием inputSigs.h
и определения в исходном файле под названием globalSigs.c
.
Экспортируйте параметры и интерполяционные таблицы, такие как K1
и Table1
, как глобальные переменные const volatile
, заданные в tunableParams.c
и объявленные в tunableParams.h
.
Примените спецификатор типа хранения C, volatile
к состояниям блока, таким как Единичная задержка утверждают state_X
, и к хранилищам данных, таким как mode
.
Чтобы достигнуть этих целей, примените пользовательские классы памяти к элементам данных.
Поместите модель в Перспективу Кода путем выбора Code> C/C ++ Code> Configure Model in Code Perspective.
Под блок-схемой при Отображениях Кода> Значения по умолчанию Данных, для строки Inports, устанавливают Класс памяти на ImportFromFile
.
В Property Inspector, набор HeaderFile к inputSigs.h
.
Также, чтобы сконфигурировать сигналы, в командной строке, используют эти команды:
coder.mapping.create('rtwdemo_advsc') coder.mapping.defaults.set('rtwdemo_advsc','Inports',... 'StorageClass','ImportFromFile',... 'HeaderFile','inputSigs.h')
Чтобы включать внешний исходный файл globalSigs.c
, когда Simulink Coder компилирует и соединяет сгенерированный код, можно использовать параметр конфигурации, такой как Параметры конфигурации> Генерация кода> Пользовательский код> Дополнительная информация о Сборке> Исходные файлы.
В Коде, Сопоставляющем Редактор, для строки Выходных портов, устанавливает Класс памяти на ExportToFile
и HeaderFile к outSigs.h
.
Для Локальной строки параметров, Класса памяти набора к ConstVolatile
.
В Property Inspector, набор HeaderFile к tunableParams.h
и DefinitionFile к tunableParams.c
.
Для Внутренней строки данных, Класса памяти набора к 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')
Под блок-схемой откройте Model Data Editor путем выбора вкладки Model Data Editor.
В Model Data Editor осмотрите вкладку Parameters.
В поле содержимого Фильтра введите model workspace
.
Для параметров и интерполяционных таблиц в рабочем пространстве модели, Классе памяти набора к 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
На вкладке Хранилищ данных, для хранилища данных mode
, Класс памяти набора к Model default
. Хранилище данных получает настройки генерации кода, которые вы задали для Внутренних данных.
set_param('rtwdemo_advsc/Data Store Memory','StateStorageClass',... 'Model default')
Измените настройки для Параметров конфигурации> Генерация кода> Символы> Глобальные переменные от $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
.
В модели выберите Configuration Parameters> код Generate только. Затем сгенерируйте код из модели.
set_param('rtwdemo_advsc','GenCodeOnly','on') rtwbuild('rtwdemo_advsc')
### Starting build procedure for model: rtwdemo_advsc ### Successful completion of code generation for model: rtwdemo_advsc
В отчете генерации кода просмотрите служебный файл 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;
Просмотрите файл данных 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;
Просмотрите файл rtwdemo_advsc_private.h
. Файл использует оператор #include
, чтобы включать импортированный заголовочный файл inputSigs.h
.
Просмотрите файл данных 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; const volatile int8_T K2 = 3; const volatile MYTYPE LOWER = -10.0; 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 } } ; 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 } } ; const volatile MYTYPE UPPER = 10.0; /*
Просмотрите файл 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; /* Volatile memory section */ /* Definition for custom storage class: Volatile */ volatile boolean_T mode; volatile MYTYPE state_X;
Когда вы заканчиваете свой сеанс работы с MATLAB, переменные, и возражает, что вы создаете в базовом рабочем пространстве, таком как MYTYPE
, не сохраняться. Чтобы постоянно сохранить эти переменные и объекты, рассмотрите соединение модели со словарем данных.
В модели в качестве примера выберите File> Model Properties> Link to Data Dictionary.
В диалоговом окне Model Properties нажмите New.
В диалоговом окне Create a New Data Dictionary, Имени файла набора к myDict
и нажимают Save.
В диалоговом окне Model Properties нажмите Apply.
Нажмите данные о Migrate.
Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.
Нажать ОК.
Также, чтобы вручную переместить данные в словарь данных, можно использовать программируемые команды:
% Create a list of the variables and objects that the target % model uses. In this case, the only member of the list is MYTYPE. usedVars = {Simulink.findVars('rtwdemo_advsc','SourceType','base workspace').Name}; % Create a new data dictionary in your current folder. Link the model to % this new dictionary. myDictObj = Simulink.data.dictionary.create('myDict.sldd'); set_param('rtwdemo_advsc','DataDictionary','myDict.sldd') % Import only the target variables (in this case, MYTYPE) from the base workspace to the data % dictionary. importFromBaseWorkspace(myDictObj,'clearWorkspaceVars',true,'varList',usedVars);
Словарь данных теперь постоянно хранит MYTYPE
. Чтобы просмотреть содержимое словаря, кликните по значку словаря данных в нижнем левом углу модели. Затем в панели Иерархии модели Model Explorer выберите узел Данных проектирования.
Для получения дополнительной информации о применении пользовательских классов памяти к элементам данных, смотрите, Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.