Simulink:同步和定时

3
为了模拟一些过程,我遇到了一个问题,即如何获得自行建模块的预定义工作顺序。我该如何确保例如A块必须在B和C块开始工作之前完成?
问题在于有些块应该在其他块之后工作,而有些则不应该。我必须承认,在处理时间相关事物方面,我对Simulink没有太多经验(尽管有基本的Simulink知识)。
例如,应该实现这种情况:
A -> B, C -> D, E, F

重点是,所有的A-F模块之间没有逻辑关联,它们都做了几件事。我的目标是在A完成后使B和C开始工作。在B和C完成后,D/E/F再开始工作。 在这种情况下,“parallel”一词是错误的,这并不一定要真正地并行计算。只需确保它符合预定义的稳定顺序即可。
编辑: 我的新想法是使用Matlab工作区作为缓冲区,所以我的A块可以通过“to workspace”块将其结果推送到工作区。但现在我必须确保B和C块可以在A将其信息推送到工作区后读取其结果(使用“From workspace”)...如何做到这一点?

编辑2: 这里有一张截图,可以让一些人更清楚地理解: 根据“排序顺序”的文档,设置似乎是正确的(包括子系统的时间)。但不幸的是问题仍然存在。变量“simin”在被写入之前就从工作区加载了 :( 如您所见,显示器显示“1”,而它不应该这样做。在模拟的第一次运行中,我会收到一个异常,即变量“simin”不存在。

如果您能帮助我解决问题,那将非常好。

问候,poeschlorn

3个回答

1
如果块之间的连接不足以设置顺序,您可以使用block priorities
测试执行顺序的一个提示是添加一个“嵌入式Matlab块”,其中包含一个显示块名称的disp命令。

你指的是我的回答的哪一部分? - Clement J.
http://mathworks.com/help/toolbox/simulink/ug/f13-88939.html#f13-82250 表示无法使用优先级使其正常工作...是否有解决方法? - poeschlorn
1
关于您的编辑2,问题仍然存在。"从工作区"仅在仿真开始时进行评估(因此第一次变量未定义时出现问题),而"To workspace"则在结束时进行评估。在第二次仿真期间,您将第一次仿真的结果发送到显示器中(以此类推)。 - Clement J.
你应该尝试使用“选择器”(在信号路由中)。按照你想要的方式设置配置m文件中的向量元素(但不能在仿真过程中更改)。 (如果它能够正常工作,那么接受我的答案会很好) - Clement J.
如果我不能在模拟过程中进行修改,那么对于我的需求来说它就没有实际用途...我有另一个想法,但我也不知道如何实现...当我说每个块我都想读入/做某些事情/写入工作空间时,我可以拥有几个从/到工作空间的块,因为每个块都是自己初始化的...但如何以一种方式启动多个模拟,以便它们相互作用而不重叠?在这种情况下,工作空间可以充当共同的数据源/汇...对此有何看法? - poeschlorn
显示剩余5条评论

1

所以在你的例子中,如果Block A与B和C都连接了同一根电线,当Block A完成时,Block B和C将并行工作。

编辑: 我正在使用与您相同的块,但它对我有效。我认为您正在过度复杂化事情。您设置块优先级的方式与Simulink在没有它们的情况下运行块的方式没有区别。下面您可以看到我的设置以及两个二进制显示器上的输出。

enter image description here

首次运行时出现的错误是由于Simulink在执行第一时间步之前不创建变量。当Simulink构建模拟时,它发现从工作区输入的变量未被创建。


2
将运行块A,然后其输出将作为B和C的输入。因此,块A的结果可以用于B和C的计算。 - akd
好的,那很有道理。现在是否可以将结果存储在工作区中,然后在同一步骤中读取它以进行进一步的计算?在我的模拟开始时,还不清楚哪个块获得哪个输入。因此,我必须使用工作区作为“缓冲区”。 - poeschlorn
1
"ToWorkspace" 变量只在仿真结束时更新。您可以使用“信号路由”中的 Goto/From 标签来实现。它并不是真正的“存储”,只是一种连接。 - Clement J.
1
你不必在每个地方都指定优先级,只有在想要强制执行时才需要。标签的优先级总是计算得很好。你似乎过于按照传统(文本)语言的思维方式思考了。让Simulink自己做它的工作吧,通常它能正常工作。 - Clement J.
1
“To”和“From Workspace”块旨在用作来自工作区的输入和输出到工作区。在您的示例中,它们都使用相同的变量,因此从工作区读取的值将始终滞后一个时间步长,因为输出直到模拟完成后才保存。 - akd
显示剩余3条评论

0

你的问题不是很清楚。当你说Block A必须完成时,是指Output函数吗?在Simulink中模拟的方式是块按顺序运行,因此只有在Block A完成其Output函数后,Block B和C才会运行。

我不知道目前在Simulink中有任何明显的并行运行块B和C的方法。


1
嗨,我稍微修改了我的问题,希望现在更清晰明了。 - poeschlorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接