Сообщение от
melky
Khedron так and это и есть И оно и должно проверяться до конца независимо. Вот ИЛИ (or) может дальше не проверяться, если первое условие исполняется.
С чего вдруг И должно проверяться до конца независимо? Если у вас в условии "false AND var1", то уже по первому false ясно, что условие выполнено не будет и нет нужды проверять var1. Однако же оно проверяется.
А теперь к вопросу топикстартера.
Поставьте скобки по-другому:
Код:
if ((in_c == true && in_p) == false) then или нагляднее if (in_c == (true && in_p) == false)
Что у нас тут? Если и in_c и in_p ложно, то в итоге получим сравнение "false == false", а вот это утверждение уже истинно, так как ложь действительно равна лжи. Понятно о чём речь? Можете проверить сами. Codesys на такое условие даже предупреждение не выдал.
Поэтому и предложил вместо сравнения переменных вариант с инверсией "(in_c && ~in_p)", где нет проверки на true/false, а есть только инверсия (с наивысшим после скобок, присвоения и разыменования приоритетом) и логическая И. Всё предельно ясно, никакой путаницы.
Если же скобки расставить так,
Код:
if ((in_c == true) && in_p == false)
то:
если in_c ложно, условие будет истинным вне зависимости от значения in_p, что и происходит у Newcomer,
если in_c истина, а in_p ложь, то результат истина (который совпадает с ожидаемым),
если обе переменных true, то результат ложь, что так же совпадает с ожидаемым.
Тут же Вам и ответ, почему вторая часть с отжатием работает нормально.