You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python控制Simulink模型时输出变量返回None的解决方法

问题解决:Python控制Simulink仿真无法获取输出值

问题背景

使用Python通过matlab.engine控制Simulink模型ToyExample_V2,设置常量块输入为1,仿真时长10秒、步长0.1,但调用getOutput后返回的outputSim和timeT均为None。

问题原因

  1. 未生成有效仿真输出变量:原代码未通过Simulink仿真函数生成包含结果的out变量,直接访问out.simout会因变量不存在返回空值。
  2. 仿真控制逻辑不可靠:采用start-pause-continue的循环方式无法确保仿真完整执行,也不会自动将输出写入工作区。
  3. 变量访问方式错误:使用eng.eval("out.simout", nargout=0)时,nargout=0会抑制返回值,导致无法获取结果。

修复后的代码

import matlab.engine

class SimulinkPlant:
    def __init__(self, modelName='ToyExample_V2'):
        self.modelName = modelName
        self.eng = None
    
    def setControlAction(self, Input):
        # 设置Simulink常量块的值
        self.eng.set_param(f'{self.modelName}/Input', 'value', str(Input), nargout=0)
    
    def connectToMatlab(self):
        print("启动Matlab")
        self.eng = matlab.engine.start_matlab()
        print("已连接Matlab")
        
        # 加载模型
        self.eng.eval(f"model = '{self.modelName}'", nargout=0)
        self.eng.load_system(self.modelName, nargout=0)
        
        # 设置输入值为1
        self.setControlAction(1)
        print("模型初始化完成")
        
        # 设置仿真参数
        self.eng.set_param(self.modelName, 'StopTime', '10', nargout=0)
        self.eng.set_param(self.modelName, 'FixedStep', '0.1', nargout=0)
    
    def simulate(self):
        # 调用sim函数执行仿真,结果保存到工作区的out变量
        self.eng.eval("out = sim(model);", nargout=0)
        print("仿真执行完成")
    
    def getOutput(self):
        # 从Matlab工作区获取out变量
        out = self.eng.workspace['out']
        # 提取输出和时间数据(需与Simulink中To Workspace模块的变量名对应)
        simout_S = out['simout']
        tout_T = out['tout']
        # 转换为Python可直接使用的列表
        return list(simout_S), list(tout_T)
    
    def disconnect(self):
        # 关闭模型并退出Matlab
        self.eng.close_system(self.modelName, nargout=0)
        self.eng.quit()
        print("已断开Matlab连接")

# 实例化并执行仿真流程
plant = SimulinkPlant(modelName="ToyExample_V2")
plant.connectToMatlab()
plant.simulate()
outputSim, timeT = plant.getOutput()

print('仿真输出:')
print(outputSim)
print('时间序列:')
print(timeT)

plant.disconnect()

关键修复点说明

  • 改用sim函数执行仿真:直接调用sim(model)会自动完成仿真,并将结果封装到out变量存入Matlab工作区,避免手动控制仿真状态的冗余逻辑。
  • 正确访问工作区变量:通过self.eng.workspace['out']直接获取工作区中的out对象,再提取其中的simout和tout数据。
  • 移除无效仿真控制步骤:删除start-pause-continue的循环逻辑,简化仿真流程。
  • 匹配Simulink模型配置:确保模型中存在To Workspace模块,且模块的变量名分别设置为simout(输出信号)和tout(时间信号),否则需对应修改代码中的变量名。

内容的提问来源于stack exchange,提问作者bleed_bits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:27:37