Simulink之S-function函数笔记之三(sfuntmpl_doc.c)

本文是关于Simulink中S-function的深入学习笔记,聚焦于sfuntmpl_doc.c文件。内容包括mdlInitializeSizes初始化数组大小、mdlInitializeSampleTimes设置采样时间和函数调用、端口复杂属性检查、工作宽度设置、模拟状态管理和模型循环中的mdlOutputs及mdlTerminate。同时提及了不适用于RTW的参数处理方法和配置执行方法。
摘要由CSDN通过智能技术生成

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)
{
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值