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
)。
提前谢谢。
- 利玛
答案 0 :(得分:0)
简而言之,是的。
可以在mdlGetTimeOfNextVarHit()
方法之外设置可变速率任务的下一个命中时间。仅在当前仿真循环结束之前设置下一个采样时刻:因此可以在mdlOutputs()
或mdlUpdate()
方法中进行设置。
请记住,配置为使用可变时间步长任务的C-MEX S功能仍然需要:
MDL_GET_TIME_OF_NEXT_VAR_HIT
,并且mdlGetTimeOfNextVarHit()
的实现/定义。这意味着,如果您希望将新的采样时刻设置为其他位置,则mdlGetTimeOfNextVarHit()
仍需要一个(可能为空)定义。
Gotcha:
如果未为配置为使用可变时间步长任务的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()
,则编译将失败。