如何在同步模型(modelica)中通过函数初始化记录类型

如何在同步模型(modelica)中通过函数初始化记录类型,modelica,dymola,Modelica,Dymola,我编写了一个函数,返回值为record类型。 通常,我会使用此函数通过初始等式初始化record类型的实例。 但由于我想在时钟模型中使用这个函数,初始方程是不可能的 对我来说,使用属性start似乎是初始化变量的唯一方法。不幸的是,记录没有此属性,只有其组件 下面是一个简单的示例,显示了我想要做的事情: model RecordInitializeTest record simpleRecord Integer arg1; Integer arg2; end simple

我编写了一个函数,返回值为record类型。 通常,我会使用此函数通过初始等式初始化record类型的实例。 但由于我想在时钟模型中使用这个函数,初始方程是不可能的

对我来说,使用属性start似乎是初始化变量的唯一方法。不幸的是,记录没有此属性,只有其组件

下面是一个简单的示例,显示了我想要做的事情:

model RecordInitializeTest
  record simpleRecord
    Integer arg1;
    Integer arg2;
  end simpleRecord;

  function initFunc
    output simpleRecord sR;
  algorithm 
    sR.arg1 := 1;
    sR.arg2 := 2;
  end initFunc;

  model InitializeTest
    input Boolean u(start=false);
    output simpleRecord sR1;
  equation 
    if u and not previous(u) then
      sR1 =initFunc();
    else
      sR1 = previous(sR1);
    end if;
  end InitializeTest;

  InitializeTest iT;
equation 
  iT.u = sample(time > 0.5,Clock(0.1));
end RecordInitializeTest;
此模型在dymola中工作,但当然会出现警告,因为iT.sR1.agr1和iT.sR1.arg2没有起始值,而是previous()的参数。 我当然想用

output simpleRecord sR1(start=initFunc())

有人知道如何在没有像这样的任务的情况下以方便的方式初始化sR1吗

输出simpleRecordSR1(arg1(start=1)、arg2(start=2))

因为这对于大型结构化记录来说是不方便的


实际上,我只想在某些时间和初始执行一个复杂的外部不纯函数(而不是initFunc),并将结果保持在两者之间。我明确地不想使用连续时间模型。我不想在翻译过程中收到警告。

如果我完全理解您的问题,只需进行一些小的修改,就可以让您的示例按预期运行:

model RecordInitializeTest
  record simpleRecord
    Integer arg1(start=0);
    Integer arg2(start=0);
  end simpleRecord;

  function impureFunc
    output simpleRecord sR;
  algorithm 
    (sR.arg1, sR.arg2) :=Modelica.Utilities.System.getTime();
  end impureFunc;

  model ImpureTest
    input Boolean u(start=false);
    output simpleRecord sR1;
  equation 
    if firstTick() or u and not previous(u) then
      sR1 = impureFunc();
    else
      sR1 = previous(sR1);
    end if;
  end ImpureTest;

  ImpureTest iT(u=sample(time > 0.5, Clock(0.1)));
end RecordInitializeTest;
在模拟结果中,我们看到新记录值精确计算了2次:时间0和时间0.5:

这些变化是:

  • initFunc()
    替换为
    inpurefunc()
    ,以查看在时间0和时间0.5调用函数的结果

  • 要执行初始化,添加了
    firstTick()
    ,以在时间0调用不纯函数

  • 因为记录中的每个变量都有一个伪起始值,所以不再有起始值警告。实际的起始值无关紧要,因为它们是用
    firstTick()设置的。


注意:我以前从未创建过时钟模型,所以我可能犯了一些愚蠢的初学者错误。

这个解决方案实际上不是我所希望的,但它满足了我的需要。这几乎类似于
initial()
操作符,但不幸的是,您必须定义默认的开始值。