函数调用模型中的“可变性”错误

“Variability” error in model with function call

下面的代码

model FunctionCall
  Boolean result;

  function F
    input Real p1;
    output Boolean result;
  algorithm 
    result :=p1 < 0.5;
  end F;

algorithm 
  result :=F(time);
end FunctionCall;

(也在 http://www.modelica-forum.com/forums/index.php?showtopic=2 中描述)在 Dymola 2018FD01 中仍然抛出错误,而在 OpenModelica 中它被接受。 这是错误的 Modelica 代码还是 Dymola 错误? 提前致谢。

模型不正确。

3.8 "For an assignment v:=expr or binding equation v=expr, v must be declared to be at least as variable as expr"

布尔变量是根据 3.8.3 的离散时间表达式"Discrete-time variables, i.e., Integer, Boolean, String variables and enumeration variables, as well as Real variables assigned in when-clauses"

F(time) 不是离散时间表达式,因为 3.8.3 仅包含 "Function calls where all input arguments of the function are discrete-time expressions"

全部根据 Modelica 3.4。

原因是模型中的布尔变量只应在事件发生时发生变化,而 F(time) 等函数的结果既不能保证也不能可靠地生成事件。

汉斯的回答对你的问题是正确的。

您未提出的问题可能是如何在语言规范中获得相同的行为。下面我提供了一种可能的解决方案。

model FunctionCall
  Boolean result;

  function F
    input Real p1;
    output Integer result;
  algorithm 
    result := if p1 < 0.5 then 1 else 0;
  end F;

algorithm 

  result := if F(time) < 0.5 then false else true;

end FunctionCall;