Переменная автоматически сбрасывается в ноль в выражении «when sample ()» - PullRequest
1 голос
/ 04 апреля 2019

Следующий код Modelica сбрасывает переменную 'bb' в 0 после того, как она устанавливается в 123. Кто-нибудь может объяснить почему? Я использую 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

1 Ответ

2 голосов
/ 04 апреля 2019

Результат неверен в соответствии со спецификацией 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неявно отображается в if-then-else, где ветвь else установит bb=pre(bb) в соответствии с разделом "8.3.5.1" - https://specification.modelica.org/master/Ch8.html#defining-when-equations-by-if-expressions-in-equality-equations

...