В LAD в Step7 проверяются все условия в цепочке. Иногда об этом забываю и получаю неприятные ошибки при работе с массивами.Цитата:
это было в Step7
Вид для печати
В LAD в Step7 проверяются все условия в цепочке. Иногда об этом забываю и получаю неприятные ошибки при работе с массивами.Цитата:
это было в Step7
С чего вдруг И должно проверяться до конца независимо? Если у вас в условии "false AND var1", то уже по первому false ясно, что условие выполнено не будет и нет нужды проверять var1. Однако же оно проверяется.
А теперь к вопросу топикстартера.
Поставьте скобки по-другому:Что у нас тут? Если и in_c и in_p ложно, то в итоге получим сравнение "false == false", а вот это утверждение уже истинно, так как ложь действительно равна лжи. Понятно о чём речь? Можете проверить сами. Codesys на такое условие даже предупреждение не выдал.Код:if ((in_c == true && in_p) == false) then или нагляднее if (in_c == (true && in_p) == false)
Поэтому и предложил вместо сравнения переменных вариант с инверсией "(in_c && ~in_p)", где нет проверки на true/false, а есть только инверсия (с наивысшим после скобок, присвоения и разыменования приоритетом) и логическая И. Всё предельно ясно, никакой путаницы.
Если же скобки расставить так,
то:Код:if ((in_c == true) && in_p == false)
если in_c ложно, условие будет истинным вне зависимости от значения in_p, что и происходит у Newcomer,
если in_c истина, а in_p ложь, то результат истина (который совпадает с ожидаемым),
если обе переменных true, то результат ложь, что так же совпадает с ожидаемым.
Тут же Вам и ответ, почему вторая часть с отжатием работает нормально.
Автор темы скобки верно поставил ?
Khedron оно вроде бы и понятно, но ведь первое условие то выполнилось правильно, соответственно надо перейти ко второму и проверить на И
И главное второе условие то ведь тоже соответствует.
in_c == true - ведь true же
in_p == false - ведь false же
А где И тогда ?
Тут больше на косяк интерпретатора похоже
1exan просто & это побитовые операции должны быть, соответственно if начнет ругаться
1exan скорее выдаст ошибку, что в if нельзя применять.
то есть сперва надо bool x := val1 & !val2 (или ~ вместо !)
А уже потом уже пихать в if(x) чего-то там...
прежде чем давать ответы на такие вопросы, для начала тестируется в каком нибудь дебагере Вложение 70659
потом даются рекомендации вот здесь у тебя в коде ошибки или искать ошибку в другом месте