主要内容

创建一个基本的C MEX s -函数

关于C MEX s -函数

您可以使用以下任何一种方法创建C MEX s函数:

每种方法都需要在编写s函数的便利性和s函数所支持的特性之间进行权衡。金宝app虽然手写s函数支持最广泛的特性,但它们可能很难编写。金宝appS-Function Builder块简化了编写C MEX s -函数的任务,但支持更少的特性。金宝app遗留代码工具提供了从现有C代码创建C MEX s函数的最简单方法,但支持的特性最少。金宝app看到可用的功能实现获取关于这些编写C MEX s函数的方法的特性和限制的更多信息。

如果你有金宝appSimulink Coder™,除前三种方法外,还有金宝app仿真软件编码器产品提供了一种从图形子系统生成C MEX s函数的方法。如果您是编写C MEX s -函数的新手,您可以在Simulink子系统中构建应用程序的各个部分,并使用s -函数目标将其转换为s -函数。金宝app生成的文件提供了如何在s函数中实现特定块的见解。关于s函数目标的详细信息和限制,请参见利用s函数目标加速仿真、代码重用或保护知识产权(金宝app仿真软件编码器).您可以使用与Simulink引擎交互的API开发一个s函数来表示外部代码。金宝app在代码生成器中使用这个s函数来生成代码。有关代码生成中不同类型s函数的详细信息,请参见s函数和代码生成(金宝app仿真软件编码器)

在模拟过程中,C MEX s函数必须向Simulink引擎提供有关该函数的信息。金宝app随着仿真的进行,引擎、ODE求解器和C MEX s函数进行交互以执行特定的任务。这些任务包括定义初始条件和块特征,以及计算导数、离散状态和输出。

与MATLAB s函数一样,Simulink引擎与一个金宝appC MEX s -函数通过调用s -函数实现的回调方法。每个方法执行一个预定义的任务,例如计算块输出,这需要模拟s函数定义的功能的块。但是,s函数可以根据s函数实现的功能自由地在每个方法中执行任务。例如,mdlOutputs方法必须在当前模拟时间计算块输出。然而,s函数可以以适合该函数的任何方式计算这些输出。这个基于回调的API允许您创建任何想要的功能的s函数,以及自定义块。

C MEX s -函数可以实现的回调方法集比MATLAB s -函数可用的回调方法集要大。C MEX s -函数只需要实现s -函数API中回调方法的一小部分。如果您的块没有实现特定的特性,比如矩阵信号,您可以省略实现某个特性所需的回调方法。这允许您非常快速地创建简单的块。

C MEX s函数的一般格式如下所示:

#定义S_FUNCTION_NAMEyour_sfunction_name_here#define S_FUNCTION_LEVEL 2 #include " SimStruct .h" static void mdlinitializesize (SimStruct *S) {}<附加功能的例程/代码>静态void mdlterminate(simstruct * s){} #ifdef matlab_mex_file / *是否被编译为mex文件?*/ #include "金宝appsimulink.c" /* MEX-file接口机制*/ #else #include "cg_sfun.h" /*代码生成注册函数*/ #endif

mdlinitializatize是Simulink引擎在与s函数交互时调用的第一个金宝app例程。引擎随后调用其他s函数方法(都以MDL.).在模拟的最后,引擎调用mdlterminate.

介绍基本C MEX S函数的示例

本节介绍了一个C MEX S函数的示例,您可以用作创建简单C S函数的模型。示例S函数timestwo.c输出其输入的两倍。

以下模型使用timestwos函数将正弦波的振幅加倍并在示波器中绘制出来。

s-function的块对话框指定timestwo作为S函数名称;参数字段为空。

timestwos函数包含如图所示的s函数回调方法。在S-function的末尾,包含如中所述的代码片段金宝appSimulink / Simulink编码器接口

内容timestwo.c如下所示。在示例之后提供了对代码的描述。

#define s_function_name timestwo / *定义,包括#define S_FUNCTION_LEVEL 2 #include " simstruct .h"
静态的空白mdlinitializatize(Simstruct * s){sssetnumsfcnparams(s,0);if(ssgetnumsfcnparams!= ssgetsfcnparamscount(s)){return;/ * Simulink引擎报告的参数不匹配* /}如果(!sssetnum金宝appinputportss(s,1))返回;sssetInputPortWidth(s,0,动态_sized);SssetInputportDirectFeedThrough(s,0,1);if(!sssetnumoutputports(s,1))返回;sssetoutputportwidth(s,0,动态_sized);sssetnumsampletimes(s,1);/ *在指定异常的情况下,请注意 - 请参阅sfuntmpl.doc * / sssetoptions(s,ss_option_exception_free_code);}
静态的空白mdlinitializateMpletimes(SimStruct *S) {ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);ssSetOffsetTime(年代,0,0.0);}
静态的空白mdlOutputs(SimStruct *S, int_T tid) {int_T i;InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);real_T *y = ssGetOutputPortRealSignal(S,0);int_T width = ssgetoutputporttwidth (S,0);(我= 0;我<宽度;i++) {*y++ = 2.0 *(*uPtrs[i]);} }
静态的空白mdlterminate.(SimStruct * S) {}
#ifdef MATLAB_MEX_FILE /*这个文件被编译为一个mex文件?*/ #include "金宝appsimulink.c" /* MEX-file接口机制*/ #else #include "cg_sfun.h" /*代码生成注册函数*/ #endif

这个例子有三个部分:

  • 定义,包括

  • 回调方法实现

  • 金宝appsimulink(或者金宝app仿真软件编码器)产品界面

定义,包括

该示例以以下内容开始定义语句。

#define S_FUNCTION_NAME timesttwo #定义S_FUNCTION_LEVEL 2

第一个定义语句指定s函数(timestwo).第二个定义语句指定s函数在2级格式(有关第1级和第2级s函数的更多信息,请参见转换1级C MEX s函数).

定义这两个项之后,示例包括simstruc.h.,它是一个头文件,允许访问SimStruct数据结构和MATLAB应用程序接口(API)功能。

#define s_function_name timestwo #define s_function_level 2 #include“simstruc.h”

simstruc.h.文件定义数据结构,称为SimStruct,Simulink引擎金宝app用于维护有关S函数的信息。的simstruc.h.文件还定义了宏,使您的MEX文件能够设置值并从中设置值(例如输入和输出信号到块)SimStruct(见关于Simstruct函数).

回调方法实现

下一部分timestwo函数包含所需回调方法的实现。

mdlinitializatize

Simu金宝applink引擎调用mdlinitializatize要查询S-函数所需的输入和输出端口数,尺寸的端口和任何其他信息(例如状态的数量)。

timestwo的实现mdlinitializatize指定以下大小信息:

  • 零参数

    因此,功能参数“S-Function Block Parameters”对话框的字段必须为空。如果包含任何参数,引擎将报告参数不匹配。

  • 一个输入端口和一个输出端口

    输入和输出端口的宽度是动态尺寸的。这告诉发动机,S函数可以接受任何宽度的输入信号。缺省情况下,当S函数只有一个输入和输出端口时,动态大小输入和输出端口的宽度相等。

  • 一个样品时间

    mdlinitializateMpletimesCallback方法指定样本时间的实际值。

  • 例外免费代码

    指定可用异常代码加快了S函数的执行。指定此选项时,您必须小心。通常,如果您的s函数与MATLAB环境没有交互,则可以安全地指定此选项。有关更多详细信息,请参阅金宝appSimulink引擎与C s函数的交互

mdlinitializateMpletimes

Simu金宝applink引擎调用mdlinitializateMpletimes来设置s函数的采样时间。一个timestwo块在驱动块执行时执行。因此,它有一个单一的继承样本时间,INHERITED_SAMPLE_TIME

mdlOutputs

引擎调用mdlOutputs在每个时间步长计算块输出。的timestwo的实现mdlOutputs将输入信号乘以2,并将答案写入输出。

这条线:

InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);

访问输入信号。的ssGetInputPortRealSignalPtrs宏返回一个指向指针的向量必须访问使用

* uPtrs[我]

有关访问输入信号的详细信息,请参见使用指针访问信号

这条线:

real_T *y = ssGetOutputPortRealSignal(S,0);

访问输出信号。的ssGetOutputPortRealSignal宏返回一个指向包含块输出的数组的指针。

这条线:

int_T width = ssgetoutputporttwidth (S,0);

获得通过块的信号的宽度。S函数循环输入以计算输出。

mdlterminate.

引擎调用mdlterminate.为s函数提供在仿真结束时执行任务的机会。这是一个强制性的s函数例程。的timestwoS-function不执行任何终止操作,此例程为空。

金宝app/金宝app编码器界面

在s函数的末尾,包含以下代码,以便将s函数附加到Simulink或金宝app金宝app仿真软件编码器下载188bet金宝搏产品。

#ifdef MATLAB_MEX_FILE #include "金宝appsimulink.c" #else #include "cg_sfun.h" #endif

该拖车在每个S函数的末尾都需要。如果省略了,则任何编译S函数的尝试都会中止出口文件的构建过程中失败错误消息。

建立时间戳示例

要编译此S函数,请输入

墨西哥人timestwo.c

在命令行。的梅克斯命令编译并链接timestwo.c文件使用默认编译器。的梅克斯命令创建一个动态加载的可执行文件供Simulink软件使用。金宝app如果你有多个支持matlab的编译器,你可以使用金宝app墨西哥人设置命令。看到改变默认的编译器还有清单金宝app支持编译器

得到的可执行文件称为MEX s函数,其中MEX代表“MATLAB可执行文件”。MEX文件扩展名因平台而异。例如,32位的Microsoft®视窗®系统,MEX文件扩展名为.mexw32.