在mdlGetTimeOfNextVarHit方法之外使用ssSetTNext S函数宏

时间:2014-01-10 15:09:00

标签: matlab simulink s-function

The Simulink documentation for ssSetTNext说: “具有可变采样时间的离散S函数应该在mdlGetTimeOfNextVarHit中使用此宏来指定下一个样本命中的时间”。

现在,我想在mdlOutputs执行之后计算S函数的下一个样本命中。但是,根据Simulink Engine Interaction with C S-FunctionsmdlGetTimeOfNextVarHit mdlOutputs之前执行(请参阅描述模拟循环的图片)。

另一方面,mdlUpdate的文档(不幸的是,我不允许发布链接)说: “该方法还可以执行S函数在每个主要时间步骤需要执行的任何其他任务”。

由于mdlUpdate mdlOutputs之后执行,我想知道忽略方法mdlGetTimeOfNextVarHit是否安全,并将所有逻辑定义为下一个样本命中(并在ssSetTNext内使用mdlUpdate)。

提前谢谢。

- 利玛

1 个答案:

答案 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(),则编译将失败。