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

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

Можно также создать свой собственный класс памяти в Embedded Coder® Словарь для доступа к данным через функции. Создание собственного класса памяти данных в словаре Embedded Coder Dictionary обеспечивает гибкость настройки имен функции и типов возврата. Для получения дополнительной информации смотрите Доступ к данным через функции при помощи классов памяти в словаре 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. The GetFunction и SetFunction свойства заданы как значения по умолчанию, get_$N и set_$N. Сгенерированный код использует имена функции, в которых вы задаете GetFunction и SetFunction для чтения и записи в данные. Код заменяет лексему $N с именем объекта данных. Для примера, для объекта данных inSigсгенерированный код использует вызовы устаревших функций get_inSig и set_inSig.

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

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

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

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

Build Summary

Top model targets built:

Model                  Action                       Rebuild Reason                                    
======================================================================================================
rtwdemo_getset_scalar  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 24.225s

В отчете о генерации кода просмотрите файл 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 функционирует, пока функции, которые вы записываете, принимают и возвращают ожидаемые значения. Для скалярных данных функции должны иметь следующие характеристики:

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

  • The 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. Чтобы получить доступ к векторным данным, функции принимают целочисленный аргумент в виде индекса. The get функция возвращает значение вектора во входном индексе. The 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. Этот устаревший файл заголовка содержит get и set прототипы функций.

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

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

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

Build Summary

Top model targets built:

Model                  Action                       Rebuild Reason                                    
======================================================================================================
rtwdemo_getset_vector  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 23.061s

В отчете о генерации кода просмотрите файл 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;
  for (i = 0; i < 5; i++) {
    /* Gain: '<Root>/Gain' incorporates:
     *  Inport: '<Root>/In1'
     */
    set_outVector(i, get_vectorParam(i) * get_inVector(i));
  }

Когда вы используете класс памяти GetSet с векторными данными, get и set функции, которые вы предоставляете, должны принимать входной параметр индекса. The get функция должна вернуть один элемент вектора. The 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. Этот устаревший файл заголовка содержит get и set прототипы функций.

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

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

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

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

Build Summary

Top model targets built:

Model                  Action                       Rebuild Reason                                    
======================================================================================================
rtwdemo_getset_struct  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 8.7984s

В отчете о генерации кода просмотрите файл 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. Блок тестовые точки и Преобразование Сигнала существуют так, что сгенерированный код задает переменную для выхода блока 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 функции эффективно преобразуют устаревшие матрицы в формат основной столбец. The set функция для выхода, matrixOutput, также вычисляет индекс большой строки, поэтому код записывает выход алгоритма в matrixOutput использование формата row-major. Кроме того, чтобы интегрировать сгенерированный код основного столбца с вашим наследственным кодом основной строки, можно вручную преобразовать унаследованный код в основной формат столбца путем транспонирования матричных данных и алгоритмов.

Просмотрите пример устаревшего файла заголовка 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. Этот устаревший файл заголовка содержит get и set прототипы функций.

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

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

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

Build Summary

Top model targets built:

Model                  Action                       Rebuild Reason                                    
======================================================================================================
rtwdemo_getset_matrix  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 7.1763s

В отчете о генерации кода просмотрите файл 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;
  for (i_0 = 0; i_0 < 3; i_0++) {
    for (i = 0; i < 3; i++) {
      /* Product: '<Root>/Product' incorporates:
       *  Constant: '<Root>/Constant'
       *  Inport: '<Root>/In1'
       */
      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.

Похожие темы