IF (open1 = 1) AND (cls1=TRUE) AND (st1=FALSE)
THEN
op1 :=TRUE;
REPEAT op1:=TRUE;
UNTIL (cls1<>TRUE)
END_REPEAT
ELSE op1:=FALSE;
END_IF
Когда условие выполняется ПЛК перезагружается. В чем загвоздка?
IF (open1 = 1) AND (cls1=TRUE) AND (st1=FALSE)
THEN
op1 :=TRUE;
REPEAT op1:=TRUE;
UNTIL (cls1<>TRUE)
END_REPEAT
ELSE op1:=FALSE;
END_IF
Когда условие выполняется ПЛК перезагружается. В чем загвоздка?
Последний раз редактировалось Гадир; 11.07.2012 в 12:02.
Так Вы таким условием организуете бесконечный цикл. Используйте условия IF, ELSIF.
тут даже условия нет!
это явная ошибка(cls1<>TRUE)
open1:=FALSE;
Я когда писал ошибся. А в программе так:
IF (open1 = 1) AND (cls1=TRUE) AND (st1=FALSE) THEN
op1 :=TRUE;
REPEAT op1:=TRUE;
UNTIL (cls1<>TRUE)
END_REPEAT
ELSE op1:=FALSE;
END_IF
ну эта описка не сильно поможет, в приведенном коде нет ясности, меняет ли когда либо переменная cls1 свое состояние, если время её смены превышает максимальное время цикла, Вы получаете злую собаку.
ЗЫ и если честно коробят записи типа cls1=TRUE и cls1<>TRUE, для булевых можно просто написать имя переменной и если нужно выключенное состояние просто добавте NOT перед булевой переменной
Сейчас написал:
IF (open1 = 1) AND (cls1) AND (NOT st1) THEN
op1;
ELSIF (NOT cls1) THEN
op1:=FALSE;
open1:=0;
ELSE op1:=FALSE;
END_IF
Вроде работает. Но что та я сомневаюсь что она делает то что я хочу)
Последний раз редактировалось Гадир; 11.07.2012 в 12:31.
Какие-то жуткие имена переменных и почти ни слова о задаче. Что за задвижка? У меня вентили и крышки открываются примерно так:Код:motor_to_open := (motor_to_open OR button_to_open) AND NOT endswitch_open;Тут вы опять ошиблись.op1;
Последний раз редактировалось Yegor; 11.07.2012 в 14:01.
Обычные задвижки. 2 сигнала управления(Открыть Закрыть) и 3 сигнала статуса (Открыто Закрыто Мануал/автомат). С поступление команды с программы об открытие ПЛК должен замкнуть выходы если статус поменялся завершить управляющий сигнал и обнулить буфер модбус. Вот и все 3 задвижки и 4 ходовой кран(Там тот же принцип но вместо Открыть закрыть-Форвард и Реверс ).
Вот и проект. Проверял.
Всё это
можно переписать как-то так: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 булевых (по факту) переменных. Если не связано с ограничениями скады, то это страшное расточительство. Всё помещается в два регистра.
Последний раз редактировалось Yegor; 12.07.2012 в 06:46.