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
и применение нового класса памяти к элементам данных в вашей модели.
Создайте свой собственный пакет класса данных, 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.