文档

处理s - function中的错误

关于错误处理

在使用s函数时,正确处理意外事件(如无效参数值)非常重要。

如果您的C MEX s -函数具有需要验证其内容的参数,请使用以下技术报告错误。

ssSetErrorStatus(S,“由于……而遇到的错误”);返回;

在大多数情况下,Simulink金宝app®引擎在诊断查看器中显示错误。中遇到的错误mdlCheckParameters随着s函数参数被输入到块对话框中,引擎打开如下所示的错误对话框。在这两种情况下,引擎都会显示错误消息以及调用错误的s函数和相关s函数块的名称。

第二个论点是ssSetErrorStatus必须是持久的记忆。它不能是函数中的局部变量。例如,以下操作会导致不可预测的错误。

mdlOutputs() {char msg[256];/* ILLEGAL:应该是"static char */ /*msg[256];"*/ sprintf(msg,"由于%s",字符串);ssSetErrorStatus(年代,味精);返回;}

因为ssSetErrorStatus不产生异常,使用它报告错误在你的s函数是更可取的使用mexErrMsgTxt.的mexErrMsgTxt函数使用异常处理来终止s函数的执行。为了支金宝app持s函数中的异常处理,Simulink引擎必须在每次s函数调用之前设置异常处理程序。金宝app这给模拟带来了开销。

无异常代码

您可以通过确保您的C MEX s -函数包含全部无异常代码。无异常代码是指从不长跳的代码。如果你的s函数包含任何在被调用时具有跳远潜能的例程,那么它就不是没有异常的。例如,mexErrMsgTxt在调用时抛出异常(即长跳),从而结束s函数的执行。使用mxCalloc会在内存分配错误的事件中导致不可预知的结果,因为mxCalloc跳远。如果需要分配内存,请使用stdlib.hcalloc直接例程并执行自己的错误处理。

如果你不打电话mexErrMsgTxt或其他导致异常的API例程,请使用SS_OPTION_EXCEPTION_FREE_CODE功能选项。的命令中发出以下命令来完成此操作mdlInitializeSizes函数。

ssSetOptions(年代,SS_OPTION_EXCEPTION_FREE_CODE);

设置此选项可通过允许Simulink引擎绕过通常在每次s函数调用之前执行的异常处理设置来提高s函数的性能。金宝app在使用时,必须非常小心地验证代码是否没有异常SS_OPTION_EXCEPTION_FREE_CODE.如果s -函数在设置此选项时产生异常,则会发生不可预知的结果。

所有墨西哥人*常规动作有跳远的潜力。几个mx *常规动作也有跳远的潜力。为了避免任何困难,只使用检索指针或确定参数大小的API例程。例如,以下API例程从不抛出异常:mxGetPrmxGetDatamxGetNumberOfDimensionsmxGetMmxGetN,mxGetNumberOfElements

代码运行时例程也可以抛出异常。运行时例程是指引擎在模拟循环期间调用的某些s函数例程金宝appSimulink引擎与C - S-Functions的交互).运行时例程包括

  • mdlGetTimeOfNextVarHit

  • mdlOutputs

  • mdlUpdate

  • mdlDerivatives

如果你的s函数中的所有运行时例程都是无异常的,你可以使用这个选项:

ssSetOptions(年代,SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);

s函数中的其他例程不一定是无异常的。

ssSetErrorStatus终止标准

如果您的一个C MEX s -函数回调方法调用ssSetErrorStatus在模拟过程中,Simulink引擎发布错误,并在回金宝app调方法返回时立即终止模拟。如果你的s函数SS_OPTION_CALL_TERMINATE_ON_EXIT选项已启用(请参见ssSetOptions),引擎调用你的s函数mdlTerminate方法作为终止过程的一部分。否则,引擎将调用s函数mdlTerminate方法,如果至少有一个块mdlStart方法在模拟过程中执行无误。

检查数组边界

如果您的C MEX s -函数导致了其他无法解释的错误,原因可能是s -函数写的内容超出了内存中指定的区域。您可以通过启用数组边界检查功能来验证这种可能性。该特性检测S-Function块对分配给它的以下类型的块数据进行写操作的任何尝试:

  • 功向量(R, I, P, D,和模)

  • 状态(连续和离散)

  • 输出

若要启用数组边界检查,请选择警告错误超出数组边界选项列表上的配置参数对话框。或者,在MATLAB中输入以下命令®命令提示符。

set_param (modelName“ArrayBoundsChecking”,ValueStr

在哪里modelName是Simulink模型的名称和金宝appValueStr要么是“没有”“警告”,或“错误”

另请参阅

|

相关的话题