我们知道,在simulink里面使用MATLAB-function,让MATLAB函数作为simulink系统里面的一个模型,是很常见的做法。
但有时候我们也需要让Simulink模型作为一个函数,参与到MATLAB脚本中,比如有时我们需要向一个控制系统传入控制器参数然后读取控制过程的一些指标。
那么“向simulink模型传入参数”以及“读出simulink控制过程的指标”,要如何做到呢?
总结:
Simulink视角下,
使用from workspace模块从MATLAB工作区获取参数,使用to workspace模块向MATLAB工作区传递参数。其中,参数要以特定格式传递,具体地说,simin/simout有timeseries,结构体,矩阵三种形式,这里不详细讨论这个视角。
MATLAB视角下,
使用assignin函数传递参数到simulink的模型工作空间,通过sim
函数来运行Simulink模型,并通过simout
对象获取仿真结果。
assignin函数,用于向指定工作区插入参数
用例:
assign('base','omeagaC',omegaC);
assignin('base', 'omega0', omega0);
assignin('base', 'b0', b0);
base工作区对simulink模型是可见的,但如果你是在一个函数里面调用simulink模型,那么simulink模型不能从这个函数的局部工作区读取参数
sim函数,用来运行同目录下的simulink模型
simout对象:
为获取simulink中的输出,可以使用to workspace,再在MATLAB中提取simout中的数据
simout有三种形式,我们可以在to workspace模块中设置
作者倾向于使用结构体
例子:
这是作者写的一个测试例:
输入LADRC控制器的三个参数,然后返回整个过程中被控量与期望量误差的均方差。
其中均方差是在simulink模型中采集的
function fitness = getFitness_LADRC(omegaC,omega0,b0)
%LADRCTEST 输入控制器的三个参数,输出本次控制过程的适应度
%向LadrcTest的slx模型传入Ladrc的三个参数,设定仿真时间为200s,
assignin('base', 'omegaC', omegaC);
assignin('base', 'omega0', omega0);
assignin('base', 'b0', b0);
% 设置仿真时间
simTime = 200; % 仿真时间200秒
% 运行仿真
simOut = sim('LadrcTest', 'SimulationMode', 'normal', 'StartTime', '-10', 'StopTime', num2str(simTime), 'SaveOutput', 'on');
% 提取仿真结果
simdata = simOut.get('fitness');
fitness=-simdata.signals.values(end);
end
让我们以omegaC=3.5,omega0=35,b0=0.5为例
可以看到,传入三个参数,传出适应度
我们点开模型,手动运行,用scope观察,结果与MATLAB上得到的适应度一致