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
структуры.
Сгенерируйте код с моделью в качестве примера.
rtwbuild('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 23.218s
В отчете генерации кода просмотрите файл 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
структуры.
Сгенерируйте код с моделью в качестве примера.
rtwbuild('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 11.482s
В отчете генерации кода просмотрите файл 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
структуры.
Сгенерируйте код с моделью в качестве примера.
rtwbuild('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 10.518s
В отчете генерации кода просмотрите файл 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
структуры.
Сгенерируйте код с моделью в качестве примера.
rtwbuild('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 10.205s
В отчете генерации кода просмотрите файл 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
, и применяя новый класс памяти к элементам данных в вашей модели.
Создайте свой собственный пакет класса данных, myPackage
, путем копирования папки +SimulinkDemos
пакета в качестве примера и переименование скопированной папки как
+myPackage
. Измените Parameter
и Signal
определения классов так, чтобы они использовали определения класса памяти от myPackage
. Для примера смотрите, Создают Пакет Класса Данных.
Установите свою текущую папку на папку, которая содержит папку пакета. В качестве альтернативы добавьте папку, содержащую папку пакета к вашему пути MATLAB®.
Откройте Custom Storage Class Designer.
cscdesigner('myPackage')
Выберите класс памяти GetSet
. Нажмите Copy, чтобы создать копию под названием GetSet_1
.
Выберите новый класс памяти GetSet_1
. Во вкладке General, набор Name к myGetSet
.
Установите выпадающий список Header file на Specify
. В новом текстовом поле, набор Header file к myFcnHdr.h
. Нажмите Apply.
На вкладке Access Function Attributes, набор выпадающие списки Get function и Set function к Specify
.
В новых полях, набор Get function к myGetFcn_$N
и Set function к mySetFcn_$N
. Нажмите OK. Нажмите Yes в ответ на сообщение о сохранении изменений.
Когда вы генерируете код, маркерный $N
расширяется на имя элемента данных, который использует этот класс памяти.
Примените класс памяти myGetSet
от вашего пакета до элемента данных. Например, создайте myPackage.Parameter
объект в базовом рабочем пространстве.
myParam = myPackage.Parameter(15.23); myParam.CoderInfo.StorageClass = 'Custom'; myParam.CoderInfo.CustomStorageClass = 'myGetSet';
Используйте объект установить значение параметров в вашей модели. Когда вы генерируете код, алгоритм кода получает доступ к параметру через функции, которые вы задали. Код использует #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-функцией:
Вставьте блок Signal Conversion при выходе блока или функции.
В диалоговом окне блока Signal Conversion выберите Exclude this block from 'Block reduction' optimization.
Присвойте класс памяти GetSet
к выходу блока Signal Conversion.