在嵌套的modelica模型中是否有其他优雅的方法来重新声明类型与值?



我有一组嵌套的模型和子模型,以及记录。下面是一个简单的例子:

package Unnamed1
record A
Real a;
end A;
record B
extends A;
Real b;
end B;
record C
extends B;
Real c;
end C;
model M
replaceable record Data = A;
parameter Data data;
end M;
model H
replaceable record Data = A;
parameter Data data;
protected
M m(redeclare replaceable record Data = Data, data=data);
end H;
model R
parameter B bb(b=5, a=2.0);
parameter A aa(a=4.0);
parameter C cc(a=0.0, b=0.2, c=0.8);
H h(redeclare record Data = B, data=bb);
H g(redeclare record Data = A, data = aa);
H f(redeclare record Data = C, data = cc);
end R;
end Unnamed1;

是3组嵌套记录(A、B、C)和3个嵌套模型(R、H、M)。我想传递一个记录的实例从RM通过H,具有不同类型的实例。这样做,我发现听起来沉重,通过不同的变量传递两种类型的记录和它的内容。当我有2个关卡时,没问题,我可以使用redeclare。当我有两层以上的嵌套类(比方说5层)时,我不知道如何同时传递Type和instance。注意,在H中,m受到保护。有没有想过换一种方式来做?

我发现的一个解决方案是通过传递记录封装记录的实例组件(称为在Modelica术语中)。新的代码是:

package Unnamed1
record A
Real a=0.0; // value for Dymola... don't know why yet
end A;
record B
extends A;
Real b;
end B;
record C
extends B;
Real c;
end C;
model M
replaceable record Data = A;
Data data;
end M;
model H
replaceable record Data = A;
M m(redeclare record Data = Data);
end H;
model R
record AA
extends A(a=5);
end AA;
record BB
extends B(b=5, a=2.0);
end BB;
record CC
extends C(a=0.0, b=0.2, c=0.8);
end CC;
H f(redeclare record Data = AA);
H g(redeclare record Data = BB);
H h(redeclare record Data = CC);
end R;
end Unnamed1;

主要的区别在于不是传递一个组件Bparameter B bb(b=5, a=2.0);传递给各个子模型一个记录BB包含B

record BB
extends B(b=5, a=2.0);
end BB;
然后必须重新声明记录在子类定义中,可以一次又一次地重复。

必须在基本记录A中定义虚拟值,假设A =0.0以便Dymola接受代码,而OpenModelica和SimulationX不需要它。

我想给出另一个答案的稍微变化,然后解释它通常是如何解决的。

不同之处在于,您可以在重新声明中修改值和类,而无需显式地声明记录。

package Unnamed1
record A
parameter Real a;
end A;
record B
extends A;
parameter Real b;
end B;
record C
extends B;
parameter Real c;
end C;
model M
replaceable record Data = A;
parameter Data data;
end M;
model H
replaceable record Data = A;
protected 
M m(redeclare replaceable record Data = Data);
end H;
model R
H h(redeclare record Data = B(b=5,a=2.0));
H g(redeclare record Data = A(a=4.0));
H f(redeclare record Data = C(a=0, b=0.2, c=0.8));
end R;
end Unnamed1;

然而,当查看H内部时,我们看到即使模型是合法的,新参数也不能使用。因此,更正常的情况是,它是一个模型,其中有一些参数,导致:

package Unnamed2
partial model SO
output Real y;
end SO;
model Constant
extends SO;
parameter Real b;
equation 
y=b;
end Constant;
model Ramp
extends SO;
parameter Real b;
parameter Real k;
equation 
y=b+time*k;
end Ramp;
model Other
extends SO;
parameter Real offset;
equation 
y=time+offset;
end Other;
model M
replaceable model Source = SO;
Source source;
protected 
Real x;
equation 
der(x)=source.y;
end M;
model H
replaceable model Source = SO;
protected 
M m(redeclare replaceable model Source = Source);
end H;
model R
H h(redeclare model Source = Constant(b=5));
H g(redeclare model Source = Other(offset=4.0));
H f(redeclare model Source = Ramp(b=0.2, k=0.8));
end R;
end Unnamed2;

最新更新