【问题标题】:Creating delay with a while loop in Matlab在 Matlab 中使用 while 循环创建延迟
【发布时间】:2016-05-06 17:25:10
【问题描述】:

作为一名学生,我目前正在从事 Matlab Simulink 项目。我对使用 Matlab/Simulink 很陌生(几周)。

我想实现并运行一个 Matlab “.m” 文件,我可以使用它打开 Simulink 并开始仿真。目的是进行 24 小时测试,将称重传感器切成 1 小时“块”,并每小时将数据保存到 Excel 文件的不同工作表中。所以我的模拟运行了 1 小时,停止并重新开始,依此类推。通过 Matlab 和“for”循环,我做了 24 次测量。 在测量步骤之间,我必须等待 simulink 完成测量并保存文件,以便 Simulink 窗口能够被close_system('Thesis_SerDatTransm_Simulink') 关闭。

所以我尝试使用 while 循环来实现延迟,并检查我得到的度量是否适合大小大于 449 的数组(我测量 449 个值):

for k=0:1:24
    % Load Simulink
    load_system('Thesis_SerDatTransm_Simulink.slx')

    % Open Simulink
    open_system('Thesis_SerDatTransm_Simulink.slx')  

    % Start Simulation
    set_param('Thesis_SerDatTransm_Simulink', 'SimulationCommand', 'Start');

    % Save Data
    my_cell = sprintf('A%d',k);
    xlswrite('file.xlsx',y,my_cell)

    % Wait for Simulation
    while 1
        test=size(y)>=449;
       if (test)
         close_system('Thesis_SerDatTransm_Simulink')
         break
       end
    end
end

现在的问题是,该程序卡在 while 循环中。 Simulink 已启动,但未进行仿真或数据收集。 所以我想知道是否有人可以检查我的 While 循环是否有问题,因为程序的其余部分在没有循环的情况下一切正常(但收到一条错误消息,在模拟期间,Simulink 窗口无法关闭)。 我知道有一种方法可以在 matlab 中使用waitfor创建延迟并创建另一个我可以调用的function,但我还不知道该怎么做。

谢谢

问候

hohmchri

【问题讨论】:

  • 您的问题提到了449 值...但您的代码正在测试499 值...哪个是正确的?
  • 您只需加载和关闭系统一次。另外,如果您已经使用了 load_system,我认为您不需要使用 open_system。所以我认为你不需要在这里完成什么,因为 close_system 函数实际上可能在 For 循环之外。
  • @gariepy,是的,我的错。有一个错字。我将其更改为 449,这是我要检查的正确值的数量。我明天再做一次测试。我希望它会起作用。谢谢!
  • @m_power 感谢您的回复。我明天试试这个。如前所述,我对使用 Matlab 和一般编程很陌生。再次感谢!

标签: matlab delay simulink


【解决方案1】:

执行此操作的正确方法是使用sim 函数来运行您的模型(而不是您拥有的load_systemopen_systemset_param 的序列)。

sim 将阻止 m 代码的执行,直到模型完成执行。数据既可以返回到工作区(当不使用输出参数时),也可以作为调用sim 的输出返回。 (然后您就可以像以前那样将其写入 Excel。)

不使用sim 的唯一原因可能是使用您拥有的命令,如果模型需要很长时间来初始化,并且您不想在每次循环中打开和关闭它。但是,即使在这种情况下,您的代码也不正确。 load_system 将在循环之外; open_system 不是必需的;在您的while 循环中,您将轮询 模型的SimulationStatus 属性以查看它是否仍在运行(不是y 变量的大小);并且 close_system 将在循环之后(如其中一个 cmets 中的 @m_power 所示)。

【讨论】:

  • 这很完美!谢谢!最后我使用了sim。这样我也避免用我并不真正需要的行来填充代码。
【解决方案2】:

您应该使用 matlab pause 命令。这会使您的执行停止 X 秒。

您还应该将代码优化为 m_power 状态

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2018-04-05
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2014-05-28
    • 2016-04-13
    相关资源
    最近更新 更多