Проблема не в операторе and, а в операторах равенства, del_T1<>del_T2
и del_T1==del_T2
.
Если бы вы удалили компоненты and, они сгенерировали бы сообщение об ошибке «Нереальное уравнение в непрерывном времени не является законным:».
И если вам удастся сгенерировать код, он будет дали более точное сообщение об ошибке: переменные типа Real нельзя сравнивать на равенство.
Что указано в разделе 3.5 спецификации Modelica, https://specification.modelica.org/v3.4/Ch3.html#equality -relational-and-logic-operator
Обходной путь для этого - заменить его на «достаточно близко»; например, замените del_T1==del_T2
на abs(del_T1-del_T2)<tol
, для некоторого допуска тол.
Это дает рабочий пример как:
Real T_LMTD;
input Real del_T1;
input Real del_T2;
input Real zeta;
parameter Real beta=0.7;
parameter Real tol=1e-6;
equation
if (del_T1 > beta) and (del_T2 > beta) and abs(del_T1-del_T2)>tol then
T_LMTD = (del_T1-del_T2) / ( (log(del_T1)) - (log(del_T2)));
elseif (del_T1 > beta) and (del_T2 > beta) and abs(del_T1-del_T2)<tol then
T_LMTD = (del_T1-del_T2) / 2;
elseif (del_T1 > beta) and (del_T2 < beta) then
T_LMTD = (del_T1 - beta) / ( (log(del_T1/beta)) * (1 - zeta * (del_T2 - beta)));
elseif (del_T1 < beta) and (del_T2 > beta) then
T_LMTD = (del_T2 - beta) / ( (log(del_T2/beta)) * (1 - zeta * (del_T1 - beta)));
elseif (del_T1 < beta) and (del_T2 < beta) then
T_LMTD = beta / ( (1 - zeta * (del_T1 - beta)) * (1 - zeta * (del_T2 - beta)));
else
T_LMTD = beta / ( (1 - zeta * (del_T1 - beta)) * (1 - zeta * (del_T2 - beta)));
end if;
(Очевидно, объявления переменных могут быть изменены.)