在Matlab函数中调用Simulink并动态修改输入参数的运行问题
问题原因
Matlab 函数的工作区是独立的局部作用域,和全局base工作区不互通。默认情况下Simulink运行时会从base工作区读取所需变量,你把仿真逻辑封装进函数后,模型找不到对应变量就会报错。
解决方案
- 方案1:指定仿真读取的工作区为当前函数作用域,最简单直接
仅需修改sim调用语句,添加SrcWorkspace参数即可,代码如下:
function [Out] = Function(Var1, Var2 ....) % 加参数指定从当前函数工作区读取变量 simout = sim('Simulinkblock', 'SrcWorkspace', 'current'); Yx = simout.yout{1}.Values.Data; Cx = Yx(end); Out = Cx; % 补充给输出变量赋值的逻辑,原代码缺失这步会报错 end
- 方案2:使用
Simulink.SimulationInput对象传参,更适合多批次改参数的场景
你需要多次启停仿真修改参数,用这个方案可以避免变量作用域冲突,参数传递更清晰,示例代码:
function [Out] = Function(Var1, Var2 ....) % 初始化仿真输入对象 simIn = Simulink.SimulationInput('Simulinkblock'); % 给模型需要的所有变量赋值,示例给参数a、b赋值为入参Var1、Var2 simIn = setVariable(simIn, 'a', Var1); simIn = setVariable(simIn, 'b', Var2); % 运行仿真 simout = sim(simIn); Yx = simout.yout{1}.Values.Data; Cx = Yx(end); Out = Cx; end
注意事项
- 不推荐用
assignin把变量写入base工作区的方案,会污染全局工作区,多仿真并行运行时极易出现变量冲突。 - 原代码没有给输出变量
Out赋值,运行会报错,需要把你需要返回的结果赋值给Out。
内容的提问来源于stack exchange,提问作者ldsangr3
相关产品推荐
相关产品推荐

