exponenta event banner

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

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

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

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

Доступ к устаревшим данным с помощью 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.

В диалоговом окне Параметры конфигурации модели (model Configuration Parameters) на панели Создание кода (Code Generation) > Пользовательский код (Custom Code) в разделе Дополнительные сведения о построении (Additional build information) выберите Исходные файлы (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 до тех пор, пока записываемые функции принимают и возвращают ожидаемые значения. Для скалярных данных функции должны иметь следующие характеристики:

  • 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 прототипы функций.

В диалоговом окне «Параметры конфигурации» на панели «Создание кода» > «Пользовательский код» приведите пример исходного файла предыдущей версии. 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.

В диалоговом окне Параметры конфигурации модели (model Configuration Parameters) на панели «Создание кода» (Code Generation) > «Пользовательский код» (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 является контрольной точкой. Этот сигнал является входом блока преобразования сигнала. Контрольная точка и блок преобразования сигнала существуют так, что сгенерированный код определяет переменную для выхода блока 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 прототипы функций.

В диалоговом окне «Параметры конфигурации» на панели «Создание кода» > «Пользовательский код» приведите пример исходного файла предыдущей версии. 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. Откройте конструктор классов настраиваемых хранилищ.

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

  5. Выберите новый класс хранения GetSet_1. На вкладке «Общие» задайте для параметра «Имя» значение myGetSet.

  6. Установите в раскрывающемся списке Header file значение Specify. В новом текстовом поле установите для параметра Header file значение myFcnHdr.h. Нажмите кнопку «Применить».

  7. На вкладке Access Function Attributes установите в выпадающих списках Get function и Set function значение Specify.

  8. В новых полях установите для параметра Get function значение myGetFcn_$N и Установить функцию в mySetFcn_$N. Нажмите кнопку ОК. Нажмите кнопку Да в ответ на сообщение о сохранении изменений.

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

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

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

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

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

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

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

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

Создайте свой собственный AccessFunction класс хранения с помощью конструктора пользовательских классов хранения, как описано в разделе Определение файла заголовка или Схема именования функций для элементов данных. В Конструкторе на вкладке Атрибуты функции доступа выберите Получить данные через макрос (опустить круглые скобки).

GetSet Ограничения класса хранения

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

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

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

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

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

  1. Вставьте блок преобразования сигнала на выходе блока или функции.

  2. В диалоговом окне Блок преобразования сигнала (Signal Conversion block) выберите Исключить этот блок из оптимизации «Сокращение блока» (Block reduction).

  3. Назначение класса хранения GetSet на выход блока преобразования сигнала.

Связанные темы