Сконфигурируйте интерфейс данных применением пользовательских классов памяти

Чтобы интегрировать сгенерированный код с вашим собственным внешним кодом, можно сконфигурировать элементы данных в модели, такие как сигнальные линии и параметры блоков, чтобы появиться в сгенерированном коде как глобальные переменные. Используйте пользовательские классы памяти и пользовательские типы данных к:

  • Экспортируйте или импортируйте названные типы числовых данных (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, не сохраняться. Чтобы постоянно сохранить эти переменные и объекты, рассмотрите соединение модели со словарем данных.

  1. В модели в качестве примера выберите File> Model Properties> Link to Data Dictionary.

  2. В диалоговом окне Model Properties нажмите New.

  3. В диалоговом окне Create a New Data Dictionary, Имени файла набора к myDict и нажимают Save.

  4. В диалоговом окне Model Properties нажмите Apply.

  5. Нажмите данные о Migrate.

  6. Нажмите Migrate в ответ на сообщение о копировании переменных, на которые ссылаются.

  7. Нажать ОК.

Также, чтобы вручную переместить данные в словарь данных, можно использовать программируемые команды:

% 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 выберите узел Данных проектирования.

Для получения дополнительной информации о применении пользовательских классов памяти к элементам данных, смотрите, Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.

Похожие темы