链接:【笔记】Simulink与Workbench交互+自定义m函数封装为Simulink模块
问题
依然采用链接里的模型,此时问题转变为,期望模拟a=1:1:100的三角函数,计算该函数的RMS值,如果将主代码改成以下这样,会发现输出结果都是一个值
matlab
clc
clear
close all
%%
t_all=10;
delta_t=0.01;
for i=1:100
a=i;
b=1;
c=0;%pi/2;
simOut=sim('MainK');
out_t=simOut.tout;
out_y1=simOut.yout{1}.Values;
results=rms(out_y1.data)
end
上述代码输出结果
这是因为Simulink的Constant模块的赋值均来自于工作区,而matlab的for循环里没有办法实时修改工作区的参数值,导致所有结果都是一个值
解决方案:采用set_param()函数
matlab
matlab
% 假设你有一个变量 var 和一个定值 constant
var = 10; % 变量值
constant = 5; % 定值
% Simulink 模型的名字
modelName = 'your_model_name';
% 为第一个参数赋值变量值
param1Name = 'your_block/your_param1'; % 第一个参数的完全限定名
set_param([modelName, '/', param1Name], 'Value', num2str(var));
% 为第二个参数赋值定值
param2Name = 'your_block/your_param2'; % 第二个参数的完全限定名
set_param([modelName, '/', param2Name], 'Value', num2str(constant));
% 如果需要为多个参数赋值,可以继续添加 set_param 调用
上述代码可修改为:
matlab
clc
clear
close all
%%
t_all=10;
delta_t=0.01;
for i=1:100
a=i;
set_param(['MainK','/','Constant1'],'Value',num2str(a));%注意Constant1是a模块的名称
b=1;
c=0;%pi/2;
simOut=sim('MainK');
out_t=simOut.tout;
out_y1=simOut.yout{1}.Values;
results=rms(out_y1.data)
end
注意Constant1是a模块的名称(赋值完毕后,该模块会自动显示赋值数)
输出结果,可以看出,结果随a的改变而改变