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

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

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

  1. Во вкладке Simulink® Editor Modeling, в галерее Design, выбирают Data Dictionary.

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

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

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

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

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

  7. Нажать ОК.

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

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

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