编写非内联 S-Function
非内联 S-Function 是 C 或 C++ MEX S-Function,Simulink® 引擎和生成的代码以相同的方式处理这种函数。您只需根据 S-Function API 实现一次算法即可。Simulink 引擎和生成的代码将在模型执行过程中调用 S-Function 例程(例如 mdlOutputs
)。
非内联 S-Function 的特点是您的 S-Function 缺少
文件。文件名根据您的平台而有所不同。例如,在 64 位 Microsoft® Windows® 系统上,该文件名为 sfunction
.tlc
。在 MATLAB® 命令行窗口中键入 sfunction
.mexw64
mexext
可查看系统使用的扩展名。
编写非内联 S-Function 的规范
MEX 文件不能调用 MATLAB 函数。
如果 MEX 文件使用 MATLAB 外部接口库中的函数,请包括头文件
cg_sfun.h
而不是mex.h
或simulink.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 名称必须与 S-Function 的文件名完全一致。s-function_name
尽量使用
real_T
和int_T
数据类型,而不要使用double
和int
。数据类型real_T
和int_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.h
和 mat.h
)中的其他函数。如果您从 S-Function 源文件中调用不支持的 API,将会发生编译器错误。有关支持的 MATLAB API 函数的详细信息,请参阅文件
和 matlabroot
/rtw/c/src/rt_matrx.h
。 matlabroot
/rtw/c/src/rt_matrx.c
如果您对空矩阵使用 mxGetPr
,该函数不会返回 NULL
。它会返回一个随机值。因此,您必须使用 mxIsEmpty
保护对 mxGetPr
的调用。