如何参数化重新声明?

时间:2019-05-23 18:59:19

标签: modelica dymola

我有一个用于表示某些媒体的程序包,其构建与Modelica.Media类似但不完全相同。我想允许用户为特定属性在不同功能之间进行选择,而不必更改其余属性的计算方式。

包装为:

package myPac
    replaceable function prop = F1 constrainedby partialF
       annotation (choicesAllMatching=true);

    function partialF
        input Real x;
        output Real y;
    end partialF;

    function F1
        extends partialF;
    algorithm
        y := x;
    end F1;

    function F2
        extends partialF;
    algorithm
        y := 2*x;
    end F2;
end myPac;

然后我想从模型内部选择F1或F2。

model myModel
    replaceable package pack1 = myPac(redeclare function prop = pack1.F2);
    Real x;
    Real y;
equation
    y = pack1.prop(x);
end myModel;

按预期工作。如何参数化prop的重新声明,以便可以在参数对话框中进行设置?

我正在寻找类似的东西:

model myModel2
    replaceable package pack1 = myPac(redeclare function prop = if a == 1 then pack1.F1 else pack1.F2);
    parameter Integer a = 1;
    Real x;
    Real y;
equation
    y = pack1.prop(x);
end myModel2;

这显然是不正确的语法。另外,prop的声明中的choicesAllMatching = true确实显示了一个下拉菜单,但未列出任何选择。

2 个答案:

答案 0 :(得分:2)

  

如何参数化prop的重新声明,以便可以对其进行设置   在参数对话框中?

您不需要其他参数a来选择功能。只需单击prop的编辑按钮即可获得所选可更换包装的参数窗口,您可以在其中选择F1F2。 我在下面添加了动画,以使其更加清晰。

  

此外,prop的声明中的choicesAllMatching = true确实显示   我有一个下拉菜单,但没有列出任何选择。

这对我有用,如您在动画中所见。请注意,我将函数partialF声明为partial,因此它不包含在下拉菜单中。然后,我在choicesAllMatching中的replaceable package pack1上添加了另一个myModel注释,以创建另一个用于选择pack1的下拉菜单(就像汉斯在他的回答中所做的那样)。

Animation of Dymola parameter window

答案 1 :(得分:0)

当前无法根据参数值进行重新声明。

但是,您可以在对话框中出现的两个软件包之间进行选择:

package myPac
    replaceable function prop = F1 constrainedby partialF
       annotation (choicesAllMatching=true);

    function partialF
        input Real x;
        output Real y;
    end partialF;

    function F1
        extends partialF;
    algorithm
        y := x;
    end F1;

    function F2
        extends partialF;
    algorithm
        y := 2*x;
    end F2;
end myPac;
package myPac1=myPac(redeclare function prop=myPac.F1);
package myPac2=myPac(redeclare function prop=myPac.F2);

model myModel
    replaceable package pack1 = myPac annotation(choicesAllMatching=true);
    Real x;
    Real y;
equation
    y = pack1.prop(x);
end myModel;