变量在“when sample()”语句中自动重置为零

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量在“when sample()”语句中自动重置为零相关的知识,希望对你有一定的参考价值。

以下Modelica代码在设置为123后将变量'bb'重置为0.可以解释为什么?我正在使用OpenModelica v1.13.2。

model test2
import Modelica.Utilities.Streams.print;

Real b(start=0, fixed=true);
Real bb(start=0, fixed=true);

Integer c(start=0,fixed=true);
algorithm
  when sample(0,0.1) then
    c := pre(c) + 1;
    if c == 1 then
      b := 12.3;
    elseif c == 2 then 
      bb := 123;
    end if;
    print(String(time)+", "+String(b)+", "+String(bb));
  end when;
end test2;

模拟打印:

0, 12.3, 0
0, 12.3, 123
0, 12.3, 0
...(repeats)

还有情节的截图:

enter image description here

答案

根据Modelica 3.4规范,结果不正确,并且bb不应设置为零:

在算法开始时,bb应设置为pre(bb),即123;根据“11.1.2在模型中执行算法”https://specification.modelica.org/master/Ch11.html#execution-of-an-algorithm-in-a-model

请注意,方程式中的when的语义给出了类似的结果但是以不同的方式,在这种情况下,特定的when子句被隐式映射到if-then-else,其中else-branch将根据“8.3”部分设置bb=pre(bb)。 5.1“ - https://specification.modelica.org/master/Ch8.html#defining-when-equations-by-if-expressions-in-equality-equations

以上是关于变量在“when sample()”语句中自动重置为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在Javascript中每24小时将变量重置为0?

MySQL数据库编程02

如何重置 Access 表的自动编号字段? (它不是从 1 开始的)[重复]

C++:向量值在退出 if 语句后重置

在 SwiftUI 中重置绑定变量

在 OpenMP 中重置线程局部变量