以下代码
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? 提前谢谢。
答案 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;