3

我正在尝试从 M 文件控制 simulink。我想在 M 文件中做的是给 simulink 模型一些输入,运行 simulink 模型,在 0.6 秒处更改一个输入值,继续使用新输入运行 simulink 模型。

我已经知道通过使用set_param,我可以启动、暂停和继续simulink,但问题是我不知道如何在某个时间(0.6s)暂停simulink模型,是否可以获得当前时间从 simulink 模型并在 M 文件中读取它?

我已经知道的另一种方法是使用 sim 从 0 到 0.6s 运行 simulink 模型,并使用 SimState 将信息保存在 0.6s,然后加载这些信息以恢复仿真。我试图在模拟恢复之前更改输入,但似乎模型将从它保存的信息中加载输入值,它不会采用新的输入值。

我在这个问题上卡了很长时间,有人可以帮我解决这个问题吗?

非常感谢。

4

3 回答 3

2

您可以通过以下方式获取正在运行的模拟的当前时间:

get_param('simulink_model_name', 'SimulationTime');

因此,例如,通过在模拟期间使用 M 文件检查此值

timer(...)

您可以检测到模拟何时为 0.6 秒。

于 2013-03-23T10:42:40.337 回答
2

我使用了 simulink 和 m-script 的组合来实现类似的目标。

在您的模型中,添加一个“断言”块。双击它,然后取消选中“断言失败时停止模拟”。在“断言失败时的模拟回调”字段中,添加三个命令:

  1. set_param(bdroot,'模拟命令','暂停');
  2. 运行('myscript.m');%插入脚本名称
  3. set_param(bdroot,'模拟命令','继续');

现在将此块的输入连接到“不等于”关系运算符。将关系运算符的第一个输入端口连接到时钟(请设置模拟时钟的抽取或数字时钟的采样时间 [通常为 -1 表示继承])。第二个输入端口连接到值为 0.6 的常量块

在模拟模型时,模拟将在 0.6 秒处暂停,执行 m 文件以更改输入参数(考虑到它是可调的),然后继续模拟。

断言块在其输入信号变为 0 时被调用。在 0.6 秒时,关系运算符的输出将为 0。

让我知道它是否有效。

于 2016-07-13T09:54:48.183 回答
1

目前,这在 M 文件中是不可能的。如果要在给定时间从外部动态更改输入,则需要 S-Function。即使是这个解决方案也很困难,而且很容易出错,因为 Mathworks 不想支持这个功能,因为它破坏了他们出售的另一个工具箱的一个功能。随着时间的推移,我相信他们会授予这种特权,但它今天不存在。此外,为什么不使用动态输入块来更改输入值,例如地图、信号生成器等?

于 2013-03-06T19:43:37.467 回答