我需要从外部应用程序控制Simulink控制方案,用Python编写。我需要做的是逐步完成模拟,并在每一步检索输出,让Python应用程序确定新的输入集。这是固定的时间段。 有没有办法做到这一点?我承认我很难用matlab脚本来实现这个目标,更不用说Python了。 这可行吗?如果没有,有没有办法将Python模块插入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)
这似乎对我有用,但如果有更好的选择,请告诉我。
答案 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命令对于将来的实现也将是相同的。
我希望这可以帮助您完成任务!