s-function学习之sfuntmpl_doc.c
本文章用来做simulink的S-function函数的学习笔记:
#define S_FUNCTION_NAME your_sfunction_name_here
#define S_FUNCTION_LEVEL 2
// simstruc.h包含tmwtypes.h(general types)、mex.h、matrix.h
#include "simstruc.h"
//异常处理:
// ssSetErrorStatus(S, "error encountered due to ...");
// return;
// ssSetErrorStatus的处理方法建议使用mexErrMsgTxt,mexErrMsgTxt立即终止s-function的执行和返回。如果不使用mexRrrMsgTxt或任何其他引起异常的方式,则应该使用SS_OPTION_EXCEPTION_FREE_CODE。
// ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
//设置此选项会允许simulink绕过异常处理的设置。但当使用这个选项时,必须格外小心验证代码是无异常的。如果s函数生成异常的时候该选项开启,将出现不可预测的结果。
// 在内存分配的问题上使用mxCalloc可能会照成不可预知的问题,如果必须使用内存分配,建议直接使用stdlib.h分配
//以下不会抛出异常:mxGetPr, mxGetData, mxGetNumberOfDimensions, mxGetM, mxGetN, mxGetNumberOfElements.
//如果你所有使用的方法都不会抛出异常,则可以使用:
// ssSerOptions(S, SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);
// 警告 & Printf's
// 输出警告: ssWarning(S, msg), 当s-function编译之后,ssWarning等同于mexWarnMsgTxt。
//Printf's: ssPrintf(fmt, ...), 当s-function编译之后,ssPrintf等同于mexPrintf。
//你可以通过这种方法来实现标准I/O:
#if defined(SS_STDIO_AVAILABLE)
if ((fp=fopen(file, "w")) == NULl){
ssSetErrorStatus(S, "open failed");
return ;
}
...
#endif
//s-function methods:
注意: 以下许多方法只适用于level 2 C-MEX S-function
**表示该函数必须存在 , []表示该函数可供选择。
Model Initialization in Simulink:
**mdlInitializeSizes: 初始化Simstruct数组大小
**mdlInitializeSampleTimes: 初始化采样时间和可选择的函数调用连接
[mdlInputPortComplexSignal]/[mdlOutputPortComplexSignal]: 检查并设置输入/输出端口复杂属性(COMPLEX_YES,C OMPLEX_NO)。
[mdlSetWorkWidths]: 设置状态,iwork,rwork,pwork,dwork etc.
[mdlSetSimState]: 当初始化模拟状态时,s-function将ssSetSimStateCompliance 设置为 UES_CUSTOM_SIM_STATE,并把完整的模拟状态加载到此模块中。see also mdlGetSimState。
Model simulation loop in simulink:
**mdlOutputs: 更新输出信号。
**mdlTerminate: 终止模型管理,如释放内存等。
参数处理方法(这些方法不适用于RTW):
#define MDL_CHECK_PARAMETERS //#undef则去除函数方法
#if defined(MDL_CHECK_PARAMETERS) && defined(MATLAB_MEX_FILE)
//mdlCheckParameters: 这个函数应该在mdlInitalizeSizes后被调用。如果你想使用ssSetNumSFcnParams(S, n):
#if defined(MATLAB_MEX_FILE)
if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {
mdlCheckParamters(S);
if (ssGetErrorStatus(S) != NULL) return;
}
else{
return;//simulink will report a parameter mismatch error
}
#endif
详例见 Matlabbroot/simulink/src/sfun_errhdl.c
static void mdlCheckParameters(SimStruct *S)
{
}
#endif //MDL_CHECK_PARAMETERS
#define MDL_PROCESS_PARAMETERS
#if defined(MDL_PROCESS_PARAMETERS) && defined(MATLAB_MEX_FILE)
//mdlProcessParameters: 这个函数将在mdlCheckParameters之后被调用,处理新更新的参数。
static void mdlProcessParameters(SimStruct *S)
{
}