Доступ к данным через функции с классом памяти 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. Этот устаревший заголовочный файл содержит get и set прототипы функции. Объекты данных outSig и scalarParam также используйте класс памяти GetSet и заголовочный файл getsetHdrScalar.h.

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

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

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

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

В диалоговом окне модели Configuration Parameters, на Генерации кода> панель Пользовательского кода, устаревший исходный файл в качестве примера 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. Тестовая точка и блок 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. Этот устаревший заголовочный файл содержит get и set прототипы функции.

В диалоговом окне Configuration Parameters, на Генерации кода> панель Пользовательского кода, устаревший исходный файл в качестве примера 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.

Похожие темы