Переменная автоматически сбрасывается на ноль в инструкции «when sample()»

#modelica #openmodelica

#modelica #openmodelica

Вопрос:

Следующий код 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)
  

Также скриншот графика:

введите описание изображения здесь

Комментарии:

1. Скопировал ваш код в Dymola, и он печатает [0, 12.3, 0]; [0.1, 12.3, 123]; [0.2, 12.3, 123] … с bb проживанием в доме 123. Так что, похоже, это связано с OpenModelica.

Ответ №1:

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