文档

基本工作向量

基本功向量的描述

除了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);
然后DWork向量存储一个指针。
RWork RWork向量不能在生成的代码中自定义。而且,您只允许一个RWork向量。
ssSetNumDWork (S, 1);ssSetDWorkDataType(年代,0,SS_DOUBLE);

使用基本功向量

使用基本功向量的过程类似于DWork向量的过程在C MEX s -函数中使用DWork向量)。基本功向量的性质更少,因此初始化过程更简单。然而,如果您需要为s函数生成代码,那么s函数将比使用DWork向量时更加复杂。

下面的步骤展示了如何设置和使用基本功向量。看到额外的工作向量宏获取与以下流程中的每个步骤相关的宏列表。

  1. mdlInitializeSizes方法指定功向量的大小ssSetNumX工作宏,例如:

    ssSetNumPWork (S, 2);

    此宏指示工作向量包含多少元素,但是,此时Simulink引擎不分配内存。金宝app

    s函数可以延迟指定工作向量的长度,直到所有关于s函数输入的信息都可以通过传递该值获得DYNAMICALLY_SIZEDssSetNumX工作宏。如果s函数延迟指定工作向量的长度mdlInitializeSizes,它必须提供mdlSetWorkWidths方法来建立功向量。

    请注意

    如果s函数使用mdlSetWorkWidths, s函数中使用的所有功向量必须设为DYNAMICALLY_SIZEDmdlInitializeSizes即使之前已经知道确切的值mdlInitializeSizes被称为。s函数要使用的大小大于mdlSetWorkWidths

    示例请参见sfun_dynsize.c

  2. mdlStart,将仅在模拟开始时初始化的工作向量赋值。使用ssGetX工作宏检索指向每个工作向量的指针,并使用该指针初始化工作向量的值。另外,使用ssGetXWorkValues为工作向量的特定元素赋值。

    Simu金宝applink引擎调用mdlStart方法在模拟开始时执行一次。在调用此方法之前,引擎为工作向量分配内存。请勿使用mdlStart方法用于在模拟过程中需要重新初始化的数据,例如,当启用包含s函数的已启用子系统时需要重新初始化的数据。

  3. mdlInitializeConditions,初始化可能需要在模拟中的某些点重新初始化的任何工作向量的值。引擎执行mdlInitializeConditions在模拟开始时以及在包含s功能的已启用子系统被重新启用的任何时候。

  4. mdlOutputsmdlUpdate等,使用ssGetX工作宏检索指向工作向量的指针,并使用该指针访问或更新工作向量值。

  5. 写一个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]);}}