Modelica 用于重新声明阵列组件的可替换参数的正确语法

Modelica 用于重新声明阵列组件的可替换参数的正确语法,modelica,dymola,openmodelica,systemmodeler,simulationx,Modelica,Dymola,Openmodelica,Systemmodeler,Simulationx,我开发了一个模型,它广泛使用可替换记录。参数被传递到组件数组。我尝试了两种方法来实现这一点,但在我的所有测试环境SimulationX(SimX)、OpenModelica(OM)、Dymola和Wolfram SystemModeler(WSM)中,这两种方法都不起作用 让我们考虑一个简化的软件包来说明我的问题。根据选择的sumbodel,该模型计算可替换记录参数的和或积。我尝试了两种方法来更改子模型中的记录 方法1:通过修改重新声明子模型记录(MOD) 方法2:重新声明相应的内部记录以更改

我开发了一个模型,它广泛使用可替换记录。参数被传递到组件数组。我尝试了两种方法来实现这一点,但在我的所有测试环境SimulationX(SimX)、OpenModelica(OM)、Dymola和Wolfram SystemModeler(WSM)中,这两种方法都不起作用

让我们考虑一个简化的软件包来说明我的问题。根据选择的sumbodel,该模型计算可替换记录参数的和或积。我尝试了两种方法来更改子模型中的记录

  • 方法1:通过修改重新声明子模型记录(MOD)
  • 方法2:重新声明相应的内部记录以更改子模型(IO)中的外部记录
该软件包包含一个示例,其中有4个模型,每个模型的MOD和IO具有不同的记录/子模型组合

  • 这两种方法在SimX中都可以正常工作
  • Dymola使用MOD方法正确模拟,但会产生IO错误
  • OM可以模拟模型,但不能为所有场景生成正确的结果
  • WSM生成有关我提到的记录的警告消息,但模拟正确的结果
为了可读性,我从显示的代码中删除了示例和注释,但是可以在此处下载完整的软件包:

OM中的错误消息如下:

翻译警告[重新声明的测试包:39:3-39:84]:内部错误 找不到外部组件子ModelDataSet的声明,并且 是自动生成的

奇怪的是,只有将数据集和子模型与内部/外部重新定义的组合才能产生消息,并且无法正确模拟。其他一切都很好

WSM为这两种方法生成错误消息。国防部的方法,例如:

警告:在变量或组件中 “MOD_ADD_1和2.submodel.subModelDataset”:重复修改 element=(非类型化)1.0,each=(类型化)1.0 DAE.PROP(实数, C_CONST),值:组件上的1.0

警告:重复 修改元素=(非类型化)1.0和每个=(类型化)1.0 DAE.PROP(Real,C_CONST),值:1.0(在任何组件上)

IO方法的WSM示例如下:

警告:忽略对外部元素的修改: IO_添加_1和2。子模型[1,1]。子模型数据集

不过,所有模型都在WSM中模拟了正确的结果。Dymola仅适用于修改示例,内部/外部重新声明会产生以下错误:

可替换必须是约束类的子类型。但不同 组件子模型数据集的内部/外部限定符。声明中 组件子模型数据集:文件: C:/…/redecaratestpackage/redecaratestpackage.mo,第39行原件 子模型DataSet:文件的声明: C:/…/redecaratestpackage/redecaratestpackage.mo,第39行上下文: 重新声明的TestPackage.partialSubModelType_innerOuter.subModelDataset

如果有人能启发我,我将非常感激。我的实际模型在SimX中运行良好,但我认为Modelica的主要原因之一是开发独立于供应商的模型,以便能够与大型社区共享

致意
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;