Modelica 用于重新声明阵列组件的可替换参数的正确语法
我开发了一个模型,它广泛使用可替换记录。参数被传递到组件数组。我尝试了两种方法来实现这一点,但在我的所有测试环境SimulationX(SimX)、OpenModelica(OM)、Dymola和Wolfram SystemModeler(WSM)中,这两种方法都不起作用 让我们考虑一个简化的软件包来说明我的问题。根据选择的sumbodel,该模型计算可替换记录参数的和或积。我尝试了两种方法来更改子模型中的记录Modelica 用于重新声明阵列组件的可替换参数的正确语法,modelica,dymola,openmodelica,systemmodeler,simulationx,Modelica,Dymola,Openmodelica,Systemmodeler,Simulationx,我开发了一个模型,它广泛使用可替换记录。参数被传递到组件数组。我尝试了两种方法来实现这一点,但在我的所有测试环境SimulationX(SimX)、OpenModelica(OM)、Dymola和Wolfram SystemModeler(WSM)中,这两种方法都不起作用 让我们考虑一个简化的软件包来说明我的问题。根据选择的sumbodel,该模型计算可替换记录参数的和或积。我尝试了两种方法来更改子模型中的记录 方法1:通过修改重新声明子模型记录(MOD) 方法2:重新声明相应的内部记录以更改
- 方法1:通过修改重新声明子模型记录(MOD)
- 方法2:重新声明相应的内部记录以更改子模型(IO)中的外部记录
- 这两种方法在SimX中都可以正常工作
- Dymola使用MOD方法正确模拟,但会产生IO错误
- OM可以模拟模型,但不能为所有场景生成正确的结果
- WSM生成有关我提到的记录的警告消息,但模拟正确的结果
Julian所有代码都不应在任何Modelica工具中工作。存在语法错误(代码不完整)。如果可能的话,请尝试提供一个完整的例子。对不起,你完全正确。我只是想用尽可能短的代码来说明一般问题。我用一个合适的模型更新了我的问题,好吧,至少对OM来说,问题“解决了”。显然,记录重新声明的实现现在是一个热门话题()。只要我将不同的记录硬编码到模型中,它们就会按预期工作。我的全尺寸模型在OM中唯一遗留的问题是记录数组。如上所述,使用旧的前端就可以做到这一点。所有代码都不应该在任何Modelica工具中工作。存在语法错误(代码不完整)。如果可能的话,请尝试提供一个完整的例子。对不起,你完全正确。我只是想用尽可能短的代码来说明一般问题。我用一个合适的模型更新了我的问题,好吧,至少对OM来说,问题“解决了”。显然,记录重新声明的实现现在是一个热门话题()。只要我将不同的记录硬编码到模型中,它们就会按预期工作。我的全尺寸模型在OM中唯一遗留的问题是记录数组。如上所述,使用旧的前端完成了这个任务。
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;