从Python

时间:2018-02-19 10:39:12

标签: python matlab interface simulink

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

由于

编辑:这就是我如何解决这个问题

为了逐步运行模拟,我用时钟,关系运算符和断言块创建了这个块结构

Simulation stepper in simulink

其中Tmp是每次暂停的时间戳。断言块包含以下指令:

Tmp=get_param(bdroot,'SimulationTime'),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)

这似乎对我有用,但如果有更好的选择,请告诉我。

1 个答案:

答案 0 :(得分:1)

使用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命令对于将来的实现也将是相同的。

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