Всё это
можно переписать как-то так:IF ops1 = TRUE THEN
opened1 :=1;
ELSE opened1:=0;
END_IF
IF st1 = TRUE THEN
status1 :=1;
ELSE status1:=0;
END_IF
IF (open1 = 1) AND (cls1) AND (NOT st1) THEN
op1:=TRUE;
ELSIF (NOT cls1) THEN
op1:=FALSE;
open1:=0;
ELSE op1:=FALSE;
END_IFПравда, я исхожу из того, что ваше отождествление открытого и незакрытого — ошибка. Возможно, это не так. Кстати, не лишним было бы оформить это как функциональный блок чтобы не заниматься копипастой.Код:op1 := (open1 = 1 OR op1) AND NOT st1 AND NOT ops1 AND NOT cl1; open1 := 0; opened1 := SEL(ops1, 0, 1); status1 := SEL(st1, 0, 1);
А ещё у вас переменные зачем-то по два раза объявляются — и в конфигурации, и в тексте программы. Определитесь. И modbus-регистрами вы разбрасываетесь налево и направо: вместо 16 бит задействуете лишь один. У вас там в конфигурации на модбас 17 булевых (по факту) переменных. Если не связано с ограничениями скады, то это страшное расточительство. Всё помещается в два регистра.




Ответить с цитированием