Simulink模块参数在线修改方法

Simulink在建立系统模型方面非常的便捷,利用其提供的各种已封装好的组件,可以很快地构建各种模型,如飞机、导弹、诱饵弹等。但是在将导弹、诱饵弹装配到飞机上时就比较复杂了。例如,在飞机发射导弹时,如何将飞机的速度、位姿状态传递给导弹模型就是一个难题。为解决该难题,Simulink必须能够在线修改模型的参数。幸运的是,尽管比较艰难,通过一些特殊的技巧,Simulink还是能够实现在线修改模型参数的。具体的解决方案如下:

  • 模型实例化问题。以飞机携带多枚导弹为例,因为飞机携带导弹数量有限,可以直接生成多个导弹模块。如果数量实在太多,可以考虑for each subsystem。

  • 在线修改模型参数问题。利用Simulink的s函数,在Update函数中使用set_param函数修改模型参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Update(block)
decoyID=block.DialogPrm(1).Data;
decoyName=sprintf('%s%d','JetFlighterWithDecoy/Decoys/Decoy',decoyID);

% 脉冲信号上升沿触发,设置模型参数
if(block.InputPort(4).Data==1 && block.Dwork(1).Data==0)
fligherSpeed=block.InputPort(2).Data;
decoySpeed=[fligherSpeed(1) fligherSpeed(2) fligherSpeed(3)-30];
dcm=block.InputPort(3).Data;
docoySpeedInFlatEarth=inv(dcm)*decoySpeed';
v0=join(['[' string(docoySpeedInFlatEarth') ']']);
pos0=join(['[' string(block.InputPort(1).Data') ']']);
set_param(decoyName,'ParameterArgumentValues',struct('decoySpeed',char(v0),'decoyPos',char(pos0)));
block.Dwork(1).Data = 1;%使能信号
end

参考链接

  1. Simulink模块参数在线修改方法的研究,by 郑志波.
  2. Why do I get an error when specifying a Simscape component parameter with same name as built-in Simulink parameter?,by mathworks.
  3. Parameterize Instances of a Reusable Referenced Model,by mathworks.
  4. find_system,by mathworks.