在S-Functions处理错误
关于处理错误
在处理S-functions时,重要的是要正确处理意想不到的事件,如无效的参数值。
如果你的C墨西哥人s函数参数的内容你需要验证,使用以下技术来报告错误。
ssSetErrorStatus
(年代,“由于遇到错误…”);返回;
在大多数情况下,仿真软件金宝app®发动机诊断查看器中显示错误。如果遇到错误mdlCheckParameters
作为函数参数输入到块对话框,打开引擎错误对话框所示。在这两种情况下,发动机显示错误消息以及s函数的名称和相关联的功能块调用错误。
第二个参数ssSetErrorStatus
必须是持久的记忆。它不能被你的函数的局部变量。例如,下面的原因不可预知的错误。
mdlOutputs () {char味精[256];/ *非法:应该是“静态char * / / *味精[256];”* / sprintf(味精,“错误由于% s,字符串);ssSetErrorStatus(年代,味精);返回;}
因为ssSetErrorStatus
不产生异常,在函数中使用它来报告错误比使用吗mexErrMsgTxt
。的mexErrMsgTxt
函数使用异常处理终止功能执行。在S-金宝appfunctions支持异常处理,仿真软件引擎必须在每个函数调用之前设置异常处理程序。金宝app这向仿真引入了开销。
除了免费代码
你可以避免模拟开销,确保C墨西哥人功能完全包含除了免费的代码。异常自由指的是代码不会跳远。你的免费功能也不例外,如果它包含任何常规,当,跳远的潜力。例如,mexErrMsgTxt
抛出一个异常(即。,long-jumps) when called, thus ending execution of your S-function. UsingmxCalloc
可能会导致不可预知的结果在发生内存分配错误,因为mxCalloc
跳远。如果需要内存分配,使用stdlib.h
calloc
常规的直接和执行自己的错误处理。
如果你不打电话mexErrMsgTxt
或其他API程序导致异常,使用SS_OPTION_EXCEPTION_FREE_CODE
功能选项。这可以通过发出以下命令mdlInitializeSizes
函数。
ssSetOptions(年代,SS_OPTION_EXCEPTION_FREE_CODE);
设置这个选项增加功能,允许的性能仿真软件引擎绕过异常处理设置,通常每个函数调用之前进行。金宝app你必须照顾极端来验证你的代码是自由当使用异常SS_OPTION_EXCEPTION_FREE_CODE
。如果你的s函数生成一个异常时,此选项设置,出现不可预知的结果。
所有墨西哥人*
例程有跳远运动的潜力。几个mx *
例程也有跳远运动的潜力。为了避免任何困难,只使用API的例程,检索一个指针或确定参数的大小。例如,下面的API程序不会抛出异常:mxGetPr
,mxGetData
,mxGetNumberOfDimensions
,mxGetM
,mxGetN
,mxGetNumberOfElements
。
代码运行时例程也可以抛出异常。运行时例程是指某些功能的例程,在模拟循环(见引擎调用金宝app仿真软件与C S-Functions引擎交互)。运行时例程包括
mdlGetTimeOfNextVarHit
mdlOutputs
mdlUpdate
mdlDerivatives
如果你的s函数内的所有运行时例程异常免费的,你可以使用这个选项:
ssSetOptions(年代,SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);
中的其他例程函数不需要异常自由。
ssSetErrorStatus终止条件
如果你的一个C墨西哥人s函数回调方法调用ssSetErrorStatus
在仿真中,仿真软件引擎帖子错误并终止仿真一旦回调方金宝app法返回。如果你的功能SS_OPTION_CALL_TERMINATE_ON_EXIT
启用选项(见ssSetOptions
),引擎调用你的函数mdlTerminate
方法作为终止过程的一部分。否则,引擎调用你的函数mdlTerminate
方法只有在至少有一块mdlStart
在模拟方法执行没有错误。
检查数组边界
如果你的C墨西哥人s函数导致其他令人费解的错误,原因可能是其指定区域以外的功能写在内存中。您可以验证这种可能性通过支持数组边界检查功能。这个特性检测到任何一个功能块试图写以外的地区分配给以下类型的块数据:
向量(R, I, P、D和模式)
州(连续和离散)
输出
使数组边界检查,选择警告
或错误
从数组边界超过的选项列表配置参数对话框。另外,在MATLAB输入以下命令®命令提示符。
set_param (modelName“ArrayBoundsChecking”,ValueStr)
在哪里modelName
仿真软件模型和名称吗金宝appValueStr
要么是“没有”
,“警告”
,或“错误”
。
另请参阅
mdlInitializeSizes
|ssSetErrorStatus