PDA

Просмотр полной версии : Почему эмулятор PLC выполняет одну и ту же логику по-разному? CoDeSys V2.3



Дмитрий_Кирсанов
28.09.2021, 19:55
Использую IDE CoDeSys V2.3

Исходники в приложении.

Почему эмулятор PLC выполняет одну и ту же логику по-разному?

Пример1:


IF NOT (Sensor1 AND Sensor2)
THEN
Valve1 := TRUE;
Valve2 := FALSE;
ELSIF (Sensor1 AND NOT(Sensor2))
THEN
Valve1 := FALSE;
Valve2 := TRUE;
ELSE
Valve1 := FALSE;
Valve2 := FALSE;
END_IF;

Пример1. Таблица выполнения:


Sensor1 Sensor2 Valve1 Valve2
0 0 1 0
0 1 1 0
1 0 1 0
1 1 0 0

Пример2:


IF NOT (Sensor1 AND Sensor2)
THEN
Valve1 := TRUE;
Valve2 := FALSE;
END_IF;

IF (Sensor1 AND NOT(Sensor2))
THEN
Valve1 := FALSE;
Valve2 := TRUE;
END_IF;

IF (Sensor1 AND Sensor2) OR (NOT(Sensor1) AND Sensor2)
THEN
Valve1 := FALSE;
Valve2 := FALSE;
END_IF;

Пример2. Таблица выполнения:


Sensor1 Sensor2 Valve1 Valve2
0 0 1 0
0 1 0 0
1 0 0 1
1 1 0 0

capzap
28.09.2021, 20:03
а где же это одинаковая логика, в первом случае выполняется только одно из условий, а во втором случае каждое условие проверяется отдельно. И если условие NOT (Sensor1 AND Sensor2) это все варианты кроме когда оба ТРУ, то второй вариант последнее условие переписывает повторно значения переменных

Дмитрий_Кирсанов
28.09.2021, 20:23
а где же это одинаковая логика, в первом случае выполняется только одно из условий, а во втором случае каждое условие проверяется отдельно. И если условие NOT (Sensor1 AND Sensor2) это все варианты кроме когда оба ТРУ, то второй вариант последнее условие переписывает повторно значения переменных

Логика одинаковая.

В случае см. Пример1.



Sensor1 Sensor2 Valve1 Valve2
1 0 1 0


Предполагается выполнение:


ELSIF (Sensor1 AND NOT(Sensor2))
THEN
Valve1 := FALSE;
Valve2 := TRUE;

Но по-факту не так.

capzap
28.09.2021, 20:28
Но по-факту не так.

https://ru.stackoverflow.com/questions/588352/%D0%9A%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-else-if-%D0%B8-%D0%B2-%D1%87%D0%B5%D0%BC-%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D0%B5-%D0%BE%D1%82-if/588359

Дмитрий_Кирсанов
28.09.2021, 20:44
https://ru.stackoverflow.com/questions/588352/%D0%9A%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-else-if-%D0%B8-%D0%B2-%D1%87%D0%B5%D0%BC-%D0%BE%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D0%B5-%D0%BE%D1%82-if/588359

Всё равно не понятно, что вы имеете в виду.

Могли бы выложить код, который выполняет логику из примера №2, но только с использование IF-ELSIF-ELSE?

capzap
28.09.2021, 20:49
в таком виде ни как не повторить

ЗЫ


Valve1 := NOT Sensor1 AND NOT Sensor2;
Valve2 := Sensor1 AND NOT Sensor2;

Sergey666
28.09.2021, 22:29
И первое условие что TRUE и выполняется NOT(True AND False)= True, в чем вопрос?