我有一套嵌套模型和子模型,以及记录。下面是一个简单的例子:
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)。我想将一个记录的实例从R传递到M到H,其中的实例具有不同的类型。这样做,我发现听起来很沉重,通过一个不同的变量传递记录的类型和内容。当我有两个等级,没有问题,我可以使用重新声明,这是好的。当我有两个以上级别的嵌套类(假设为5个)时,我不知道如何同时传递Type和实例。注意,在H中,m是受保护的。有什么不同的方法吗?
发布于 2022-05-02 15:32:59
我发现的一个解决方案是传递一个记录,封装记录的实例(在Modelica术语中称为component )。新的守则是:
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;主要的区别不是将组件B parameter B bb(b=5, a=2.0);传递给各个子模型,而是传递包含B值的record BB。
record BB
extends B(b=5, a=2.0);
end BB;然后,必须在子类定义中重新声明记录,可以一次又一次地重复该定义。
虚拟值必须在基本记录A中定义,假设是Dymola接受代码的a=0.0,而OpenModelica和SimulationX不需要它。
发布于 2022-05-03 07:42:23
我想给出另一个答案的一个细微的变化,然后解释它是如何经常被解决的。
变化是,您可以修改重声明中的值和类,而不需要显式的记录声明。
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;https://stackoverflow.com/questions/72083111
复制相似问题