以下步骤展示了如何在C MEX S函数中初始化和使用DWORK Vectors。对于全部列表酝酿
与DWork向量相关的宏,参见DWork矢量C MEX宏。
在mdlInitializeSizes
,指定使用的dwork矢量数sssetnumdwork.
宏。例如,要指定S函数包含两个dwork向量,请使用该命令
sssetnumdwork(s,2);
虽然mdlInitializeSizes
方法告诉Simulink金宝app®发动机此时,发动机未使用的DWORK矢量S函数,发动机不会为DWORK矢量分配内存。
s函数可以推迟指定DWork向量的数量,直到通过传递值获得了关于s函数输入的所有信息DYNAMICALLY_SIZED
到sssetnumdwork.
宏。如果S函数缺少指定DWORK矢量的数量mdlInitializeSizes
它必须提供一个mdlSetWorkWidths
设置DWORK矢量的方法。
如果S函数没有提供mdlSetWorkWidths
方法,mdlInitializeSizes
方法为每个DOWN矢量设置任何适用的属性。例如,以下行初始化了前一步骤中初始化的DWORK矢量的宽度和数据类型。
ssSetDWorkWidth (0, 2);ssSetDWorkWidth (1, 1);ssSetDWorkDataType(年代,0,SS_DOUBLE);ssSetDWorkDataType(年代,1,SS_BOOLEAN);
下表列出了可以为dwork向量设置的属性,并显示设置它的宏的示例。看ssSetDWorkRTWStorageClass
有关支持的存储类列表。金宝app
属性 | 宏 |
---|---|
数据类型 |
|
尺寸 |
|
名称 |
|
用法类型 |
|
数字类型,真实或复杂 |
|
金宝app仿真软件编码器™标识符 |
|
金宝app仿真软件编码器存储类 |
|
金宝app仿真软件编码器C类型限定符 |
|
在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 -函数的已禁用的子系统时。
在mdlinitializeConditions.
,初始化需要在仿真中的某些点重新初始化的任何DWork向量的值。引擎执行mdlinitializeConditions.
在仿真的开始和任何时候一个启用的子系统包含s功能被重新启用。看到mdlstart.
示例中用于初始化DWork向量值的命令。
在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向量与遗留代码进行通信。如果您有在内存中分配数据结构的现有代码,则在DWork向量中存储指向这些数据结构的指针。然后,s函数可以通过指针与遗留代码通信。另外,为了简单地设置s函数,可以使用指针工作矢量来存储指针。看基础工作向量用于描述指针工作向量。
您还可以使用dwork向量来存储遗留代码的状态。模板文件sfuntmpl_gate_fortran.c.
展示如何使用dwork向量与传统的Fortran代码交互。遗留代码工具使用dwork向量来维护通过工具整合的传统C或C ++代码的状态。看使用遗留代码工具集成C函数有关遗留代码工具的更多信息。