我开发了一个相当广泛地使用可替换记录的模型。参数被传递给组件数组。我尝试了两种方法来做到这一点,但它们都不能在我所有的测试环境 SimulationX (SimX)、OpenModelica (OM)、Dymola 和 Wolfram SystemModeler (WSM) 中工作。
让我们考虑一个简化的包来说明我的问题。根据所选的 sumbodel,模型计算可替换记录参数的总和或乘积。我尝试了两种方法来更改子模型中的记录。
- 方法一:通过修改重新声明子模型记录(MOD)
- 方法二:重新声明对应的内部记录,改变子模型(IO)内的外部记录
该软件包包含一个示例,其中包含 4 个模型,每个模型具有不同的 MOD 和 IO 记录/子模型组合。
- 这两种方法在 SimX 中都能正常工作
- Dymola 使用 MOD 方法正确模拟,但会产生 IO 错误
- OM 可以模拟模型,但不能为所有场景产生正确的结果
- WSM 会生成有关我提到的记录的警告消息,但会模拟正确的结果。
为了便于阅读,我从显示的代码中删除了示例和注释,但可以在此处下载完整的包:https ://hessenbox.tu-darmstadt.de/getlink/fiEgNjMEBZpSyJWHKafmoYYS/RedeclareTestPackage.rar
package RedeclareTestPackage "redeclarationTest"
partial record datasetPartial "NewRecord1"
parameter Real whatever;
parameter Integer idontcare;
end datasetPartial;
record datasetA "record A"
extends datasetPartial(
whatever=1.0,
idontcare=2);
end datasetA;
record datasetB "record B"
extends datasetPartial(
whatever=2.0,
idontcare=3);
end datasetB;
partial model partialSubModelType_Mod "NewModel1"
replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
Real C;
end partialSubModelType_Mod;
model subModelTypeMultiply_Mod "sub-model type Multiply"
extends partialSubModelType_Mod;
equation
C=subModelDataset.whatever*subModelDataset.idontcare;
end subModelTypeMultiply_Mod;
model subModelTypeAdd_Mod "sub-model type Add"
extends partialSubModelType_Mod;
equation
C=subModelDataset.whatever+subModelDataset.idontcare;
end subModelTypeAdd_Mod;
partial model partialSubModelType_innerOuter "NewModel1"
outer replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
Real C;
end partialSubModelType_innerOuter;
model subModelTypeMultiply_innerOuter "sub-model type Multiply"
extends partialSubModelType_innerOuter;
equation
C=subModelDataset.whatever*subModelDataset.idontcare;
end subModelTypeMultiply_innerOuter;
model subModelTypeAdd_innerOuter "sub-model type Add"
extends partialSubModelType_innerOuter;
equation
C=subModelDataset.whatever+subModelDataset.idontcare;
end subModelTypeAdd_innerOuter;
model modificationModel "NewModel1"
replaceable parameter datasetA modelData constrainedby datasetPartial;
replaceable subModelTypeAdd_Mod submodel[1,1] constrainedby
partialSubModelType_Mod(each subModelDataset=modelData);
Real test=submodel[1,1].C;
end modificationModel;
model innerOuterModel "NewModel1"
inner replaceable parameter datasetA subModelDataset constrainedby datasetPartial;
replaceable subModelTypeAdd_innerOuter submodel[1,1] constrainedby
partialSubModelType_innerOuter;
Real test=submodel[1,1].C;
end innerOuterModel;
end RedeclareTestPackage;
OM 中的错误消息为:
翻译警告 [RedeclareTestPackage: 39:3-39:84]:找不到外部组件 subModelDataset 的内部声明并自动生成。
奇怪的是,只有重新声明数据集和带有内部/外部的子模型的组合才会产生消息并且无法正确模拟。其他一切正常。
WSM 会为这两种方法生成错误消息。MOD方法产生例如:
警告:在变量或组件“MOD_ADD_1and2.submodel.subModelDataset”中:重复修改元素 =(无类型)1.0 和每个 =(类型)1.0 DAE.PROP(Real,C_CONST),值:组件上的 1.0 无论如何。
警告:重复修改元素 =(untyped) 1.0 和 each = (typed)1.0 DAE.PROP(Real, C_CONST), value: 1.0 on component 不管。
IO 方法的 WSM 示例如下:
警告:忽略外部元素的修改: IO_ADD_1and2.submodel[1,1].subModelDataset 。
不过,所有模型都在 WSM 中模拟了正确的结果。Dymola 仅适用于修改示例,内部/外部重新声明会产生如下错误:
Replaceable 必须是约束类的子类型。但是组件 subModelDataset 的内部/外部限定符不同。在组件 subModelDataset 的声明中:文件:C:/.../RedeclareTestPackage/RedeclareTestPackage.mo,第 39 行 subModelDataset 的原始声明:文件:C:/.../RedeclareTestPackage/RedeclareTestPackage.mo,第 39 行上下文:RedeclareTestPackage.partialSubModelType_innerOuter .subModelDataset
如果有人能启发我,我将不胜感激。我的实际模型在 SimX 中运行良好,但在我看来,Modelica 的主要原因之一是开发独立于供应商的模型,以便能够与大型社区共享它们。
最好的问候朱利安