1

我的电路中有几个块“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 输入设置参数值。我将不胜感激得到这个问题的任何解决方案。

4

1 回答 1

2

简而言之:问题在于变量的可变性。将您的 FixedCurrent 块替换为允许设置可变电流的块。因此,它需要的不是参数,而是电流 I 的真实输入。

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

  • 常量:用户不可更改,整个模拟的值相同
  • 参数:在模拟开始前可变,但整个模拟的值相同
  • 离散的:仅在事件中更改它们的值(在 when 子句中)
  • 连续:常规变量

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

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

parameter input Real TZtest(start=50);

在情况 2) 中,您会遇到 FMU 的输出是连续的问题。因此,您应该将 FixedCurrent 块替换为某种可变的当前块,如本答案开头所述。

请注意,还有一种解决方法,它允许从初始方程中的连续变量设置参数(如答案中所述),但我只会在绝对必要的情况下使用它。

于 2019-05-02T07:17:58.603 回答