Доступ к данным через функции с пользовательским классом памяти GetSet

Чтобы интегрировать сгенерированный код с унаследованным кодом, который использует специализированные функции, чтобы читать из и записать в данные, можно использовать пользовательский класс памяти GetSet. Сигналы, параметры блоков и состояния, которые используют GetSet, появляются в сгенерированном коде как вызовы функций средства доступа. Вы предоставляете функциональные определения.

Можно также создать собственный класс памяти в Словаре Embedded Coder®, чтобы получить доступ к данным через функции. Создание вашего собственного класса памяти в Словаре Embedded Coder дает вам гибкость настройки имен функций, и возвратите типы. Для получения дополнительной информации см. Доступ к данным Через Функции при помощи Классов памяти в Словаре Embedded Coder.

Чтобы сгенерировать код, который соответствует стандарту AUTOSAR путем доступа к данным посредством вызовов функции Rte, используйте перспективу кода AUTOSAR. См. Настройку Компонента AUTOSAR (AUTOSAR Blockset).

Доступ к устаревшим данным Используя Get и функции Set

Этот пример показывает, как сгенерировать код, который взаимодействует через интерфейс с унаследованным кодом при помощи специализированного get и функций set, чтобы получить доступ к данным.

Просмотрите устаревший заголовочный файл в качестве примера ComponentDataHdr.h. Файл задает большой тип структуры ComponentData.

rtwdemodbtype('ComponentDataHdr.h','/* ComponentData */','} ComponentData;',1,1)
/* ComponentData */

typedef struct {
    ScalarData scalars;
    VectorData vectors;
    StructData structs;
    MatricesData matrices;
} ComponentData;

Поле scalars является подструктурой, которая использует тип структуры ScalarData. Тип структуры ScalarData задает три скалярных поля: inSig, scalarParam и outSig.

rtwdemodbtype('ComponentDataHdr.h','/* ScalarData */','} ScalarData;',1,1)
/* ScalarData */

typedef struct {
    double inSig;
    double scalarParam;
    double outSig;
} ScalarData;

Просмотрите устаревший исходный файл в качестве примера getsetSrc.c. Файл задает и инициализирует глобальную переменную ex_getset_data, который использует тип структуры ComponentData. Инициализация включает значения для подструктуры scalars.

rtwdemodbtype('getsetSrc.c','/* Field "scalars" */','/* End of "scalars" */',1,1)
    /* Field "scalars" */ 
    {
    3.9, 
            
    12.3, 
            
    0.0
    },
    /* End of "scalars" */

Файл также задает функции, которые читают из и пишут в поля подструктуры scalars. Функции упрощают доступ к данным путем разыменования листовых полей глобальной переменной ex_getset_data структуры.

rtwdemodbtype('getsetSrc.c',...
    '/* Scalar get() and set() functions */','/* End of scalar functions */',1,1)
/* Scalar get() and set() functions */

double get_inSig(void)
{
    return ex_getset_data.scalars.inSig;
}

void set_inSig(double value)
{
    ex_getset_data.scalars.inSig = value;
}

double get_scalarParam(void)
{
    return ex_getset_data.scalars.scalarParam;
}

void set_scalarParam(double value)
{
    ex_getset_data.scalars.scalarParam = value;
}

double get_outSig(void)
{
    return ex_getset_data.scalars.outSig;
}

void set_outSig(double value)
{
    ex_getset_data.scalars.outSig = value;
}

Просмотрите устаревший заголовочный файл в качестве примера getsetHdrScalar.h. Файл содержит прототипы extern для get и функций, определяемых set в getsetSrc.c.

Откройте модель rtwdemo_getset_scalar в качестве примера. Модель создает объекты данных inSig, outSig и scalarParam в базовом рабочем пространстве. Объекты соответствуют сигналам и параметру в модели.

open_system('rtwdemo_getset_scalar')

В базовом рабочем пространстве дважды кликните объект inSig просмотреть его свойства. Объект использует пользовательский класс памяти GetSet. Свойства GetFunction и SetFunction установлены в значения по умолчанию, get_$N и set_$N. Сгенерированный код использует имена функций, которые вы задаете в GetFunction и SetFunction, чтобы читать из и записать в данные. Код заменяет маркерный $N на имя объекта данных. Например, для объекта данных inSig, сгенерированный код использует вызовы устаревших функций get_inSig и set_inSig.

Для объекта данных inSig свойство HeaderFile установлено в getsetHdrScalar.h. Этот устаревший заголовочный файл содержит прототипы функции set и get. Объекты данных outSig и scalarParam также используют пользовательский класс памяти GetSet и заголовочный файл getsetHdrScalar.h.

В диалоговом окне модели Configuration Parameters, на Генерации кода> панель Пользовательского кода, под Дополнительной информацией о сборке, избранными Исходными файлами. Поле Исходных файлов идентифицирует исходный файл getsetSrc.c для включения во время процесса сборки. Этот устаревший исходный файл содержит get и определения функции set и определение глобальной переменной ex_getset_data структуры.

Сгенерируйте код с моделью в качестве примера.

rtwbuild('rtwdemo_getset_scalar');
### Starting build procedure for model: rtwdemo_getset_scalar
### Successful completion of build procedure for model: rtwdemo_getset_scalar

В отчете генерации кода просмотрите файл rtwdemo_getset_scalar.c. Функция модели step использует устаревший get и функции set, чтобы выполнить алгоритм. Сгенерированный код получает доступ к устаревшему сигналу и данным о параметре путем вызова пользовательского, рукописного get и функций set.

rtwdemodbtype(fullfile('rtwdemo_getset_scalar_ert_rtw','rtwdemo_getset_scalar.c'),...
    '/* Model step function */','}',1,1)
/* Model step function */
void rtwdemo_getset_scalar_step(void)
{
  /* Gain: '<Root>/Gain' incorporates:
   *  Inport: '<Root>/In1'
   */
  set_outSig(get_scalarParam() * get_inSig());
}

Можно сгенерировать код, который вызывает пользовательский get и функции set пока функции, которые вы пишете, принимают и возвращают ожидаемые значения. Для скалярных данных функции должны иметь эти характеристики:

  • Функция get должна возвратить одно скалярное числовое значение соответствующего типа данных и не должна принимать аргументы (void).

  • Функция set ничего не должна возвращать (void) и должна принять одно скалярное числовое значение соответствующего типа данных.

Используйте GetSet с векторными данными

Этот пример показывает, как применить пользовательский класс памяти GetSet к сигналам и параметрам, которые являются векторами.

Просмотрите устаревший заголовочный файл в качестве примера ComponentDataHdr.h. Файл задает большой тип структуры ComponentData.

rtwdemodbtype('ComponentDataHdr.h','/* ComponentData */','} ComponentData;',1,1)
/* ComponentData */

typedef struct {
    ScalarData scalars;
    VectorData vectors;
    StructData structs;
    MatricesData matrices;
} ComponentData;

Поле vectors является подструктурой, которая использует тип структуры VectorData. Тип структуры VectorData задает три векторных поля: inVector, vectorParam и outVector. Векторы у каждого есть пять элементов.

rtwdemodbtype('ComponentDataHdr.h','/* VectorData */','} VectorData;',1,1)
/* VectorData */
        
typedef struct {
    double inVector[5];
    double vectorParam[5];
    double outVector[5];
} VectorData;

Просмотрите устаревший исходный файл в качестве примера getsetSrc.c. Файл задает и инициализирует глобальную переменную ex_getset_data, который использует тип структуры ComponentData. Инициализация включает значения для подструктуры vectors.

rtwdemodbtype('getsetSrc.c','/* Field "vectors" */','/* End of "vectors" */',1,1)
    /* Field "vectors" */
    {
        {5.7, 6.8, 1.2, 3.5, 10.1}, 
                
        {12.3, 18.7, 21.2, 28, 32.9}, 
                
        {0.0, 0.0, 0.0, 0.0, 0.0}
    },
    /* End of "vectors" */

Файл также задает функции, которые читают из и пишут в поля подструктуры vectors. Функции упрощают доступ к данным путем разыменования листовых полей глобальной переменной ex_getset_data структуры. Чтобы получить доступ к векторным данным, функции принимают целочисленный индексный аргумент. Функция get возвращает векторное значение во входном индексе. Функция set присваивает вход value входному индексу.

rtwdemodbtype('getsetSrc.c',...
    '/* Vector get() and set() functions */','/* End of vector functions */',1,1)
/* Vector get() and set() functions */

double get_inVector(int index)
{
    return ex_getset_data.vectors.inVector[index];
}

void set_inVector(int index, double value)
{
    ex_getset_data.vectors.inVector[index] = value;
}

double get_vectorParam(int index)
{
    return ex_getset_data.vectors.vectorParam[index];
}

void set_vectorParam(int index, double value)
{
    ex_getset_data.vectors.vectorParam[index] = value;
}

double get_outVector(int index)
{
    return ex_getset_data.vectors.outVector[index];
}

void set_outVector(int index, double value)
{
       ex_getset_data.vectors.outVector[index] = value;
}

Просмотрите устаревший заголовочный файл в качестве примера getsetHdrVector.h. Файл содержит прототипы extern для get и функций, определяемых set в getsetSrc.c.

Откройте модель rtwdemo_getset_vector в качестве примера. Модель создает объекты данных inVector, outVector и vectorParam в базовом рабочем пространстве. Объекты соответствуют сигналам и параметру в модели.

open_system('rtwdemo_getset_vector')

В базовом рабочем пространстве дважды кликните объект inVector просмотреть его свойства. Объект использует пользовательский класс памяти GetSet. Свойство HeaderFile задано как getsetHdrVector.h. Этот устаревший заголовочный файл содержит прототипы функции set и get.

В диалоговом окне модели Configuration Parameters, на Генерации кода> панель Пользовательского кода, устаревший исходный файл в качестве примера getsetSrc.c идентифицирован для включения во время процесса сборки. Этот устаревший исходный файл содержит get и определения функции set и определение глобальной переменной ex_getset_data структуры.

Сгенерируйте код с моделью в качестве примера.

rtwbuild('rtwdemo_getset_vector');
### Starting build procedure for model: rtwdemo_getset_vector
### Successful completion of build procedure for model: rtwdemo_getset_vector

В отчете генерации кода просмотрите файл rtwdemo_getset_vector.c. Функция модели step использует устаревший get и функции set, чтобы выполнить алгоритм.

rtwdemodbtype(fullfile('rtwdemo_getset_vector_ert_rtw','rtwdemo_getset_vector.c'),...
    '/* Model step function */','}',1,1)
/* Model step function */
void rtwdemo_getset_vector_step(void)
{
  int32_T i;

  /* Gain: '<Root>/Gain' incorporates:
   *  Inport: '<Root>/In1'
   */
  for (i = 0; i < 5; i++) {
    set_outVector(i, get_vectorParam(i) * get_inVector(i));
  }

Когда вы используете пользовательский класс памяти GetSet с векторными данными, get и функции set, которые вы обеспечиваете, должны принять индексный вход. Функция get должна возвратить один элемент вектора. Функция set должна записать в один элемент вектора.

Используйте GetSet со структурированными данными

Этот пример показывает, как применить пользовательский класс памяти GetSet к невиртуальным сигналам шины и параметрам структуры в модели.

Просмотрите устаревший заголовочный файл в качестве примера ComponentDataHdr.h. Файл задает большой тип структуры ComponentData.

rtwdemodbtype('ComponentDataHdr.h',...
    '/* ComponentData */','} ComponentData;',1,1)
/* ComponentData */

typedef struct {
    ScalarData scalars;
    VectorData vectors;
    StructData structs;
    MatricesData matrices;
} ComponentData;

Поле structs является подструктурой, которая использует тип структуры StructData. Тип структуры StructData задает три поля: inStruct, structParam и outStruct.

rtwdemodbtype('ComponentDataHdr.h','/* StructData */','} StructData;',1,1)
/* StructData */
        
typedef struct {
    SigBus inStruct;
    ParamBus structParam;
    SigBus outStruct;
} StructData;

Поля inStruct, structParam и outStruct являются также подструктурами, которые используют типы структуры SigBus и ParamBus. Каждый из этих двух типов структуры задает три скалярных поля.

rtwdemodbtype('ComponentDataHdr.h','/* SigBus */','} ParamBus',1,1)
/* SigBus */

typedef struct {
    double cmd;
    double sensor1;
    double sensor2;
} SigBus;

/* ParamBus */

typedef struct {
    double offset;
    double gain1;
    double gain2;
} ParamBus;

Просмотрите устаревший исходный файл в качестве примера getsetSrc.c. Файл задает и инициализирует глобальную переменную ex_getset_data, который использует тип структуры ComponentData. Инициализация включает значения для подструктуры structs.

rtwdemodbtype('getsetSrc.c',...
    '/* Field "structs" */','/* End of "structs" */',1,1)
    /* Field "structs" */
    { 
        {1.3, 5.7, 9.2},
                
        {12.3, 9.6, 1.76},
                
        {0.0, 0.0, 0.0}
    },
    /* End of "structs" */

Файл также задает функции, которые читают из и пишут в поля подструктуры structs. Функции упрощают доступ к данным путем разыменования полей глобальной переменной ex_getset_data структуры. Функции получают доступ к данным в полях inStruct, structParam и outStruct путем принятия и возврата полных структур типов SigBus и ParamBus.

rtwdemodbtype('getsetSrc.c',...
    '/* Structure get() and set() functions */',...
    '/* End of structure functions */',1,1)
/* Structure get() and set() functions */

SigBus get_inStruct(void)
{
    return ex_getset_data.structs.inStruct;
}

void set_inStruct(SigBus value)
{
    ex_getset_data.structs.inStruct = value;
}

ParamBus get_structParam(void)
{
    return ex_getset_data.structs.structParam;
}

void set_structParam(ParamBus value)
{
    ex_getset_data.structs.structParam = value;
}

SigBus get_outStruct(void)
{
    return ex_getset_data.structs.outStruct;
}

void set_outStruct(SigBus value)
{
    ex_getset_data.structs.outStruct = value;
}

Просмотрите устаревший заголовочный файл в качестве примера getsetHdrStruct.h. Файл содержит прототипы extern для get и функций, определяемых set в getsetSrc.c.

Откройте модель rtwdemo_getset_struct в качестве примера. Модель создает объекты данных inStruct, structParam и outStruct в базовом рабочем пространстве. Объекты соответствуют сигналам и параметру в модели.

open_system('rtwdemo_getset_struct')

В базовом рабочем пространстве дважды кликните объект inStruct просмотреть его свойства. Объект использует пользовательский класс памяти GetSet. Свойство HeaderFile задано как getsetHdrStruct.h. Этот устаревший заголовочный файл содержит прототипы функции set и get.

Модель также создает объекты шины ParamBus и SigBus в базовом рабочем пространстве. Сигналы и параметр в модели используют типы шины, которые задают эти объекты. Свойство DataScope каждого объекта шины установлено в Imported. Свойство HeaderFile установлено в ComponentDataHdr.h. Сгенерированный код импортирует эти типы структуры из устаревшего заголовочного файла ComponentDataHdr.h.

В диалоговом окне модели Configuration Parameters, на Генерации кода> панель Пользовательского кода, устаревший исходный файл в качестве примера getsetSrc.c идентифицирован для включения во время процесса сборки. Этот устаревший исходный файл содержит get и определения функции set и определение глобальной переменной ex_getset_data структуры.

Сгенерируйте код с моделью в качестве примера.

rtwbuild('rtwdemo_getset_struct');
### Starting build procedure for model: rtwdemo_getset_struct
### Successful completion of build procedure for model: rtwdemo_getset_struct

В отчете генерации кода просмотрите файл rtwdemo_getset_struct.c. Функция модели step использует устаревший get и функции set, чтобы выполнить алгоритм.

rtwdemodbtype(fullfile('rtwdemo_getset_struct_ert_rtw',...
    'rtwdemo_getset_struct.c'),...
    '/* Model step function */','}',1,1)
/* Model step function */
void rtwdemo_getset_struct_step(void)
{
  /* Bias: '<Root>/Bias' incorporates:
   *  Inport: '<Root>/In1'
   */
  rtDW.BusCreator.cmd = (get_inStruct()).cmd + (get_structParam()).offset;

  /* Gain: '<Root>/Gain' incorporates:
   *  Inport: '<Root>/In1'
   */
  rtDW.BusCreator.sensor1 = (get_structParam()).gain1 * (get_inStruct()).sensor1;

  /* Gain: '<Root>/Gain1' incorporates:
   *  Inport: '<Root>/In1'
   */
  rtDW.BusCreator.sensor2 = (get_structParam()).gain2 * (get_inStruct()).sensor2;

  /* SignalConversion: '<Root>/Signal Conversion' */
  set_outStruct(rtDW.BusCreator);
}

Когда вы используете пользовательский класс памяти GetSet со структурированными данными, get и функции set, которые вы обеспечиваете, должны возвратить и принять полные структуры. Сгенерированный код разыменовывает отдельные поля структуры, которую возвращает функция get.

Выходной сигнал блока Bus Creator является тестовой точкой. Этот сигнал является входом для блока Signal Conversion. Тестовая точка и блок Signal Conversion существуют так, чтобы сгенерированный код задал переменную для вывода блока Bus Creator. Чтобы обеспечить полный аргумент структуры для функционального set_outStruct, необходимо сконфигурировать модель, чтобы создать эту переменную.

Используйте GetSet с матричными данными

Этот пример показывает, как применить пользовательский класс памяти GetSet к сигналам и параметрам, которые являются матрицами.

Просмотрите устаревший заголовочный файл в качестве примера ComponentDataHdr.h. Файл задает большой тип структуры ComponentData.

rtwdemodbtype('ComponentDataHdr.h',...
    '/* ComponentData */','} ComponentData;',1,1)
/* ComponentData */

typedef struct {
    ScalarData scalars;
    VectorData vectors;
    StructData structs;
    MatricesData matrices;
} ComponentData;

Поле matrices является подструктурой, которая использует тип структуры MatricesData. Тип структуры MatricesData задает три поля: matrixInput, matrixParam и matrixOutput. Поля хранят матричные данные как последовательные массивы. В этом случае вход и поля параметра у каждого есть 15 элементов. Выходное поле имеет девять элементов.

rtwdemodbtype('ComponentDataHdr.h'...
    ,'/* MatricesData */','} MatricesData;',1,1)
/* MatricesData */

typedef struct {
    double matrixInput[15];
    double matrixParam[15];
    double matrixOutput[9];
} MatricesData;

Просмотрите устаревший исходный файл в качестве примера getsetSrc.c. Файл задает и инициализирует глобальную переменную ex_getset_data, который использует тип структуры ComponentData. Инициализация включает значения для подструктуры matrices.

rtwdemodbtype('getsetSrc.c',...
    '/* Field "matrices" */','/* End of "matrices" */',1,1)
    /* Field "matrices" */
    {
        {12.0, 13.9, 7.4,
         0.5, 11.8, 6.4,
         4.7, 5.3, 13.0,
         0.7, 16.1, 13.5,
         1.6, 0.5, 3.1},

        {8.3, 12.0, 11.5, 2.0, 5.7,
         7.5, 12.8, 11.1, 8.4, 9.9,
         10.9, 4.6, 2.7, 16.3, 3.8},
                
        {0.0, 0.0, 0.0,
         0.0, 0.0, 0.0,
         0.0, 0.0, 0.0}
    }
    /* End of "matrices" */

Входная матрица имеет пять строк и три столбца. Параметр матрицы имеет три строки и пять столбцов. Матричный вывод имеет три строки и три столбца. Файл задает макросы, которые указывают на эти размерности.

rtwdemodbtype('getsetSrc.c',...
    '/* Matrix dimensions */','/* End of matrix dimensions */',1,1)
/* Matrix dimensions */

#define MATRIXINPUT_NROWS 5
#define MATRIXINPUT_NCOLS 3

#define MATRIXPARAM_NROWS 3
#define MATRIXPARAM_NCOLS 5

#define MATRIXOUTPUT_NROWS MATRIXPARAM_NROWS
#define MATRIXOUTPUT_NCOLS MATRIXINPUT_NCOLS

Файл также задает функции, которые читают из и пишут в поля подструктуры matrices.

rtwdemodbtype('getsetSrc.c',...
    '/* Matrix get() and set() functions */','/* End of matrix functions */',1,1)
/* Matrix get() and set() functions */

double get_matrixInput(int colIndex)
{
    int rowIndexGetInput = MATRIXINPUT_NCOLS * (colIndex % MATRIXINPUT_NROWS) + colIndex/MATRIXINPUT_NROWS;
    return ex_getset_data.matrices.matrixInput[rowIndexGetInput];
}

void set_matrixInput(int colIndex, double value)
{
    int rowIndexSetInput = MATRIXINPUT_NCOLS * (colIndex % MATRIXINPUT_NROWS) + colIndex/MATRIXINPUT_NROWS;
    ex_getset_data.matrices.matrixInput[rowIndexSetInput] = value;
}

double get_matrixParam(int colIndex)
{
    int rowIndexGetParam = MATRIXPARAM_NCOLS * (colIndex % MATRIXPARAM_NROWS) + colIndex/MATRIXPARAM_NROWS;
    return ex_getset_data.matrices.matrixParam[rowIndexGetParam];
}

void set_matrixParam(int colIndex, double value)
{
    int rowIndexSetParam = MATRIXPARAM_NCOLS * (colIndex % MATRIXPARAM_NROWS) + colIndex/MATRIXPARAM_NROWS;
    ex_getset_data.matrices.matrixParam[rowIndexSetParam] = value;
}

double get_matrixOutput(int colIndex)
{
    int rowIndexGetOut = MATRIXOUTPUT_NCOLS * (colIndex % MATRIXOUTPUT_NROWS) + colIndex/MATRIXOUTPUT_NROWS;
    return ex_getset_data.matrices.matrixOutput[rowIndexGetOut];  
}

void set_matrixOutput(int colIndex, double value)
{
    int rowIndexSetOut = MATRIXOUTPUT_NCOLS * (colIndex % MATRIXOUTPUT_NROWS) + colIndex/MATRIXOUTPUT_NROWS;
    ex_getset_data.matrices.matrixOutput[rowIndexSetOut] = value;
}

Код, который вы генерируете из модели, представляет матрицы как последовательные массивы. Поэтому каждый get и функции set принимает один скалярный индексный аргумент.

Сгенерированный код использует главный столбцом формат, чтобы сохранить и к данным о матрице права доступа. Однако много приложений C используют главную строкой индексацию. Чтобы интегрировать сгенерированный код с унаследованным кодом в качестве примера, который хранит матрицы matrixInput и matrixParam с помощью главного строкой формата, пользовательские функции get используют главный столбцом индексный вход, чтобы вычислить эквивалентный главный строкой индекс. Алгоритм сгенерированного кода, который интерпретирует матричные данные с помощью главного столбцом формата по умолчанию, выполняет правильную матричную математику, потому что функции get эффективно преобразовывают устаревшие матрицы в главный столбцом формат. Функция set для вывода, matrixOutput, также вычисляет главный строкой индекс, таким образом, код написал алгоритм вывод к matrixOutput с помощью главного строкой формата. Также, чтобы интегрировать главный столбцом сгенерированный код с вашим главным строкой унаследованным кодом, можно вручную преобразовать унаследованный код в главный столбцом формат путем перемещения матричных данных и алгоритмов.

Просмотрите устаревший заголовочный файл в качестве примера getsetHdrMatrix.h. Файл содержит прототипы extern для get и функций, определяемых set в getsetSrc.c.

Откройте модель rtwdemo_getset_matrix в качестве примера. Модель создает объекты данных matrixInput, matrixParam и matrixOutput в базовом рабочем пространстве. Объекты соответствуют сигналам и параметру в модели.

load_system('rtwdemo_getset_matrix')
set_param('rtwdemo_getset_matrix','SimulationCommand','Update')
open_system('rtwdemo_getset_matrix')

В базовом рабочем пространстве дважды кликните объект matrixInput просмотреть его свойства. Объект использует пользовательский класс памяти GetSet. Свойство HeaderFile задано как getsetHdrMatrix.h. Этот устаревший заголовочный файл содержит прототипы функции set и get.

В диалоговом окне модели Configuration Parameters, на Генерации кода> панель Пользовательского кода, устаревший исходный файл в качестве примера getsetSrc.c идентифицирован для включения во время процесса сборки. Этот устаревший исходный файл содержит get и определения функции set и определение глобальной переменной ex_getset_data структуры.

Сгенерируйте код с моделью в качестве примера.

rtwbuild('rtwdemo_getset_matrix');
### Starting build procedure for model: rtwdemo_getset_matrix
### Successful completion of build procedure for model: rtwdemo_getset_matrix

В отчете генерации кода просмотрите файл rtwdemo_getset_matrix.c. Функция модели step использует устаревший get и функции set, чтобы выполнить алгоритм.

rtwdemodbtype(fullfile('rtwdemo_getset_matrix_ert_rtw',...
    'rtwdemo_getset_matrix.c'),'/* Model step function */','}',1,1)
/* Model step function */
void rtwdemo_getset_matrix_step(void)
{
  int32_T i;
  int32_T i_0;
  int32_T i_1;
  int32_T matrixOutput_tmp;

  /* Product: '<Root>/Product' incorporates:
   *  Constant: '<Root>/Constant'
   *  Inport: '<Root>/In1'
   */
  for (i_0 = 0; i_0 < 3; i_0++) {
    for (i = 0; i < 3; i++) {
      matrixOutput_tmp = i + 3 * i_0;
      set_matrixOutput(matrixOutput_tmp, 0.0);
      for (i_1 = 0; i_1 < 5; i_1++) {
        set_matrixOutput(matrixOutput_tmp, get_matrixParam(3 * i_1 + i) *
                         get_matrixInput(5 * i_0 + i_1) + get_matrixOutput
                         (matrixOutput_tmp));
      }

Задайте заголовочный файл или функциональную схему именования для элементов данных

По умолчанию вы задаете имя заголовочного файла, имя функции get и имя функции set для каждого элемента данных, такого как сигнал или параметр, который использует пользовательский класс памяти GetSet.

Чтобы сконфигурировать один заголовочный файл, схему именования функции get или схему именования функции set, чтобы использовать для каждого элемента данных, можно использовать Custom Storage Class Designer, чтобы создать собственную копию GetSet. Можно задать заголовочный файл или имена функций в одном месте.

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

  1. Создайте свой собственный пакет класса данных, myPackage, путем копирования папки +SimulinkDemos пакета в качестве примера и переименования скопированной папки как +myPackage. Измените Parameter и определения классов Signal так, чтобы они использовали пользовательские определения класса памяти от myPackage. Для примера смотрите, Создают Пакет Класса Данных.

  2. Установите свою текущую папку на папку, которая содержит папку пакета. Также добавьте папку, содержащую папку пакета к вашему пути MATLAB®.

  3. Откройте Custom Storage Class Designer.

    cscdesigner('myPackage')
  4. Выберите пользовательский класс памяти GetSet. Нажмите Copy, чтобы создать копию под названием GetSet_1.

  5. Выберите новый пользовательский класс памяти GetSet_1. Во вкладке General, набор Name к myGetSet.

  6. Установите выпадающий список Header file на Specify. В новом текстовом поле, набор Header file к myFcnHdr.h. Нажмите Apply.

  7. На вкладке Access Function Attributes, набор выпадающие списки Get function и Set function к Specify.

  8. В новых полях, набор Get function к myGetFcn_$N и Set function к mySetFcn_$N. Нажмите OK. Нажмите Yes в ответ на сообщение о сохранении изменений.

    Когда вы генерируете код, маркерный $N расширяется на имя элемента данных, который использует этот пользовательский класс памяти.

  9. Примените пользовательский класс памяти myGetSet от вашего пакета до элемента данных. Например, создайте объект myPackage.Parameter в базовом рабочем пространстве.

    myParam = myPackage.Parameter(15.23);
    myParam.CoderInfo.StorageClass = 'Custom';
    myParam.CoderInfo.CustomStorageClass = 'myGetSet';
    

  10. Используйте объект установить значение параметров в вашей модели. Когда вы генерируете код, алгоритм кода получает доступ к параметру через функции, которые вы задали. Код использует директиву #include, чтобы включать заголовочный файл, который вы задали.

Доступ к скаляру и данным массива посредством макроса вместо вызова функции

Если вы реализуете механизм get для скалярных или данных массива как макрос вместо функции, можно сгенерировать код, который не использует круглые скобки при чтении тех данных.

  • Для скалярных данных ваш макрос должен привести к скалярному значению.

  • Для данных массива ваш макрос должен привести к стартовому адресу памяти.

Создайте свой собственный класс памяти AccessFunction при помощи Custom Storage Class Designer, как описано в Задают Заголовочный файл или Функциональную Схему именования для Элементов данных. В Разработчике, на вкладке Access Function Attributes, выбирают Get data through macro (omit parentheses).

GetSet пользовательские ограничения класса памяти

  • GetSet не поддерживает комплексные сигналы.

  • Несколько данных в той же модели не могут использовать тот же GetFunction или SetFunction.

  • Некоторые блоки непосредственно не поддерживают GetSet.

  • Пользовательские S-функции непосредственно не поддерживают GetSet.

Использовать GetSet с неподдерживаемым блоком или пользовательской S-функцией:

  1. Вставьте блок Signal Conversion при выводе блока или функции.

  2. В диалоговом окне блока Signal Conversion выберите Exclude this block from 'Block reduction' optimization.

  3. Присвойте пользовательский класс памяти GetSet выводу блока Signal Conversion.

Похожие темы