【问题标题】:control simulink from M-file从 M 文件控制 simulink
【发布时间】:2013-03-05 16:41:10
【问题描述】:

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

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

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

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

非常感谢。

【问题讨论】:

    标签: simulink matlab


    【解决方案1】:

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

    get_param('simulink_model_name', 'SimulationTime');
    

    例如,在模拟过程中通过使用

    从您的 M 文件中检查此值
    timer(...)
    

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

    【讨论】:

      【解决方案2】:

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

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

      1. set_param(bdroot,'SimulationCommand','pause');
      2. 运行('myscript.m'); %插入脚本名称
      3. set_param(bdroot,'SimulationCommand','continue');

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

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

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

      让我知道它是否有效。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 看我的回答,这是不可能的。前段时间我为自己实现了这个,以显示一个等待栏,显示 simulink 模拟的进度。
        • @Johann3s,确实可以检测到 Matlab 会话何时达到 0.6s 的仿真时间,现在要更改模型在仿真过程中使用的变量的值,如问题所示,更多困难,我相信,目前在 M 脚本中是不可能的。
        • 我认为这也可以通过在模拟期间从您的 m 文件发出命令来实现。显然你需要关闭内联参数,但我不明白为什么这不起作用?
        • @Johann3s,我同意这是有道理的,但是当模型处于模拟或编译模式时,工作区被“锁定”,因此任何更改或尝试更改工作区中的变量都不会出现在模型中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        相关资源
        最近更新 更多