代码之家  ›  专栏  ›  技术社区  ›  Bianca

从Python逐步执行Simulink模型

  •  3
  • Bianca  · 技术社区  · 8 年前

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

    谢谢


    编辑:我就是这样设法解决的

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

    Simulation stepper in simulink

    其中,Tmp是每个暂停的时间戳

    Tmp=get_param(bdroot,'SimulationTime')
    

    断言块包含以下说明:

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

    这样,模拟会在每一步之后暂停,即(时钟时间Tmp)=时间步。

    现在,我创建了一个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 回复  |  直到 7 年前
        1
  •  3
  •   WoodyDev    8 年前

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


    我希望这能帮助你完成你的任务!