基本工作向量
基本功向量的描述
除了DWork矢量,Simulink金宝app®软件提供了一组简化的工作向量。在某些s函数中,这些基本功向量可以提供比使用DWork向量更简单的解决方案:
IWork向量存储整数数据。
模式向量模型过零或其他需要单一模态矢量的特征。
PWork向量存储指向数据结构的指针,例如将s函数连接到遗留代码、另一个软件应用程序或硬件应用程序的指针。
RWork向量存储浮点(真实)数据。
与DWork向量的关系
下表将每种类型的工作向量与DWork向量进行比较。
工作向量类型 | 与DWork Vector的比较 | 如何创建等价的DWork向量 |
---|---|---|
套装 | IWork向量不能在生成的代码中自定义。此外,只允许一个IWork向量。 |
ssSetNumDWork (S, 1);ssSetDWorkDataType(年代,0,SS_INT8); |
模式 | 模式向量比DWork向量需要更多的内存,因为模式向量总是用整数 数据类型。而且,只允许一个模式向量。 |
ssSetNumDWork (S, 1);ssSetDWorkUsageType(年代,0,sSS_DWORK_USED_AS_MODE);ssSetDWorkDataType(年代,0,SS_INT8); |
PWork | 与DWork向量不同,PWork向量不能在生成的代码中命名。此外,您只允许一个PWork向量。 |
ssSetNumDWork (S, 1);ssSetDWorkDataType(年代,0,SS_POINTER); |
RWork | RWork向量不能在生成的代码中自定义。而且,您只允许一个RWork向量。 |
ssSetNumDWork (S, 1);ssSetDWorkDataType(年代,0,SS_DOUBLE); |
使用基本功向量
使用基本功向量的过程类似于DWork向量的过程在C MEX s -函数中使用DWork向量)。基本功向量的性质更少,因此初始化过程更简单。然而,如果您需要为s函数生成代码,那么s函数将比使用DWork向量时更加复杂。
下面的步骤展示了如何设置和使用基本功向量。看到额外的工作向量宏获取与以下流程中的每个步骤相关的宏列表。
在
mdlInitializeSizes
方法指定功向量的大小ssSetNum
宏,例如:X
工作ssSetNumPWork (S, 2);
此宏指示工作向量包含多少元素,但是,此时Simulink引擎不分配内存。金宝app
s函数可以延迟指定工作向量的长度,直到所有关于s函数输入的信息都可以通过传递该值获得
DYNAMICALLY_SIZED
到ssSetNum
宏。如果s函数延迟指定工作向量的长度X
工作mdlInitializeSizes
,它必须提供mdlSetWorkWidths
方法来建立功向量。请注意
如果s函数使用
mdlSetWorkWidths
, s函数中使用的所有功向量必须设为DYNAMICALLY_SIZED
在mdlInitializeSizes
即使之前已经知道确切的值mdlInitializeSizes
被称为。s函数要使用的大小大于mdlSetWorkWidths
.示例请参见
sfun_dynsize.c
.在
mdlStart
,将仅在模拟开始时初始化的工作向量赋值。使用ssGet
宏检索指向每个工作向量的指针,并使用该指针初始化工作向量的值。另外,使用X
工作ssGet
为工作向量的特定元素赋值。X
WorkValuesSimu金宝applink引擎调用
mdlStart
方法在模拟开始时执行一次。在调用此方法之前,引擎为工作向量分配内存。请勿使用mdlStart
方法用于在模拟过程中需要重新初始化的数据,例如,当启用包含s函数的已启用子系统时需要重新初始化的数据。在
mdlInitializeConditions
,初始化可能需要在模拟中的某些点重新初始化的任何工作向量的值。引擎执行mdlInitializeConditions
在模拟开始时以及在包含s功能的已启用子系统被重新启用的任何时候。在
mdlOutputs
,mdlUpdate
等,使用ssGet
宏检索指向工作向量的指针,并使用该指针访问或更新工作向量值。X
工作写一个
mdlRTW
方法允许目标语言编译器(TLC)访问工作向量。如果s函数使用DWork向量,则不需要执行此步骤。有关在类中写入参数数据的信息mdlRTW
方法,请参阅ssWriteRTWParamSettings
.有关使用类生成代码的详细信息mdlRTW
方法,请参阅用mdlRTW例程写完全内联的s函数(金宝app仿真软件编码器)。
额外的工作向量宏
宏 | 描述 |
---|---|
ssSetNumRWork |
指定实际工作矢量的宽度。 |
ssGetNumRWork |
使用实例查询实际功向量的宽度。 |
ssSetNumIWork |
指定整型工作向量的宽度。 |
ssGetNumIWork |
查询整型工作向量的宽度。 |
ssSetNumPWork |
指定指针工作向量的宽度。 |
ssGetNumPWork |
查询指针工作向量的宽度。 |
ssSetNumModes |
指定模式工作向量的宽度。 |
ssGetNumModes |
查询模式工作向量的宽度。 |
ssGetIWork |
获取一个指向整型工作向量的指针。 |
ssGetIWorkValue |
获取整型工作向量的一个元素。 |
ssGetModeVector |
获取一个指向模式工作向量的指针。 |
ssGetModeVectorValue |
获取模式功向量的一个元素。 |
ssGetPWork |
获取指向指针工作向量的指针。 |
ssGetPworkValue |
从指针工作向量中获取一个元素。 |
ssGetRWork |
获取一个指向浮点工作向量的指针。 |
ssGetRWorkValue |
获取浮点工作向量的一个元素。 |
ssSetIWorkValue |
设置整型工作向量的一个元素的值。 |
ssSetModeVectorValue |
设置模式工作向量的一个元素的值。 |
ssSetPWorkValue |
设置指针工作向量的一个元素的值。 |
ssSetRWorkValue |
设置浮点工作向量的一个元素的值。 |
基本功向量例子
下面几节提供了四种基本功向量类型的示例。
指针工作矢量
此示例打开一个文件并存储文件
指针工作向量中的指针。
以下声明,包含在mdlInitializeSizes
函数,指示指针工作向量将包含一个元素。
ssSetNumPWork(S, 1) /*指针工作向量*/
下面的代码使用指针工作向量来存储文件
指针,从标准I/O函数返回打开外部文件
.
#define MDL_START /*更改为#undef删除函数。*/ #if defined(MDL_START) static void mdlStart(real_T *x0, SimStruct *S) {FILE *fPtr;void **PWork = ssGetPWork(S);fPtr = fopen(“文件。数据”、“r”);PWork [0] = fPtr;} #endif /* MDL_START */
下面的代码检索文件
指针工作向量的指针,并将其传递给文件关闭
以便关闭文件。
静态无效mdlTerminate(SimStruct *S) {if (ssGetPWork(S) != NULL) {FILE *fPtr;fPtr = (FILE *) ssGetPWorkValue(S,0);if (fPtr != NULL) {fclose(fPtr);} ssSetPWorkValue(年代,0,NULL);}}
请注意
虽然Simulink引擎处金宝app理释放PWork矢量,但是mdlTerminate
方法必须始终释放存储在PWork向量中的内存。
实数和整数工作向量
的功能stvctf.c
利用RWork和IWork向量对时变连续传递函数进行建模。有关s函数的描述,请参见示例连续态中的不连续.
模式向量
下面的示例使用模式工作向量实现开关块。的mdlInitializeSizes
方法配置两个直接馈通的输入端口和一个输出端口。模式向量元素指示来自第一或第二输入端口的信号是否传播到输出。s函数使用一个s函数参数和一个相应的运行时参数来存储模式值,并允许在模拟过程中切换开关。
static void mdlinitializeszes (SimStruct *S){/*初始化一个S函数参数来切换模式值*/ ssSetNumSFcnParams(S, 1);if (ssGetNumSFcnParams(S) != ssgetfcnparamscount (S)){/*返回如果期望的数量!=实际的数量*/返回;} {int iParam = 0;int nParam = ssGetNumSFcnParams(S);for (iParam = 0;iParam < nParam;iParam++) {ssSetSFcnParamTunable(S, iParam, SS_PRM_TUNABLE);}} /*初始化两个输入端口直接馈通*/ if (!ssSetNumInputPorts(年代,2))返回;ssSetInputPortWidth (0, 1);ssSetInputPortWidth (1, 1); ssSetInputPortDataType( S, 0, SS_DOUBLE); ssSetInputPortDataType( S, 1, SS_DOUBLE); ssSetInputPortDirectFeedThrough( S, 0, 1); ssSetInputPortDirectFeedThrough( S, 1, 1); /* Initialize one output port */ if (!ssSetNumOutputPorts(S, 1)) return; ssSetOutputPortWidth(S, 0, 1); ssSetOutputPortDataType( S, 0, SS_DOUBLE); /* Initialize one element in the mode vector */ ssSetNumSampleTimes(S, 1); ssSetNumModes(S,1); ssSetOptions(S, SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_USE_TLC_WITH_ACCELERATOR | SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME | SS_OPTION_NONVOLATILE); }
的mdlInitializeConditions
方法使用S-function对话框参数的当前值初始化模式向量值。
函数:mdlInitializeConditions =============================摘要:*初始化模式向量值。*/ static void mdlInitializeConditions(SimStruct *S) {int_T *mv = ssGetModeVector(S);real_T参数= mxGetScalar(ssGetSFcnParam(S,0));mv [0] = (int_T)参数;}
的mdlProcessParameters
而且mdlSetWorkWidths
方法初始化和更新运行时参数。在模拟运行时,对S-function对话框参数的更改会映射到运行时参数。
/ *功能:mdlSetWorkWidths ============================================= * 文摘:*设置运行时参数的数量。*/ #定义MDL_SET_WORK_WIDTHS静态void mdlSetWorkWidths(SimStruct *S) {ssSetNumRunTimeParams(S,1);ssRegDlgParamAsRunTimeParam(0, 0,“P1”,SS_INT16);} / *功能:mdlProcessParameters =========================================== * 文摘:*更新运行时参数。*/ #定义MDL_PROCESS_PARAMETERS静态void mdlProcessParameters(SimStruct *S) {ssUpdateDlgParamAsRunTimeParam(S,0);}
的mdlOutputs
方法在每个主要的时间步骤使用新的运行时参数值更新模式向量值。然后,它使用模式向量值来确定哪个输入信号通过到输出。
静态无效mdlOutputs(SimStruct *S, int_T tid) {InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);InputRealPtrsType u2Ptrs = ssGetInputPortRealSignalPtrs(S,1);real_T *y = ssGetOutputPortSignal(S,0);int_T *模式= ssGetModeVector(S);real_T参数= mxGetScalar(ssGetSFcnParam(S,0));if (ssIsMajorTimeStep(S)){模式[0]= (int_T)param;}如果(!模式[0]){/ *第一输入* / y [0] = (* uPtrs [0]);}如果(模式[0]){/ *第二输入* / y [0] = (* u2Ptrs [0]);}}