FMU输入用于Modelica中的参数

时间:2019-04-30 15:46:31

标签: parameters modelica openmodelica fmi

我的电路中有几个块“ FixedCurrent”。我希望能够通过FMU更改这些模块的电流值。我可以使用“参数”更改值,如下面的代码所示:

type Current = Real(unit = "A", min = 0);

parameter Current CurrentTest1(start = 50) "Test current";

PowerSystems.Generic.FixedCurrent fixedCurrent3(
    I = CurrentTest1, 
    redeclare package PhaseSystem = PhaseSystem), 
  annotation(...);

PowerSystems.Generic.FixedCurrent fixedCurrent1(
    I = 55, 
    redeclare package PhaseSystem = PhaseSystem), 
  annotation(...);

但是我不能为他们分配输入。例如,如果我使用输入命令(1)或RealInput块(2)设置块fixedCurrent3的电流值:

// 1) 
input Real TZtest(start=50);
PowerSystems.Generic.FixedCurrent fixedCurrent3(
    I = TZtest, 
    redeclare package PhaseSystem = PhaseSystem),
  annotation(...);

// 2) 
Modelica.Blocks.Interfaces.RealInput TZTest2 annotation(...);
PowerSystems.Generic.FixedCurrent fixedCurrent3(
    I = TZtest, 
    redeclare package PhaseSystem = PhaseSystem),
  annotation(...);

我收到相应的错误:

1) Translation Error
Component fixedCurrent3.I of variability PARAM has binding TZtest of higher variability VAR.

2)Translation Error
Component fixedCurrent3.I of variability PARAM has binding TZTest2 of higher variability VAR.

因此,我无法通过FMU输入来设置参数值。我将很高兴为您解决这个问题。

1 个答案:

答案 0 :(得分:2)

简而言之:问题在于变量的可变性。用允许设置可变电流的模块替换您的FixedCurrent模块。因此,除了参数之外,它还需要具有当前I的实际输入。

在Modelica中,变量可以具有以下变量之一(从最低到最高):

  • 常量:用户无法更改,整个模拟过程中使用相同的值
  • 参数:在仿真开始之前可以更改,但是在整个仿真中该值相同
  • 离散:仅在事件中(在子句中)更改其值
  • 连续:常规变量

只能将变量分配给具有相同或更高可变性的其他变量。例如,不能使用连续变量设置参数。在示例1)和2)中,您正试图做到这一点。

对于1),您可以使用前缀参数将输入的可变性设置为参数:

parameter input Real TZtest(start=50);

在情况2)中,您会遇到FMU的输出连续的问题。因此,如该答案开头所提到的,您应该用某种可变电流块替换FixedCurrent块。

请注意,还有一种变通方法,该方法可以根据初始方程式中的连续变量设置参数(如this所述),但是我仅在绝对必要时使用它。