Python控制Simulink模型时输出变量返回None的解决方法
问题解决:Python控制Simulink仿真无法获取输出值
问题背景
使用Python通过matlab.engine控制Simulink模型ToyExample_V2,设置常量块输入为1,仿真时长10秒、步长0.1,但调用getOutput后返回的outputSim和timeT均为None。
问题原因
- 未生成有效仿真输出变量:原代码未通过Simulink仿真函数生成包含结果的
out变量,直接访问out.simout会因变量不存在返回空值。 - 仿真控制逻辑不可靠:采用
start-pause-continue的循环方式无法确保仿真完整执行,也不会自动将输出写入工作区。 - 变量访问方式错误:使用
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
相关产品推荐
相关产品推荐

