函数调用模型中的“可变性”错误
“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;
下面的代码
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;