我试图建立同一范围内一个模型,可以使用两种不同的组件(从现有的库中提取):特别是具有热交换系统; 该热交换器可基于不同的技术,例如:管道或板。
我想要再定义一个默认的可更换器的模型,并说这等技术也可以使用。
这是什么,我尝试了合租简单为例:
package Test
// Component 1 original definition in the library
model COMP1
parameter Real p1=1 "";
Real v "";
equation
v=p1*time;
end COMP1;
// Component 2 original definition in the library
model COMP2
parameter Real p2=1 "";
Real v "";
equation
v=p2*time;
end COMP2;
// Main module (system)
model MAIN
parameter Real pm=100 "";
Real vm "";
// Redefinition of the component modifing the default values
model call1 = COMP1(p1=10);
model call2 = COMP2(p2=20);
replaceable call1 OBJ
annotation(choices(
choice(redeclare call1 OBJ "Default"),
choice(redeclare call2 OBJ "Variant")));
equation
vm = OBJ.v+pm;
end MAIN;
// Application model, using the main model
model APP
MAIN mAIN;
end APP;
end Test;
该模型APP成功运行。 然而,如果我打开APP.mAIN和变化OBJ的参数(或者选择“默认”或“变体”),这导致对矫正的APP模型如下:
model APP
MAIN mAIN(redeclare call1 OBJ "Default");
end APP;
我得到以下错误:
Component type specifier call1 not found
我不明白我做错了什么,请帮助。
有关错误的问题时,因为你没有在选择注释使用正确的类路径。
如果您在选择“默认” APP
,你会得到下面的代码:
model APP
MAIN mAIN(redeclare call1 OBJ "Default");
end APP;
在这里,我们看到的是,类路径call1
无效。 APP可以访问call1
只能使用相对类路径MAIN.call1
或绝对类路径Test.MAIN.call1
。 所以,你可以修复使用下面的注解这个问题:
replaceable call1 OBJ
annotation(choices(
choice(redeclare MAIN.call1 OBJ "Default"),
choice(redeclare MAIN.call2 OBJ "Variant")));
然而,在Dymola的模型仍然不检查,显然是由于在当地的类定义MAIN
, 下部分修改默认值的重新定义 。 在这里,你创建新类call1
和call2
。 这可能是一个错误Dymola的,因为它在OpenModelica - 但新类是没有必要的。 相反,您可以使用原来的类,并设置与修改公式中的参数在redeclare
声明如下:
model MAIN
parameter Real pm=100 "";
Real vm "";
replaceable COMP1 OBJ
annotation(choices(
choice(redeclare Test.COMP1 OBJ(p1=10) "Default"),
choice(redeclare Test.COMP2 OBJ(p2=10) "Variant")));
equation
vm = OBJ.v+pm;
end MAIN;
现在,该模型适用于没有选择与“默认”,但在选择“变体”,Dymola的抱怨说,重新声明类不包含相同的变量原之一。 这是当你有可更换类工作,你必须的一种限制(再次,OpenModelica有没有问题,但Dymola的警告你,这是不符合的Modelica语言规范)
替代做法:MSL-风格与界面
我建议创建类似的Modelica库通常不会(例如用接口模型Modelica.Electrical.Analog.Interfaces.OnePort
):
- 您创建一个
partial
基本模型,其中包含一切,这是常见的所有变体,称为界面 - 变体扩展接口与现有的库的车型之一
- 使用变体的类实例化变体之一和约束重声明到接口使用constrainedby
- 除了手动创建的选择注解,你现在可以用注释choicesAllMatching自动创建
这是怎样的例子可能看起来像。 第三方组件COMP1
和COMP2
被移动到包装ReadOnlyLibrary
。
package Test
// Original definition of Component 1 and 2 in the external library
package ReadOnlyLibrary
model COMP1
parameter Real p1=1 "";
Real v "";
equation
v=p1*time;
end COMP1;
model COMP2
parameter Real p2=1 "";
Real v "";
equation
v=p2*time;
end COMP2;
end ReadOnlyLibrary;
// Interface and variants with modified default values
partial model Call_Interface
Real v "";
end Call_Interface;
model Call1 "Default"
extends Call_Interface;
extends ReadOnlyLibrary.COMP1(p1=10);
end Call1;
model Call2 "Variant"
extends Call_Interface;
extends ReadOnlyLibrary.COMP2(p2=20);
end Call2;
// Main module (system)
model Main
parameter Real pm=100 "";
Real vm "";
replaceable Test.Call1 OBJ constrainedby Test.Call_Interface annotation (choicesAllMatching);
equation
vm = OBJ.v+pm;
end Main;
// Application model, using the main model
model App
Main main annotation (Placement(transformation(extent={{-12,10},{8,30}})));
end App;
end Test;