Main Content

编写非内联 S-Function

非内联 S-Function 是 C 或 C++ MEX S-Function,Simulink® 引擎和生成的代码以相同的方式处理这种函数。您只需根据 S-Function API 实现一次算法即可。Simulink 引擎和生成的代码将在模型执行过程中调用 S-Function 例程(例如 mdlOutputs)。

非内联 S-Function 的特点是您的 S-Function 缺少 sfunction.tlc 文件。文件名根据您的平台而有所不同。例如,在 64 位 Microsoft® Windows® 系统上,该文件名为 sfunction.mexw64。在 MATLAB® 命令行窗口中键入 mexext 可查看系统使用的扩展名。

编写非内联 S-Function 的规范

  • MEX 文件不能调用 MATLAB 函数。

  • 如果 MEX 文件使用 MATLAB 外部接口库中的函数,请包括头文件 cg_sfun.h 而不是 mex.hsimulink.c。对于头文件 cg_sfun.h,在 S-Function 的末尾包括以下行:

    #ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
    #include "simulink.c"  /* MEX-file interface mechanism */
    #else
    #include "cg_sfun.h"   /* Code generation registration function */
    #endif
  • 仅使用代码生成器支持的 MATLAB API 函数。支持的 API 函数有:

    • mxGetDoubles

    • mxGetEps

    • mxGetInf

    • mxGetM

    • mxGetN

    • mxGetNaN

    • mxGetPr(不推荐。请改用 mxGetDoubles。)

    • mxGetScalar

    • mxGetString

    • mxIsEmpty

    • mxIsFinite

    • mxIsInf

  • 生成的代码不支持 MEX Library 调用。要在 MEX 文件中而不是在生成的代码中使用此类调用,请添加以下条件:

    #ifdef MATLAB_MEX_FILE
    #endif
  • 只能使用仅包含实数数据的满矩阵。

  • 不能为 mxGetString 的调用指定返回值。如果您指定返回值,MEX 文件将不会编译。在这种情况下,请使用函数的第二个输入参量,它返回指向字符向量的指针。

  • 使用正确的 #define s-function_name 语句。您指定的 S-Function 名称必须与 S-Function 的文件名完全一致。

  • 尽量使用 real_Tint_T 数据类型,而不要使用 doubleint。数据类型 real_Tint_T 更通用,可在多个环境中使用。

  • 为编译过程提供用来编译 S-Function 的模块的名称。使用模板联编文件、set_param 函数或 S-Function 模块参数对话框的 S-function modules 字段。例如,假设您使用以下命令编译 S-Function:

    mex sfun_main.c sfun_module1.c sfun_module2.c

    则可以使用以下 set_param 调用来包含所需的模块:

    set_param(sfun_block, "SFunctionModules","sfun_module1 sfun_module2")

    准备好生成代码之后,强制代码生成器重新编译顶层模型。有关详细信息,请参阅Control Regeneration of Top Model Code

非内联 S-Function 的参数类型限制

非内联 S-Function 的参数只能是以下类型:

  • 双精度

  • 标量、向量或二维矩阵中的字符

要想更灵活地选择提供给 S-Function 或 S-Function 中的运算的参数类型,请内联 S-Function 并考虑使用 mdlRTW S-Function 例程。

不支持使用 MATLAB matrix.h API 或其他 MATLAB API(如 mex.hmat.h)中的其他函数。如果您从 S-Function 源文件中调用不支持的 API,将会发生编译器错误。有关支持的 MATLAB API 函数的详细信息,请参阅文件 matlabroot/rtw/c/src/rt_matrx.hmatlabroot/rtw/c/src/rt_matrx.c

如果您对空矩阵使用 mxGetPr,该函数不会返回 NULL。它会返回一个随机值。因此,您必须使用 mxIsEmpty 保护对 mxGetPr 的调用。

相关主题