gpt4 book ai didi

python - 从 Python 逐步执行 Simulink 模型

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:28 30 4
gpt4 key购买 nike

我需要从用 Python 编写的外部应用程序控制 Simulink 控制方案。我需要做的是逐步完成模拟,并在每一步中检索输出并让 Python 应用程序确定新的输入集。这是一个固定的时间段。有什么办法可以做到这一点?我承认我很难尝试使用 matlab 脚本来实现这一点,更不用说 Python 了。这可行吗?如果没有,有没有办法将Python模块插入到simulink方案中?

谢谢


编辑:这就是我设法解决它的方式

为了逐步运行模拟,我创建了这个带有时钟、关系运算符和断言 block 的 block 结构

Simulation stepper in simulink

其中Tmp是每次暂停的时间戳

Tmp=get_param(bdroot,'SimulationTime')

断言 block 包含以下指令:

set_param(bdroot,'SimulationCommand','pause')

这样,模拟在每个步骤后暂停,即 (clockTime-Tmp)=timeStep。

现在,我创建了一个 Python 脚本来启动模拟(参见接受的答案)并像这样迭代:

#While the simulation is running
while eng.get_param('simpleTest','SimulationStatus')!=('stopped' or 'terminating'):
if eng.get_param('simpleTest','SimulationStatus')=='paused':
#do your evaluations and operations
eng.set_param('simpleTest','SimulationCommand','update',nargout=0) #if you have updated any simulation parameters
eng.set_param('simpleTest','SimulationCommand','continue',nargout=0)

这对我来说似乎工作正常,但如果有更好的选择,请告诉我。

最佳答案

使用 matlab.engine bindings in Python您可以启动 MATLAB 引擎实例并将单独的命令作为字符串发送到 MATLAB(如果您尚未使用它)。这种技术可以让您输入字符串,就好像您在 MATLAB 命令行中输入它们一样。例如:

 >>>import matlab.engine # load engine functionality
>>>eng = matlab.engine.start_matlab() # init instance of engine
>>>eng.sim("simulinkModelName") # start a simulink model by calling it through the engine instance

这也让你 pass data to MATLAB from Python ,根据文档。根据您所说,这应该足以实现您的要求。


但是,我想到了另一种方法,即使用 TCP/IP 连接在两个进程之间进行通信(Python GUI 到 Simulink)。这将使您可以将消息从一个程序发送到下一个程序,然后您可以相应地解析它们。 (Simulink、Matlab 和 Python 都有 TCP/IP 选项!)

在这个想法中,我会让 GUI 充当服务器并在后台异步线程中监听/向客户端 (simulink) 发送消息。例如,您可以发送一个命令来开始模拟,然后在某个点停止并等待从 Python 接收数据。

这可能需要对线程处理有更复杂的理解,我建议查找 threading in Python ,以及 using sockets in Python .

如果您确实想转而使用另一种语言进行 GUI 开发,则 TCP/IP 命令对于 future 的实现也将是相同的。


我希望这可以帮助您完成任务!

关于python - 从 Python 逐步执行 Simulink 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48864281/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com