主要内容

如何使用dwork矢量

在C MEX S函数中使用DWORK VECTORS

以下步骤展示了如何在C MEX S函数中初始化和使用DWORK Vectors。对于全部列表酝酿与DWork向量相关的宏,参见DWork矢量C MEX宏

  1. mdlInitializeSizes,指定使用的dwork矢量数sssetnumdwork.宏。例如,要指定S函数包含两个dwork向量,请使用该命令

    sssetnumdwork(s,2);

    虽然mdlInitializeSizes方法告诉Simulink金宝app®发动机此时,发动机未使用的DWORK矢量S函数,发动机不会为DWORK矢量分配内存。

    s函数可以推迟指定DWork向量的数量,直到通过传递值获得了关于s函数输入的所有信息DYNAMICALLY_SIZEDsssetnumdwork.宏。如果S函数缺少指定DWORK矢量的数量mdlInitializeSizes它必须提供一个mdlSetWorkWidths设置DWORK矢量的方法。

  2. 如果S函数没有提供mdlSetWorkWidths方法,mdlInitializeSizes方法为每个DOWN矢量设置任何适用的属性。例如,以下行初始化了前一步骤中初始化的DWORK矢量的宽度和数据类型。

    ssSetDWorkWidth (0, 2);ssSetDWorkWidth (1, 1);ssSetDWorkDataType(年代,0,SS_DOUBLE);ssSetDWorkDataType(年代,1,SS_BOOLEAN);

    下表列出了可以为dwork向量设置的属性,并显示设置它的宏的示例。看ssSetDWorkRTWStorageClass有关支持的存储类列表。金宝app

    属性
    数据类型 sssetdworkDatatype.(s,0,ss_double);
    尺寸 sssetdworkwidth.(s,0,2);
    名称 sssetdworkname.(s,0,“sfcnstate”);
    用法类型 ssSetDWorkUsageType(s,0,ss_dwork_used_as_dstate);
    数字类型,真实或复杂 ssSetDWorkComplexSignal(s,0,complex_no);
    金宝app仿真软件编码器™标识符 sssetdworkrtwidentifier(年代,0,“增益”);
    金宝app仿真软件编码器存储类 ssSetDWorkRTWStorageClass(s,0,2);
    金宝app仿真软件编码器C类型限定符 sssetdworkrtwtypequalifier(s,0,“挥发性”);
  3. mdlstart.,初始化应该仅在模拟开始时设置的任何DWork向量的值。使用ssGetDWork宏检索每个DOWN向量的指针并初始化值。例如,以下mdlstart.方法初始化第一个dwork矢量。

    static void mdlStart(SimStruct *S) {real_T* x = (real_T*) ssGetDWork(S,0);/*初始化第一个DWork向量*/ x[0] = 0;x [1] = 2;}

    Simu金宝applink引擎在调用之前为DOWN VECTOR分配内存mdlstart.方法。因为这mdlstart.方法仅在模拟开始时调用一次,不要将其用于需要重新初始化的数据或状态,例如,在重新启用包含s -函数的已禁用的子系统时。

  4. mdlinitializeConditions.,初始化需要在仿真中的某些点重新初始化的任何DWork向量的值。引擎执行mdlinitializeConditions.在仿真的开始和任何时候一个启用的子系统包含s功能被重新启用。看到mdlstart.示例中用于初始化DWork向量值的命令。

  5. mdloutputs.mdlUpdate等时,使用thessGetDWork宏检索到DWORK VECTOR的指针并使用或更新DWORK矢量值。例如,对于存储两个离散状态的Dwork Vector,以下mdloutputs.mdlUpdate方法计算输出并更新离散状态值。

    之前定义的s函数U(元素)作为(* uPtrs(元素))一种B.C,D.为离散状态空间系统的状态空间矩阵。

    / *功能:mdlOutputs  ============================================== * 文摘:* y =残雪+ Du * /静态孔隙mdlOutputs (SimStruct *年代,int_T tid){如果(ssGetDWorkUsageType(年代,0)= = SS_DWORK_USED_AS_DSTATE) {real_T * y = ssGetOutputPortRealSignal (S, 0);ssGetDWork(S, 0); / /输出InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);UNUSED_ARG (tid);/ *不习惯在单任务模式* / / * y =残雪+ Du * / y [0] = C [0] [0] * x [0] + C [0] [1] * x [1] + D [0] [0] * U (0) + D [0] [1] * U (1);y [1] = C [1] [0] * x [0] + C [1] [1] * x [1] + D [1] [0] * U (0) + D [1] [1] * U (1);}} # define MDL_UPDATE / *功能:mdlUpdate  =============================================== * 文摘:* xdot = Ax +布鲁里溃疡* /静态空mdlUpdate (SimStruct *年代,int_T tid) {real_T tempX [2] = {0.0, 0.0};ssGetDWork(S, 0); / /输出InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);UNUSED_ARG (tid); /* not used in single tasking mode */ /* xdot=Ax+Bu */ tempX[0]=A[0][0]*x[0]+A[0][1]*x[1]+B[0][0]*U(0)+B[0][1]*U(1); tempX[1]=A[1][0]*x[0]+A[1][1]*x[1]+B[1][0]*U(0)+B[1][1]*U(1); x[0]=tempX[0]; x[1]=tempX[1]; }

您不必包含任何代码mdlTerminate解析用于存储dwork向量的内存的方法。同样,如果要为S函数生成带内划线的代码,则您不必写一个mdlRTW方法访问TLC文件中的DWork向量。Simu金宝applink软件为您处理DWork矢量的这些方面。

DWork矢量C MEX宏

下表列出了与DWORK矢量有关的C MEX宏。

描述
sssetnumdwork. 指定DWork向量的数量。
ssgetnumdwork. 查询DWork向量的个数。
ssGetDWork 获取一个指向特定DWork向量的指针。
ssgetdworkcomplexsignal. 确定一个特定的DWork向量是实数还是复数。
ssGetDWorkDataType 获取DWork向量的数据类型。
ssgetdworkname. 获取dwork矢量的名称。
ssGetDWorkRTWIdentifier 获取用于在生成的代码中声明Dwork向量的标识符。
ssGetDWorkRTWIdentifierMustResolveToSignalObject 指示DWork向量是否必须解析为金宝app仿真软件。信号Matlab的对象®工作区。
ssgetdworkrtwstorageclass. 获取dwork矢量的存储类。
ssGetDWorkRTWTypeQualifier 获取C类型限定符,用于在生成的代码中声明DWork向量。
ssGetDWorkUsageType 确定如何在s函数中使用DWork向量。
ssGetDWorkUsedAsDState 确定DWork向量是否存储离散状态。
ssgetdworkwidth. 获得dwork矢量的大小。
ssSetDWorkComplexSignal 指定dwork矢量的元素是否是真实的或复杂的。
sssetdworkDatatype. 指定DWork向量的数据类型。
sssetdworkname. 指定DWork向量的名称。
sssetdworkrtwidentifier 指定用于在生成的代码中声明Dwork向量的标识符。
ssSetDWorkRTWIdentifierMustResolveToSignalObject 指定是否必须解析为a的dwork vector金宝app仿真软件。信号对象。
ssSetDWorkRTWStorageClass 为dwork矢量指定存储类。
sssetdworkrtwtypequalifier 在生成的代码中指定用于声明DWork向量的C类型限定符。
ssSetDWorkUsageType 指定如何在s函数中使用DWork向量。
sssetdworkusedasdstate. 指定DWork向量存储离散状态值。
sssetdworkwidth. 指定dwork矢量的宽度。

使用DWork向量与遗留代码

您可以使用DWork向量与遗留代码进行通信。如果您有在内存中分配数据结构的现有代码,则在DWork向量中存储指向这些数据结构的指针。然后,s函数可以通过指针与遗留代码通信。另外,为了简单地设置s函数,可以使用指针工作矢量来存储指针。看基础工作向量用于描述指针工作向量。

您还可以使用dwork向量来存储遗留代码的状态。模板文件sfuntmpl_gate_fortran.c.展示如何使用dwork向量与传统的Fortran代码交互。遗留代码工具使用dwork向量来维护通过工具整合的传统C或C ++代码的状态。看使用遗留代码工具集成C函数有关遗留代码工具的更多信息。