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

时间:2018-01-18 06:24:25

标签: modelica openmodelica dymola

以下代码

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 bug? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

模型不正确。

3.8“对于赋值v:= expr或绑定方程v = expr,v必须声明为至少与expr一样变量”

布尔变量是离散时间表达式,符合3.8.3“离散时间变量,即整数,布尔值,字符串变量和枚举变量,以及在when子句中分配的实变量”

F(时间)不是离散时间表达式,因为3.8.3只包含“函数调用,其中函数的所有输入参数都是离散时间表达式”

全部根据Modelica 3.4。

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

答案 1 :(得分:2)

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

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

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;