处理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.h
calloc
直接例程并执行自己的错误处理。
如果你不打电话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例程从不抛出异常:mxGetPr
,mxGetData
,mxGetNumberOfDimensions
,mxGetM
,mxGetN
,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
要么是“没有”
,“警告”
,或“错误”
.
另请参阅
mdlInitializeSizes
|ssSetErrorStatus