Как реализовать вложенные операторы if в Modelica?

Я пытаюсь реализовать модель системы отопления, вентиляции и кондиционирования воздуха с учетом ошибок. Ошибка начинается в определенное пользователем время, в данном случае faultTime = 1000. Однако первая часть оператора if вообще не реализована. Ниже приведен фрагмент кода, имеющего отношение к вопросу.

fcuModel FCU;
Modelica.Blocks.Continuous.LimPID PI(k = 300, Ti = 1, yMax = 1, yMin = 1e-4);
parameter Real faultTime = 1000;
// fault modes: 0-normal, 1-fan failed, 2-valve stuck shut...
parameter Integer faultMode = 1;
equation
  connect(PI.u_m,FCU.Ts_zon); // connects zone temperature to PID measurement
  PI.u_s = 21; // set-point for zone temperature
  if time<faultTime then
    PI.y = FCU.val;
    PI.y = FCU.fs;
  else
    if faultMode == 0 then
      PI.y = FCU.val;
      PI.y = FCU.fs;
    elseif faultMode == 1 then
      PI.y = FCU.val;
      FCU.fs = 1e-4;
    end if;
  end if;  

Когда я имитирую, он работает без ошибок, но он напрямую переходит к уравнениям в faultMode == 1, без моделирования безотказного состояния в течение первых 1000 секунд.


person yaska    schedule 27.11.2017    source источник


Ответы (1)


Я изменил вашу модель, чтобы она работала напрямую, введя некоторые переменные и изменив некоторые параметры. В результате получилось:

model FCU

  Modelica.Blocks.Continuous.LimPID PI(k = 0.1, Ti = 1, yMax = 1, yMin = 1e-4);

  parameter Real faultTime = 1000;
  parameter Integer faultMode = 1;

  Real val;
  Real fs;

equation 
  PI.u_s = 21; // set-point for zone temperature
  PI.u_m = 20.9999; // no feedback as no system available  

  if time<faultTime then
    PI.y = val;
    PI.y = fs;
  else
    if faultMode == 0 then
      PI.y = val;
      PI.y = fs;
    elseif faultMode == 1 then
      PI.y = val;
      fs = 1e-4;
    else
     assert(false,"Unknown faultMode");
    end if;
  end if;
  annotation (experiment(StopTime=2000), uses(Modelica(version="3.2.2")));
end FCU;

Результат ниже (смоделированный в Dymola) кажется тем, что я ожидал. Результат

Надеюсь это поможет...

person Markus A.    schedule 28.11.2017
comment
Похоже, он упускает из виду другой случай. - person tbeu; 28.11.2017
comment
Поскольку faultMode является целочисленным параметром, в else-case нет необходимости, но я согласен, если faultMode == 1, то ... else было бы чище. - person Hans Olsson; 28.11.2017
comment
Из спецификации Modelica 3.4, раздел 8.3.4: If-уравнения в разделах уравнений, которые не имеют исключительно параметрических выражений в качестве условий переключения, должны иметь одинаковое количество уравнений в каждой ветви. - person matth; 29.11.2017