PDA

Просмотр полной версии : Открытие задвижки в ST



Гадир
11.07.2012, 09:09
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, 11:15
Так Вы таким условием организуете бесконечный цикл. Используйте условия IF, ELSIF.

capzap
11.07.2012, 11:22
тут даже условия нет!

(cls1<>TRUE)
open1:=FALSE; это явная ошибка

Гадир
11.07.2012, 12:01
Я когда писал ошибся. А в программе так:
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

capzap
11.07.2012, 12:06
:) ну эта описка не сильно поможет, в приведенном коде нет ясности, меняет ли когда либо переменная cls1 свое состояние, если время её смены превышает максимальное время цикла, Вы получаете злую собаку.

ЗЫ и если честно коробят записи типа cls1=TRUE и cls1<>TRUE, для булевых можно просто написать имя переменной и если нужно выключенное состояние просто добавте NOT перед булевой переменной

Гадир
11.07.2012, 12:14
Сейчас написал:
IF (open1 = 1) AND (cls1) AND (NOT st1) THEN
op1;
ELSIF (NOT cls1) THEN
op1:=FALSE;
open1:=0;
ELSE op1:=FALSE;
END_IF
Вроде работает. Но что та я сомневаюсь что она делает то что я хочу)

Yegor
11.07.2012, 13:52
Какие-то жуткие имена переменных и почти ни слова о задаче. Что за задвижка? У меня вентили и крышки открываются примерно так:
motor_to_open := (motor_to_open OR button_to_open) AND NOT endswitch_open;
op1;Тут вы опять ошиблись.

Гадир
11.07.2012, 23:42
Обычные задвижки. 2 сигнала управления(Открыть Закрыть) и 3 сигнала статуса (Открыто Закрыто Мануал/автомат). С поступление команды с программы об открытие ПЛК должен замкнуть выходы если статус поменялся завершить управляющий сигнал и обнулить буфер модбус. Вот и все 3 задвижки и 4 ходовой кран(Там тот же принцип но вместо Открыть закрыть-Форвард и Реверс ).

Гадир
11.07.2012, 23:49
Вот и проект. Проверял.

Yegor
12.07.2012, 06:32
Всё это

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 булевых (по факту) переменных. Если не связано с ограничениями скады, то это страшное расточительство. Всё помещается в два регистра.

Гадир
13.07.2012, 13:19
Если не связано с ограничениями скады, то это страшное расточительство. Всё помещается в два регистра.

Знаю можно поместить в 2 регистра слова статуса и слова управления. А потом из делфи с функцией setbit управлять и isbitset получать статусы. Но так удобнее))

Гадир
13.07.2012, 13:22
Всё это
можно переписать как-то так:
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);
Потом я сам не пойму что написал) А насчет блоков, вы правы.