2017-04-05 63 views
1

即使使用Modelica几个月以来,我对新的功能(例如继承和替换)也不熟悉。Modelica - 型号变体(标准版本和更复杂版本)

我有一个标准模型(即一个池)和一个更复杂的变体(即包括蒸发计算):这两个模型有许多共同部分,我想“重用”,但它们也有一些区别: (即质量和能量平衡方程)是不同的(复杂的模型有更多的项),复杂的模型包括更多的参数,变量和方程(即空气和蒸汽性质和法则)。

我想我在Modelica的一些可能性来做到这一点:

  1. 写下两个独立的模型(只用精彩不容同步复制粘贴文本功能) - 我不喜欢。
  2. 使用继承(1)编写包含通用定义的部分模型和包含特定部分的两个继承模型。
  3. 使用继承(2)编写两个包含不同方程组(和其他特定定义)的部分模型,并编写包含通用定义并继承两个部分模型之一的第三个模型(例如,通过布尔值选择参数)。其实我并不确定我可以做到这一点:部分模型将包含具有未定义变量/参数的方程(这将在继承模型中定义):是吗?
  4. 编写标准模型并用新的方程替换方程,并添加附加定义。

我在(2)中实现了,见下面的例子1。不过,我不明白如何使用替换机制(请参阅我在示例2中的失败尝试)。我错在哪里?

下面的例子是我写的试图了解如何去做的简化模型。

实施例1

package Inherited_base 

    partial model Base 
    parameter Real a=1; 
    parameter Real b=2; 
    Real c; 
    Real d; 
    equation 
    c+d = b; 
    end Base; 

    model Variant_1 
    extends Base; 
    equation 
    c = time*a; 
    end Variant_1; 

    model Variant_2 
    extends Base; 
    parameter Real e=0.5; 
    Real d; 
    equation 
    c+d*e = time*a; 
    end Variant_2; 

end Inherited_base; 

实施例2

model Base 
    parameter Real a=1; 
    parameter Real b=2; 

    class Eqs 
    Real c; 
    Real d; 
    equation 
     c = time*a; 
    end Eqs; 


    equation 

    replaceble Eqs bouclage; 
    bouclage.c+bouclage.d = b; 

    end Base; 

编辑:我试图回答我的问题在弹头3:同时限定一个局部模型我得到的错误消息,其中变量/方程中使用的参数没有在类中定义。我通过略微修改我的想法解决了这个问题:我对这两种情况使用了相同的等式,但是我有一个术语(在本例中为'额外'),根据具体情况考虑要使用的不同变量/参数。然而,看起来不可能交互式地选择要扩展的模型:这里的例子是错误的(没有“if”,只有一个'extends'就没有问题)。

例3

package Inherited_variants 

    model Final 
    parameter Real a=1; 
    parameter Real b=2; 
    Real c; 
    Real d; 
    parameter Boolean complexmodel = false; 
    if complexmodel then 
     extends Variant_2; 
    else 
     extends Variant_1; 
    end if; 
    equation 
    c+d = b; 
    c+extra = time*a; 
    end Final; 

    partial model Variant_1 
    parameter Real extra=0; 
    end Variant_1; 

    partial model Variant_2 
    parameter Real e=0.5; 
    Real d; 
    Real extra; 
    equation 
    extra = d*e; 
    end Variant_2; 

end Inherited_variants; 

编辑后斯科特G和汉斯·奥尔森回答(感谢你们两个!)。 这些例子很有趣,但我仍然对你的例子中广泛使用“extends”感到困惑。所以我试图简化你的代码,并从here中学到了一些东西。

斯科特的例子重新排列:

package Example 

    partial model FinalTerm 
    end FinalTerm; 

    model Final 

    model Variant_1 
     extends FinalTerm; 
     parameter Real extra=0; 
    end Variant_1; 

    parameter Real a=1; 
    parameter Real b=2; 
    Real c; 
    Real d; 

    replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choicesAllMatching=true); 

    //replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 VarType, 
    //                     choice=redeclare Variant_1 VarType)); 

    VarType varType; 

    equation 

    c+d = b; 
    c+varType.extra*d = time*a; 

    end Final; 

    model Variant_2 
     extends FinalTerm; 
     parameter Real e=0.5; 
     Real extra; 
    equation 
     extra = e; 
    end Variant_2; 

end Example; 

汉斯例如重新排列:

package Example_2 

    partial model FinalTerm 
    end FinalTerm; 

    model Final 

    model Variant_1 
     extends FinalTerm; 
     parameter Real extra=0; 
    end Variant_1; 

    parameter Real a=1; 
    parameter Real b=2; 
    Real c; 
    Real d; 

    replaceable Variant_1 test constrainedby FinalTerm annotation(choicesAllMatching=true); 
    //replaceable Variant_1 test constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 test "NEW", 
    //                  choice=redeclare Variant_1 test "OLD")); 

    equation 

    c+d = b; 
    c+test.extra*d = time*a; 

    end Final; 

    model Variant_2 
     extends FinalTerm; 
     parameter Real e=0.5; 
     Real extra; 
    equation 
     extra = e; 
    end Variant_2; 

end Example_2; 

我明白了(至少我认为):

  • 这两个例子的区别/办法。为了我的使用目的,我个人更喜欢汉斯的方法(组件更换)。但是,要一次执行多个组件,Scott会更多地使用它。
  • 使用“扩展”不是强制性的。我发现的唯一用途是允许使用'constrainedby',这个'constrainedby'必须指向一个〜共同的母亲班级(对于我的不正确措辞感到抱歉);这与Scott提供的“注释”结合在一起,允许在参数中有一个下拉菜单,这些参数不是无用的(也可以和Hans的技术一起使用)。

一个小问题仍然是开放的:根据the previous webpage应该可以定义“注释(选择())”手名单,但我没有成功(见前面的例子中注释行)。这将允许正确的下拉菜单,而不需要使用“共同母亲级”来“扩展”和“constrainedby”关键字。有人知道我错在哪里吗?

+0

我相信我已经在我的更新答案中解决了您的新问题。使用括号“choice(choice())”而不是“choices(choice = stuff)”似乎可以解决这个问题。注意。我相信这是'redeclare'的一个细微差别,可能是因为Tiller更新了Modelica By Example的部分作为'choice = stuff'仍然适用于其他情况。但不知道。 –

+0

感谢这个额外的答案。 “选择(选择=东西)”解决方案正常工作,至少对于“组件替换”。对于'类型'替换,出现正确的下拉菜单,但选择不是由工具(Dymola)存储,最后总是采用标准选项。 – Songio

+0

我更好地研究了您的示例,并且我看到您仅将此解决方案应用于“组件”替换,而不是键入。所以我只是使用了错误的语法。有效的是: '注释(选择( 选择(redeclare模型VarType = Test_ModelicaComplexity.Replacement_SO.Example_1.Variant_2“NEW”), 选择(redeclare model VarType = Variant_1“STD”)));'' – Songio

回答

1

你想用replaceable model模型,而不是if语句之间变化。下面是一个松散地基于你的例子的例子。我将让你重新思考如何制定好你的问题,正确使用可更换的功能。希望能帮助到你。

在Dymola的2017年FD01测试...

不知道OMEdit正确处理replaceable用作似乎已经就正在解决一些长期问题: https://trac.openmodelica.org/OpenModelica/ticket/2079

package Example 

    model Test 
    // Simple test of the component "Final" 

    Final Final1(
     redeclare model VarType = Variant_1, 
     redeclare Variant_2 varType2, 
     redeclare Example.Variant_3 varType3 "Test") 
     annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); 
    end Test; 

    model Final 
    // Model demonstrating difference ways to use "replaceable" 

    extends ReplaceableModels.PartialModel; 

    replaceable model VarType = ReplaceableModels.Variant_1 constrainedby 
     ReplaceableModels.PartialVariants 
           annotation(choicesAllMatching=true); 

    VarType varType1; 

    replaceable ReplaceableModels.Variant_1 varType2 constrainedby 
     ReplaceableModels.PartialVariants annotation (choicesAllMatching=true); 

    replaceable ReplaceableModels.Variant_1 varType3 constrainedby 
     ReplaceableModels.PartialVariants annotation (choices(
     choice(redeclare Example.Variant_1 varType3 "OLD"), 
     choice(redeclare Example.Variant_2 varType3 "NEW"), 
     choice(redeclare Example.Variant_3 varType3 "Test"))); 

    equation 
     result1 = varType1.extra; 
     result2 = varType2.extra; 
     result3 = varType3.extra; 

    end Final; 

    model Variant_1 

     extends ReplaceableModels.PartialVariants; 

     parameter Real extra0=0; 

    equation 
    extra = extra0; 

    end Variant_1; 

    model Variant_2 

     extends ReplaceableModels.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_2; 

    model Variant_3 

     Real extra; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_3; 

    partial model PartialModel 

    Real result1; 
    Real result2; 
    Real result3; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

UPDATE:

添加注释,以便在GUI中,有一个下拉箭头,模型选择。

更新2:

我更换了一个扩展案例的原代码,演示了基于海报的另一个问题用更换了几个不同的方法。该代码现在还包括(Final)创建的模型的Test,包括Variant_3不从部分类扩展,以显示choices注释如何让你还包括额外的模型,如果这是你的情况下非常有用。

0

斯科特G公司的解决方案的一个替代方案是使用可更换的组件,而不是(使用他的代码为基础):

package ReplaceableComponentTest 
    model Test2 "Showing how to change it" 
    extends Final(redeclare Example.Variant_2 varType); 
    end Test2; 

    model Final 
    extends Example.PartialModel; 
    replaceable Example.Variant_1 varType constrainedby 
     Example.PartialVariants annotation(choices(
      choice(redeclare Example.Variant_2 test "NEW"), 
      choice(redeclare Example.Variant_1 test "OLD"))); 
    equation 
     result = varType.extra; 
    end Final; 
end ReplaceableComponentTest; 

package Example 

    model Variant_1 
     extends Example.PartialVariants; 
     parameter Real extra0=0; 
    equation 
    extra = extra0; 
    end Variant_1; 

    model Variant_2 
     extends Example.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 
     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 
    end Variant_2; 

    partial model PartialModel 

    Real result; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

此情况下,两个工作。请注意,我选择加入的注释,以及 - 和为安全起见使用的类的全名(即使它应该工作)。

如果您有该模型的多个组件,则需要使用可替换的模型,而在其他情况下,它更像是一个样式问题。