Что означает «алгебраический цикл с целыми числами или логическими значениями» в сообщении об ошибке - PullRequest
1 голос
/ 04 ноября 2019

Я делаю ПИ-контроллер, используя платформу Dymola, и я встретил сообщение об ошибке, как показано ниже:

Error message

А вот мой код, которыйсостоят из клапана, который рассчитывает дисп, и ПИ-регулятора, который контролирует количество дисп. Они общаются друг с другом, используя флаг

  //PI controller///

  if flag_input==1 then //flag_input==1 : Stop control / flag_input==0 : Restart control//
    control:=0;
  else
    control:=(P_term+I_term)/unit;
  end if;

  if error<0 then // error<0 : flag to Valve to restart calculating the disp//
    flag_output:=1;
  else
    flag_output:=0;
  end if;

//Valve//

  if (26/5)*(thetta/(2*pi))*0.001>0.026 and flag_input==0 then
  //restart calculating the disp when received flag==1 from the PI controller//
    disp:=0.026;
    flag:=1;
  elseif (26/5)*(thetta/(2*pi))*0.001<0 and flag_input==0 then
    disp:=0;
    flag:=1;
  else
    disp:=(26/5)*(thetta/(2*pi))*0.001;
    flag:=0;
  end if;

Может кто-нибудь сказать мне, что означает ошибка алгебраического цикла, и выяснить проблему?

1 Ответ

5 голосов
/ 04 ноября 2019

Из вашего фрагмента кода трудно сказать, где именно проблема.

Димола говорит вам, что вы создали большой алгебраический цикл для всех переменных, перечисленных вверху в Unknowns, и уравнений, перечисленных нижев разделе Equations. Это может легко произойти при создании операторов if с переменными, которые зависят друг от друга. Часто вам просто нужно использовать pre() в нужном месте, чтобы разорвать цикл.

Давайте рассмотрим еще один небольшой пример, чтобы объяснить проблему. По какой-то причине мы пытаемся подсчитать полные миллисекунды, прошедшие в текущем моделировании, и остановимся, как только мы достигнем 100.

model count_ms
  Integer y(start=0);
equation 
  if y >= 100 then
    y = 100;
  else
    y = integer(1000*time);
  end if;
end count_ms;

Этот код выдаст ошибку, аналогичную вашей:

Обнаружен алгебраический цикл с целыми числами или логическими значениями.
Неизвестно: y

Уравнения: y = (если y> = 100, то еще 100 целых чисел (1000 * раз));

Из сообщения об ошибке мы видим, что y не может быть решена из-за уравнения, полученного из оператора if. Уравнение неразрешимо, так как y зависит от самого себя. Для решения таких проблем было введено pre, которое дает вам доступ к значению переменной, имевшейся при запуске события.

Чтобы исправить приведенный выше код, мы просто должны использовать pre при проверкедля y

if pre(y) >= 100 then

и модель имитирует, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...