The Simulink documentation for ssSetTNext
说:“具有可变采样时间的离散S函数应该在mdlGetTimeOfNextVarHit
中使用此宏来指定下一次采样命中的时间”。
现在,我想在执行mdlOutputs
之后计算S函数的下一个样本命中。然而,根据Simulink Engine Interaction with C S-Functions,mdlGetTimeOfNextVarHit
在mdlOutputs
之前执行(参见描述模拟循环的图片)。
另一方面,mdlUpdate
的文档(遗憾的是,我不允许发布链接)说:“该方法还可以执行S函数在每个主要时间步骤需要执行的任何其他任务”。
由于mdlUpdate
是在mdlOutputs
之后执行的,我想知道忽略方法mdlGetTimeOfNextVarHit
是否安全,并将所有逻辑定义为ssSetTNext
中的下一个样本命中(并且还使用mdlUpdate
)。
先感谢您。
--Matteo
简而言之,是的。
可以在mdlGetTimeOfNextVarHit()
方法之外设置变量任务的下一个命中时间。下一个样本瞬间必须在当前模拟循环结束之前设置:因此可以在mdlOutputs()
或mdlUpdate()
方法中设置它。
请记住,配置为使用可变时间步长任务的C-MEX S功能仍需要:
MDL_GET_TIME_OF_NEXT_VAR_HIT
被定义,和mdlGetTimeOfNextVarHit()
的实现/定义。这意味着如果您希望在其他位置设置新样本,则仍需要mdlGetTimeOfNextVarHit()
的(可能为空)定义。
疑难杂症的:
如果没有为配置为使用变量时间步长任务的C-MEX S函数定义MDL_GET_TIME_OF_NEXT_VAR_HIT
,则没有mdlGetTimeOfNextVarHit()
的定义;编译将成功,但在调用时将报告以下错误诊断,并且模拟将终止:
要获得可变的采样时间,请定义MDL_GET_TIME_OF_NEXT_VAR_HIT并添加mdlGetTimeOfNextVarHit例程。
最后,如果没有定义MDL_GET_TIME_OF_NEXT_VAR_HIT
但是有mdlGetTimeOfNextVarHit()
的定义,则编译将失败。