Можно создать внутренние представления параметров внешнего диалогового окна S-функций, называемых параметрами времени выполнения. Каждый параметр времени выполнения соответствует одному или нескольким параметрам диалогового окна и может иметь то же значение и тип данных, что и соответствующие внешние параметры, или другое значение или тип данных. Если параметр времени выполнения отличается по значению или типу данных от внешнего аналога, то, как сообщается, диалоговый параметр был преобразован для создания параметра времени выполнения. Значение параметра времени выполнения, которое соответствует нескольким диалоговым параметрам, обычно является функцией значений диалоговых параметров. Модуль Simulink ® выделяет и освобождает ресурсы хранения для параметров времени выполнения и предоставляет функции для их обновления и доступа к ним, что устраняет необходимость в S-функциях для выполнения этих задач. Параметры времени выполнения облегчают следующие виды операций S-функций:
Вычисленные параметры
Часто вывод блока является функцией значений нескольких диалоговых параметров. Например, предположим, что блок имеет два параметра, объем и плотность некоторого объекта, а выход блока является функцией входного сигнала и массы объекта. В этом случае массу можно рассматривать как третий внутренний параметр, вычисленный из двух внешних параметров - объема и плотности. S-функция может создавать параметр времени выполнения, соответствующий вычисленному весу, тем самым устраняя необходимость обеспечения специальной обработки веса в выходных вычислениях. Дополнительные сведения см. в разделе Создание параметров времени выполнения из нескольких параметров S-функции.
Преобразования типов данных
Часто блок должен изменить тип данных диалогового параметра, чтобы облегчить внутреннюю обработку. Например, предположим, что выход блока является функцией входного и диалогового параметров, а входные и диалоговые параметры имеют различные типы данных. В этом случае S-функция может создать параметр времени выполнения, который имеет то же значение, что и диалоговый параметр, но имеет тип данных входного сигнала, и использовать параметр времени выполнения при вычислении выходного сигнала.
Создание кода
Во время создания кода продукт Simulink Coder™ автоматически записывает все параметры времени выполнения в model.rtw файл, устраняющий необходимость выполнения S-функцией этой задачи через mdlRTW способ.
sfcndemo_runtime Модель Simulink содержит четыре примера S-функций, создающих параметры времени выполнения.
В C S-функции можно создавать параметры времени выполнения несколькими способами. В следующих разделах описаны различные методы создания параметров времени выполнения в C S-функции.
Используйте SimStruct функция в ssRegAllTunableParamsAsRunTimeParams для создания параметров времени выполнения, соответствующих всем настраиваемым параметрам. Для этой функции требуется передать массив имен, по одному для каждого параметра времени выполнения. Продукт Simulink Coder использует эти имена в качестве имен параметров при создании кода. S-функция mdlSetWorkWidthssfun_runtime1.c показывает, как создавать параметры времени выполнения все одновременно.
Этот подход к созданию параметров времени выполнения предполагает, что существует однозначное соответствие между параметрами времени выполнения S-функции и ее настраиваемыми диалоговыми параметрами. Возможно, это не так. Например, S-функция может захотеть использовать вычисляемый параметр, значение которого является функцией нескольких диалоговых параметров. В таких случаях S-функции может потребоваться создавать параметры времени выполнения по отдельности.
Для создания параметров времени выполнения по отдельности используется S-функция. метод долженmdlSetWorkWidths
Укажите количество параметров времени выполнения, которые он намерен использовать, используя ssSetNumRunTimeParams.
Использовать ssRegDlgParamAsRunTimeParam для регистрации параметра времени выполнения, соответствующего одному диалоговому параметру, даже при наличии преобразования типа данных, или ssSetRunTimeParamInfo для установки атрибутов параметра времени выполнения, соответствующего нескольким диалоговым параметрам.
В следующем примере используется ssRegDlgParamAsRunTimeParam и берется из S-функции sfun_runtime3.c. В этом примере создается параметр времени выполнения непосредственно из диалогового параметра и с тем же типом данных, что и сигнал первого входного порта.
static void mdlSetWorkWidths(SimStruct *S)
{
/* Get data type of input to use for run-time parameter */
DTypeId dtId = ssGetInputPortDataType(S, 0);
/* Define name of run-time parameter */
const char_T *rtParamName = "Gain";
ssSetNumRunTimeParams(S, 1); /* One run-time parameter */
if (ssGetErrorStatus(S) != NULL) return;
ssRegDlgParamAsRunTimeParam(S, GAIN_IDX, 0, rtParamName, dtId);
}
#endif /* MDL_SET_WORK_WIDTHS */В следующем примере используется ssSetRunTimeParamInfo и берется из S-функции sfun_runtime2.c.
static void mdlSetWorkWidths(SimStruct *S)
{
ssParamRec p; /* Initialize an ssParamRec structure */
int dlgP = GAIN_IDX; /* Index of S-function parameter */
/* Configure run-time parameter information */
p.name = "Gain";
p.nDimensions = 2;
p.dimensions = (int_T *) mxGetDimensions(GAIN_PARAM(S));
p.dataTypeId = SS_DOUBLE;
p.complexSignal = COMPLEX_NO;
p.data = (void *)mxGetPr(GAIN_PARAM(S));
p.dataAttributes = NULL;
p.nDlgParamIndices = 1;
p.dlgParamIndices = &dlgP;
p.transformed = false;
p.outputAsMatrix = false;
/* Set number of run-time parameters */
if (!ssSetNumRunTimeParams(S, 1)) return;
/* Set run-time parameter information */
if (!ssSetRunTimeParamInfo(S, 0, &p)) return;
}S-функция sfun_runtime2.c определяет параметры GAIN_IDX и GAIN_PARAM как показано ниже, перед использованием этих параметров в mdlSetWorkWidths.
#define GAIN_IDX 1 #define GAIN_PARAM(S) ssGetSFcnParam(S,GAIN_IDX)
Используйте ssSetRunTimeParamInfo функция в mdlSetWorkWidths для создания параметров времени выполнения как функции нескольких параметров S-функции. Например, рассмотрим S-функцию с двумя параметрами S-функции, плотностью и объемом. S-функция вводит силу (F) и выдает ускорение (a). mdlOutputs метод вычисляет силу с помощью уравнения F=m*a, где масса (m) - произведение плотности и объёма.
S-функция sfun_runtime4.c реализует этот пример, используя один параметр времени выполнения для хранения массы. S-функция начинается с определения типа данных параметра времени выполнения, а также переменных, связанных с объемом и плотностью.
#define RUN_TIME_DATA_TYPE SS_DOUBLE #if RUN_TIME_DATA_TYPE == SS_DOUBLE typedef real_T RunTimeDataType; #endif #define VOL_IDX 0 #define VOL_PARAM(S) ssGetSFcnParam(S,VOL_IDX) #define DEN_IDX 1 #define DEN_PARAM(S) ssGetSFcnParam(S,DEN_IDX)
mdlSetWorkWidths затем инициализирует параметр времени выполнения следующим образом.
static void mdlSetWorkWidths(SimStruct *S)
{
ssParamRec p; /* Initialize an ssParamRec structure */
int dlg[2]; /* Stores dialog indices */
real_T vol = *mxGetPr(VOL_PARAM(S));
real_T den = *mxGetPr(DEN_PARAM(S));
RunTimeDataType *mass;
/* Initialize dimensions for the run-time parameter as a
* local variable. The Simulink engine makes a copy of this
* information to store in the run-time parameter. */
int_T massDims[2] = {1,1};
/* Allocate memory for the run-time parameter data. The S-function
* owns this memory location. The Simulink engine does not copy the data.*/
if ((mass=(RunTimeDataType*)malloc(1)) == NULL) {
ssSetErrorStatus(S,"Memory allocation error");
return;
}
/* Store the pointer to the memory location in the S-function
* userdata. Since the S-function owns this data, it needs to
* free the memory during mdlTerminate */
ssSetUserData(S, (void*)mass);
/* Call a local function to initialize the run-time
* parameter data. The Simulink engine checks that the data is not
* empty so an initial value must be stored. */
calcMass(mass, vol, den);
/* Specify mass as a function of two S-function dialog parameters */
dlg[0] = VOL_IDX;
dlg[1] = DEN_IDX;
/* Configure run-time parameter information. */
p.name = "Mass";
p.nDimensions = 2;
p.dimensions = massDims;
p.dataTypeId = RUN_TIME_DATA_TYPE;
p.complexSignal = COMPLEX_NO;
p.data = mass;
p.dataAttributes = NULL;
p.nDlgParamIndices = 2;
p.dlgParamIndices = &dlg
p.transformed = RTPARAM_TRANSFORMED;
p.outputAsMatrix = false;
/* Set number of run-time parameters */
if (!ssSetNumRunTimeParams(S, 1)) return;
/* Set run-time parameter information */
if (!ssSetRunTimeParamInfo(S,0,&p)) return;
}
Локальная функция calcMass обновляет значение параметра времени выполнения в mdlSetWorkWidths и в mdlProcessParameters, при настройке значений плотности или объема.
/* Function: calcMass ==============================================
* Abstract:
* Local function to calculate the mass as a function of volume
* and density.
*/
static void calcMass(RunTimeDataType *mass, real_T vol, real_T den)
{
*mass = vol * den;
}
mdlOutputs метод использует хранимую массу для вычисления силы.
/* Function: mdlOutputs ==========================================
* Abstract:
*
* Output acceleration calculated as input force divided by mass.
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
real_T *y1 = ssGetOutputPortRealSignal(S,0);
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
RunTimeDataType *mass =
(RunTimeDataType *)((ssGetRunTimeParamInfo(S,0))->data);
/*
* Output acceleration = force / mass
*/
y1[0] = (*uPtrs[0]) / *mass;
}Наконец, mdlTerminate освобождает память, выделенную для параметра времени выполнения в mdlSetWorkWidths.
/* Function: mdlTerminate ==========================================
* Abstract:
* Free the user data.
*/
static void mdlTerminate(SimStruct *S)
{
/* Free memory used to store the run-time parameter data*/
RunTimeDataType *mass = ssGetUserData(S);
if (mass != NULL) {
free(mass);
}
}Чтобы запустить пример, откройте модель Simulink:
При каждом изменении значений параметров диалогового окна S-функции во время моделирования модуль Simulink вызывает S-функцию. метод для проверки изменений. Если изменения действительны, механизм вызывает S-функцию mdlCheckParameters в начале следующего временного шага. Этот метод должен обновлять параметры времени выполнения S-функции для отражения изменений в параметрах диалога.mdlProcessParameters
В C S-функции обновите параметры времени выполнения, используя метод, соответствующий способу создания параметров времени выполнения, как описано в следующих разделах.
В C MEX S-функции, если существует соответствие один к одному между перестраиваемыми диалоговыми параметрами S-функции и параметрами времени выполнения, т.е. параметры времени выполнения были зарегистрированы с использованием ssRegAllTunableParamsAsRunTimeParams, S-функция может использовать SimStruct функция для выполнения этой задачи. Эта функция обновляет каждый параметр времени выполнения, чтобы он имел то же значение, что и соответствующий параметр диалогового окна. Посмотрите ssUpdateAllTunableParamsAsRunTimeParamssfun_runtime1.c например.
Если между диалогом S-функции и параметрами времени выполнения нет однозначного соответствия, либо параметры времени выполнения преобразуются в версии параметров диалога, mdlProcessParameters метод должен обновлять каждый параметр по отдельности. Выберите метод, используемый для обновления параметра времени выполнения в зависимости от того, как он был зарегистрирован.
При регистрации параметра времени выполнения с помощью ssSetRunTimeParamInfo, mdlProcessParameters метод использует ssUpdateRunTimeParamData для обновления параметра времени выполнения, как показано на sfun_runtime2.c. Эта функция обновляет поле данных в записи атрибутов параметра. ssParamRec, с новым значением. Вы не можете непосредственно изменить ssParamRec, даже если вы можете получить указатель на ssParamRec использование ssGetRunTimeParamInfo.
При регистрации параметра времени выполнения с помощью ssRegDlgParamAsRunTimeParam, mdlProcessParameters метод использует ssUpdateDlgParamAsRunTimeParam для обновления параметра времени выполнения, как показано на sfun_runtime3.c.
Если параметр времени выполнения регистрируется как функция нескольких параметров S-функции, mdlProcessParameters метод использует ssUpdateRunTimeParamData для обновления параметра времени выполнения.
S-функция sfun_runtime4.c предоставляет пример. В этом примере mdlProcessParameters метод вычисляет новое значение для параметра времени выполнения и передает значение указателю ячейки памяти параметра времени выполнения, которая была выделена во время вызова mdlSetWorkWidths. mdlProcessParameters затем метод передает указатель обновленного параметра времени выполнения на ssUpdateRunTimeParamData.
Настройка диалогового параметра настраивает соответствующий параметр времени выполнения во время моделирования и в коде, генерируемом только в том случае, если диалоговый параметр удовлетворяет следующим условиям:
S-функция помечает диалоговый параметр как настраиваемый с помощью ssSetSFcnParamTunable.
Диалоговый параметр представляет собой массив значений MATLAB ® с типом данных, поддерживаемым продуктом Simulink.
Обратите внимание, что невозможно настроить параметр времени выполнения, значение которого является массивом ячеек или структурой.
Можно легко получить доступ к параметрам времени выполнения из кода S-функции. Чтобы получить доступ к данным параметров времени выполнения, выберите один из следующих методов на основе типа данных.
Если данные имеют тип double:
real_T *dataPtr = (real_T *) ssGetRunTimeParamInfo(S, #)->data;
Если параметр сложен, действительная и мнимая части данных перемежаются. Например, если пользователь вводит следующее:
K = [1+2i, 3+4i; 5+6i, 7+8i]
генерируемая матрица
K =
1+2i 3+4i
5+6i 7+8iПамять для этой матрицы раскладывается как
[1, 2, 5, 6, 3, 4, 7, 8]
Для доступа к сложному параметру времени выполнения из кода S-функции:
for (i = 0; i<width; i++)
{
real_T realData = dataPtr[(2*i)];
real_T imagData = dataPtr[(2*i)+1];
}Примечание
Элементы матрицы записываются в формате «основной столбец». Вещественные и мнимые значения перемежаются.