Из вашего фрагмента кода трудно сказать, где именно проблема.
Димола говорит вам, что вы создали большой алгебраический цикл для всех переменных, перечисленных вверху в 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
и модель имитирует, как ожидалось.