Modelica 如何在不影响模拟性能的情况下检查终止流程的绝对时间约束?

Modelica 如何在不影响模拟性能的情况下检查终止流程的绝对时间约束?,modelica,Modelica,我想读取当前日期,如果该日期超出限制,则应终止系统。下面的代码可以工作 import Modelica.Utilities.System.getTime; model M Integer[7] today; constant Integer[7] limit={0,0,0,0,0,0,2021}; Real x; equation today = getTime(); if today[7] >

我想读取当前日期,如果该日期超出限制,则应终止系统。下面的代码可以工作

    import Modelica.Utilities.System.getTime; 
    model M
       Integer[7] today;
       constant Integer[7] limit={0,0,0,0,0,0,2021};
       Real x;
    equation
       today = getTime();
       if today[7] > limit[7] then
          terminate();
       end if;
       // Process
       x = 1;
    end M;
但是最好是在启动时读取日期,避免一直检查日期,这应该是一个负担,尽管运行上面的代码并不明显

最符合逻辑的是初始算法或方程部分,用getTime获取日期,如果合适,也可以终止

但只需将当前部分更改为initial equation gives编译错误,错误文本为:…以下变量无法与任何方程匹配:今天[1]。。。。今天[7]。

模型中不需要今天,因此您可以将其移动到函数:

import Modelica.Utilities.System.getTime; 

function afterLimit
  input Integer limit[7];
  output Boolean after;
protected
  Integer[7] today;
algorithm
  (,,,,,,today[7]) := getTime();
  after := today[7]>limit[7];
end afterLimit;

model M
  constant Integer[7] limit={0,0,0,0,0,0,2021};
  Real x;
initial equation
  if afterLimit(limit) then
    terminate("Time is up!");
  end if;
equation
  // Process
  x = 1;
end M;
或者,您可以按照@ReneJustNielsen的建议将其设置为fixed=false的参数,您现在不需要在模型中使用它,因此您可以将其移动到函数:

import Modelica.Utilities.System.getTime; 

function afterLimit
  input Integer limit[7];
  output Boolean after;
protected
  Integer[7] today;
algorithm
  (,,,,,,today[7]) := getTime();
  after := today[7]>limit[7];
end afterLimit;

model M
  constant Integer[7] limit={0,0,0,0,0,0,2021};
  Real x;
initial equation
  if afterLimit(limit) then
    terminate("Time is up!");
  end if;
equation
  // Process
  x = 1;
end M;

或者,您可以按照@ReneJustNielsen的建议,将其设置为fixed=false的参数,您可以今天将其声明为fixed=false的参数,并在初始方程部分为其分配getTime。该代码在使用Modelica 4.0.0的Dymola 2021x中不起作用。terminate需要一个字符串作为参数,getTime返回多个值,而不是一个向量。对于MSL4,也请阅读此票证:您可以使用fixed=false将today声明为参数,并在初始方程部分为其分配getTime。该代码在使用Modelica 4.0.0的Dymola 2021x中不起作用。terminate需要一个字符串作为参数,getTime返回多个值,而不是一个向量。对于MSL4,也请阅读此票据:通过Marco上面提到的小调整,您的代码在OpenModelica中运行良好。我只是想知道说初始算法而不是初始方程是否更好/合乎逻辑?毕竟这部分没有方程式。在OpenModelica中,初始算法也可以工作。我通常在可能的情况下使用方程和初始方程。通过上面Marco提到的小调整,您的代码在OpenModelica中工作得很好。我只是想知道说初始算法而不是初始方程是否更好/合乎逻辑?毕竟这部分没有方程式。在OpenModelica中,初始算法也可以工作。我通常在可能的情况下使用方程和初始方程。