文档

运行时参数

关于运行时参数

您可以创建内部表示的外部功能对话框参数调用运行时参数。每一个运行时参数对应于一个或多个对话框参数可以有相同的值和数据类型对应的外部参数或一个不同的值或数据类型。如果运行时参数不同的值或数据类型对应的外部,对话框参数据说转换创建运行时参数。一个运行时参数的值对应于多个对话框参数通常是对话框的值参数的函数。的仿真软万博1manbetx件®发动机运行时参数的分配和释放存储和提供功能更新和访问它们,从而消除S-functions需要执行这些任务。

运行时参数方便以下类型的功能操作:

  • 计算参数

    经常一块的输出是一个函数的几个对话框参数的值。例如,假设一个街区有两个参数,一些物体的体积和密度,块的输出是输入信号的函数和物体的质量。在这种情况下,质量可以被看作是第三个内部参数计算两个外部参数,体积和密度。一个函数可以创建一个运行时参数的计算重量,从而消除需要提供特殊情况处理输出的重量计算。看到创建运行时参数从多个功能参数为更多的信息。

  • 数据类型转换

    经常一块需要改变一个对话框参数的数据类型来促进内部处理。例如,假设块的输出是输入和一个对话框的函数参数和输入和对话框参数是不同的数据类型。在本例中,函数可以创建一个运行时参数具有相同的值作为参数的对话框,但输入信号的数据类型,并使用运行时输出的参数计算。

  • 代码生成

    在代码生成,万博1manbetx仿真软件编码器™产品将所有运行时参数自动写入模型.rtw文件,不再需要通过一个函数来执行这个任务mdlRTW方法。

sfcndemo_runtime万博1manbetx仿真软件模型包含四个例子S-functions创建运行时参数。

创建运行时参数

在一个2级MATLAB®功能,您创建运行时参数与所有对话框可调参数有关。使用运行时对象的AutoRegRuntimePrms方法PostPropagationSetup回调方法注册块的运行时参数。例如:

block.AutoRegRuntimePrms;

在C功能,您可以创建运行时参数的方法。以下部分描述不同的方法创建运行时参数C s函数。

创建运行时参数

使用SimStruct函数ssRegAllTunableParamsAsRunTimeParamsmdlSetWorkWidths创建运行时参数对应的所有可调参数。这个函数要求您通过一个数组的名字,一个为每个运行时参数。的万博1manbetx仿真软件编码器产品使用这些名称作为参数的名称在代码生成。的功能sfun_runtime1.c显示了如何创建运行时参数。

这种方法创建运行时参数假设之间存在一一对应一个函数运行时参数对话框及其可调参数。这可能不是如此。例如,一个功能可能需要使用一个计算参数的值是一个函数的几个对话框参数。在这种情况下,功能可能需要创建单独运行时参数。

单独创建运行时参数

单独创建运行时参数,功能mdlSetWorkWidths方法应该

  1. 指定运行时参数的数量它打算使用,使用ssSetNumRunTimeParams

  2. 使用ssRegDlgParamAsRunTimeParam注册一个运行时参数对应于一个对话框参数,即使有一个数据类型转换,或ssSetRunTimeParamInfo设置一个运行时参数的属性对应于多个对话框参数。

下面的示例使用ssRegDlgParamAsRunTimeParam并从功能sfun_runtime3.c。这个示例创建了一个运行时参数直接从对话框参数和使用相同的数据类型作为第一个输入端口的信号。

静态孔隙mdlSetWorkWidths (SimStruct * S){/ *获取数据类型的输入用于运行时参数* / DTypeId dtId = ssGetInputPortDataType (S, 0);/ *定义运行时参数的名字* / const char_T * rtParamName =“增益”;ssSetNumRunTimeParams (S, 1);/ *一个运行时参数* /如果(ssGetErrorStatus (S) ! = NULL)返回;GAIN_IDX ssRegDlgParamAsRunTimeParam(年代,0 rtParamName dtId);}# endif / * MDL_SET_WORK_WIDTHS * /

下一个示例使用ssSetRunTimeParamInfo并从功能sfun_runtime2.c

静态孔隙mdlSetWorkWidths (SimStruct * S) {ssParamRec p;/ *初始化一个ssParamRec结构* / int dlgP = GAIN_IDX;* / / * / *指数s函数参数配置运行时参数信息* / p.name =“增益”;p。nDimensions = 2;p。尺寸= (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; }

的功能sfun_runtime2.c定义的参数GAIN_IDXGAIN_PARAM使用这些参数如下,之前mdlSetWorkWidths

#定义GAIN_IDX 1 #定义GAIN_PARAM (S) ssGetSFcnParam(年代,GAIN_IDX)

创建运行时参数从多个功能参数

使用ssSetRunTimeParamInfo函数mdlSetWorkWidths创建运行时参数的函数多个功能参数。例如,考虑一个函数有两个功能参数,密度和体积。函数的输入力(F)和输出加速度(一个)。的mdlOutputs方法使用方程计算力F = m *,质量()产品的密度和体积。

的功能sfun_runtime4.c实现这个示例使用一个运行时参数存储质量。函数首先定义运行时参数数据类型,以及变量与体积和密度有关。

#定义RUN_TIME_DATA_TYPE SS_DOUBLE #如果RUN_TIME_DATA_TYPE = = SS_DOUBLE typedef real_T RunTimeDataType;# endif #定义VOL_IDX 0 #定义VOL_PARAM (S) ssGetSFcnParam(年代,VOL_IDX) # define DEN_IDX 1 # define DEN_PARAM (S) ssGetSFcnParam(年代,DEN_IDX)

mdlSetWorkWidths方法然后初始化运行时参数,如下所示。

静态孔隙mdlSetWorkWidths (SimStruct * S) {ssParamRec p;/ *初始化一个ssParamRec结构* / int dlg [2];/ *存储对话框* / real_T卷= * mxGetPr指数(VOL_PARAM (S));real_T穴= * mxGetPr (DEN_PARAM (S));RunTimeDataType *质量;/ *初始化运行时参数维度作为局部变量。的仿真软万博1manbetx件引擎复制*信息存储在运行时参数。* / int_T massDims [2] = {1 1};/ *分配内存的运行时参数数据。功能*拥有该内存位置。 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,当密度或体积的值调整。

/ *功能:calcMass = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = *文摘:*本地函数计算质量与体积和密度的函数。* /静态孔隙calcMass (RunTimeDataType *质量,real_T卷,real_T窝){*质量=卷*穴;}

mdlOutputs方法使用存储质量计算力。

/ *功能:mdlOutputs = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = *文摘:* *输出加速度作为输入力除以质量计算。* /静态孔隙mdlOutputs (SimStruct *年代,int_T tid) {real_T *日元= ssGetOutputPortRealSignal (S, 0);InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs (S, 0);RunTimeDataType *质量= (RunTimeDataType *) ((ssGetRunTimeParamInfo(年代,0))- >数据);/ * *输出加速度=力/质量* / y1 [0] = (* uPtrs[0]) / *质量;}

最后,mdlTerminate运行时参数的方法释放分配的内存mdlSetWorkWidths

/ *功能:mdlTerminate = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = *文摘:*免费用户数据。* /静态孔隙mdlTerminate (SimStruct * S){/ *空闲内存用来存储运行时参数数据* / RunTimeDataType *质量= ssGetUserData(年代);如果(质量! = NULL){自由(质量);}}

要运行示例,打开模型模型:万博1manbetx

更新运行时参数

当你改变功能对话框参数的值在模拟、仿真软件引擎调用功能万博1manbetxmdlCheckParameters方法验证更改。如果更改是有效的,引擎调用功能mdlProcessParameters方法下一个时间步的开始。这种方法应该更新功能运行时参数来反映对话框参数的变化。

在一个2级MATLAB的s函数,更新运行时参数使用AutoUpdateRuntimePrms方法ProcessParameters回调方法。例如:

block.AutoUpdateRuntimePrms;

在C s函数,使用适合的方法更新运行时参数创建运行时参数,如以下部分所述。

更新所有参数

墨西哥人在C s函数,如果之间有一一对应的功能可调对话框参数和运行时参数,即。,运行时参数被注册使用ssRegAllTunableParamsAsRunTimeParams功能可以使用SimStruct函数ssUpdateAllTunableParamsAsRunTimeParams完成这一任务。这个函数更新每个运行时参数具有相同的值作为参数相应的对话框。看到sfun_runtime1.c了一个例子。

单独更新参数

如果没有功能对话框之间的一一对应和运行时参数或改变了版本的运行时参数对话框参数,mdlProcessParameters方法必须单独更新每个参数。选择方法用于更新运行时参数根据注册。

如果你注册一个运行时参数使用ssSetRunTimeParamInfo,mdlProcessParameters方法使用ssUpdateRunTimeParamData更新运行时参数,如图所示sfun_runtime2.c。这个函数更新参数的数据字段的属性记录,ssParamRec,一个新值。你不能直接修改ssParamRec,即使你可以获得一个指针ssParamRec使用ssGetRunTimeParamInfo

如果你注册一个运行时参数使用ssRegDlgParamAsRunTimeParam,mdlProcessParameters方法使用ssUpdateDlgParamAsRunTimeParam更新运行时参数,如所示sfun_runtime3.c

更新参数的函数多个功能参数

如果您注册一个运行时参数的函数多个功能参数,mdlProcessParameters方法使用ssUpdateRunTimeParamData更新运行时参数。

的功能sfun_runtime4.c提供了一个示例。在这个例子中,mdlProcessParameters为运行时参数方法计算一个新值并将值传递到运行时参数的内存位置的指针,调用期间分配mdlSetWorkWidths。的mdlProcessParameters方法然后将更新后的运行时传递参数的指针ssUpdateRunTimeParamData

优化运行时参数

调优一个对话框参数曲调相应的运行时参数在仿真和生成的代码只有在对话框参数符合下列条件:

  • 功能标志着对话框参数可调,使用ssSetSFcnParamTunable

  • 对话框参数是一个MATLAB数组值的数据类型支持的仿真软件产品。万博1manbetx万博1manbetx

注意,不能优化运行时参数的值是一个细胞数组或结构。

访问运行时参数

你可以很容易地访问运行时参数的功能代码。为了访问运行时参数数据,选择以下方法之一基于数据类型。

  • 如果数据类型:

    real_T * dataPtr = (real_T *) ssGetRunTimeParamInfo(年代,#)- >数据;
  • 如果参数是复杂的,数据的实部和虚部是交错的。例如,如果一个用户输入如下:

    K =(1 + 2, 3 + 4我;5 + 6,7 + 8我)

    生成的矩阵

    3 + 4 K = 1 + 2我5 + 6我7 + 8

    这个矩阵的内存布局

    (1、2、5、6、3、4、7、8)

    访问一个复杂的运行时参数的函数代码:

    (我= 0;我<宽度;我+ +){real_T realData = dataPtr [(2 * i)];real_T imagData = dataPtr [(2 *) + 1];}

请注意

矩阵元素在列为主的格式写的。真实和虚构的值是交错的。

另请参阅

这个主题有帮助吗?