1

我开发了一个相当广泛地使用可替换记录的模型。参数被传递给组件数组。我尝试了两种方法来做到这一点,但它们都不能在我所有的测试环境 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 的主要原因之一是开发独立于供应商的模型,以便能够与大型社区共享它们。

最好的问候朱利安

4

0 回答 0