PDA

Просмотр полной версии : St программирование



TouchS
16.02.2010, 10:00
всем, доброе время суток, при такой записи

If (a=false) Then
Elsif (b=false) Then
Elsif (c=true) Then
Elsif (d=false) Then X:=avaria;
End_if;

компилятор пишет: введите хотябы одно выражение.

что это значит и если есть возможность выложите примеры программ на St, буду очень признателен.

Ps можно ли так записать If A=o B=0 C=1 D=0 Then X:=avaria
Elsif A=1 B=1 C=1 D=0 Then X:=avaria
Elsif A=1 B=0 Then X:=vihod
Elsif A=0 B=1 Then X:=vhod ..?

Филоненко Владислав
16.02.2010, 10:34
между Then
Elsif

должен быть оператор, хотя бы ";"

P.S. Для комплексных условий: If (A=0)&&(B=0)&&(C=1)&&(D=0) Then

TouchS
16.02.2010, 11:09
между Then
If (A=0)&&(B=0)&&(C=1)&&(D=0) Then


Теперь выглядит так

VAR_OUTPUT
X: WORD;

VAR
AVARIA: WORD;
VIESD: WORD;

тело

IF(A=0)&&(B=0)&&(C=1)&&(D=0) THEN X:=AVARIA;
ELSIF (A=1)&&(B=O) THEN X:=VIESD;
END_IF

ошибки: 1.Должно быть Then перд &..?
2.Нельзя использовать константу как выход..?

lara197a
16.02.2010, 11:40
Нет операнда&-есть AND
Вместо a=false - корректнее писать NOT a

TouchS
16.02.2010, 11:45
по поводу второй ошибки, как мне взависимости от условия передавать ны выход Avaria или Viesd или т.п. (and я не могу ставить, это же логическое и, а мне надо чтобы учитывались состояния каждого входа)..?

Николаев Андрей
16.02.2010, 12:33
rontrol.x - это на ST и будет выход блока. То есть вы пытаетесь результату записать результат.
Просто поставьте еще одну переменную.

TouchS
16.02.2010, 12:43
rontrol.x - это на ST и будет выход блока. То есть вы пытаетесь результату записать результат.
Просто поставьте еще одну переменную.

Спасибо с этим разобрался.

сейчас программа выглядит так:

VAR_OUTPUT
X:WORD;
END_VAR
VAR
AVARIA: WORD;
VIESD:WORD;
VESD: WORD;
END_VAR

тело

IF(A=0)AND(B=0)AND (C=1)AND(D=0) THEN X:=AVARIA;
END_IF
IF(A=1)AND(B=1)AND (C=1)AND(D=0) THEN X:=AVARIA;
END_IF
IF(A=1)AND(B=1)AND (C=0)AND(D=1) THEN X:=AVARIA;
END_IF
IF (A=1)AND(B=0) THEN X:=VIESD;
END_IF
IF (A=1)AND(B=0) THEN X:=VESD;
END_IF

STATUS Глобальная переменная типа WORD, в режиме эмуляции так и остается STATUS т.е. на вых не подаются значения X. На входе в режиме эмуляции вручную меняю значения..?

Николаев Андрей
16.02.2010, 13:30
1. а где объявление входных переменных.
2. зачем вы присваиваете х значения других переменных?
выкладывайте всю программу целиком.

TouchS
16.02.2010, 13:42
1. а где объявление входных переменных.
2. зачем вы присваиваете х значения других переменных?
выкладывайте всю программу целиком.

1 Входные переменные это состояния входов на ПЛК 0 или 1
2 программы пока нет целой, я только начинаю осваивать CoDeSys, но есть задача, пока хочу понять принцип, мне надо чтобы в зависимости от состояний входов в БД записывалось авария такая-то или такая-то или то или иное действие выполнено и столько то раз, т.е. для начала как мне получить на выходе блока КОНТРОЛ переменную типа WORD..?

Николаев Андрей
16.02.2010, 13:51
Отладьте сначала блок как программу (как PLC_PRG).
If ... then
x:=0;
end_if;
if... then
x:=1;
end_if;
...

Убедитесь, что блок работает. И уже потом подключайте его в программе, сделав из предыдущей программы ФБ.

TouchS
17.02.2010, 09:53
подскажите как удобней реализовать условие и цикл, т.е. если да, то делаем это, если нет то возвращаемся к такому-то шагу..?

Николаев Андрей
17.02.2010, 10:35
более подробно про шаги и делаем это.. может вам вообще легче в Sfc писать если программа четко бьется на кускию

TouchS
17.02.2010, 11:15
попробую, а как в st реализовать следующее...
если а=0 и в=0 то делаем это если нет то делаем другое...еще как в ст организовывется последовательность выполнения инструкции, т.е. если а=0 и в=1 то включаем таймер и только после таймера должно х присваеваться значение x:=true?

Николаев Андрей
17.02.2010, 11:18
1. Сложное условие так и пишется
if a=0 and b=0 then
...
else
...
end_If;

А есть еще и elsif...
Почитайте справку и мануал по ST - там описано.
2. Если нужно ввести таймер - то по условию запускаете таймер.
if a=0 then
timer1(в зависимоти от таймера, Вам наверное нужно задержки включения или TP)...
if timer1.q then
...
End_if;

TouchS
17.02.2010, 11:20
и если есть, то можно пример с Cfc с условиями циклами и.т.п.

Николаев Андрей
17.02.2010, 11:22
может вам к нам на семинар???
вроде в начале марта планируется... причем расширенный...

TouchS
17.02.2010, 11:29
я бы с удовольствием, но живу не в москве..(

TouchS
17.02.2010, 11:32
ELSIF (A=1)AND(B=0) THEN timer1(IN:=GO_AWAY, PT:=T#5S);
ELSIF TIMER1.Q THEN X:=4;

это правильная запись..?

Игорь Петров
17.02.2010, 11:52
я бы с удовольствием, но живу не в москве..(
Ну, тогда приезжайте на семинар в Смоленск :)

Для ST есть стандартный 'автоматный' прием. Заводим некую целую переменную, которая выражает состояние системы. По ней делаем большой CASE и программа бьется на кучу мелких состояний, которыми очень легко управлять, программировать и отлаживать. Например, в одном состоянии взвели таймер и переключились на следующее, в нем ждем сработки таймера. Всегда можно проанализировать условия и прыгнуть на нужное состояние, просто путем изменения 1 переменной.

См. статьи Отладка прикладных ПЛК программ в CoDeSys (http://www.prolog-plc.ru/tmpl.php?content=info3.htm) начиная с часть 2.

++ Обратите внимание на оператор SEL и не придется такие сложные IF писать.

TIMER1.Q может стоять в 1 и раньше. Таймеры МЭК запускаются именно фронтами. Т.е. его надо вызвать раз с 0 на входе, затем еще раз с 1 на входе – тогда он уловит фронт и начнет отсчет.

TouchS
17.02.2010, 14:49
Function_block Wait
Var_input
End_var
Var_output
Ok:bool:=false;
End_var
Var
Zab:ton;
End_var

-----------------------

Cal Zab(in:=true)
Ld T#5s
St Zab.pt
Ld Zab.q
St Ok
Ret

подскажите, почему вот это не хочет работать, ошибок нет, но таймер не работает.

TouchS
17.02.2010, 15:23
и еще такой вопрос...за время одного цикла программы плк все время опрашивает входы и сравнивает с очередными инструкциями или нет?

magirus
17.02.2010, 17:23
1)опрос входов
2)цикл программы
3)запись выходов.
и по новой: 1), 2), 3).

TouchS
18.02.2010, 13:59
1)опрос входов
2)цикл программы
3)запись выходов.
и по новой: 1), 2), 3).

Как то можно реализовать, чтобы на определенном шаге он заново проверял состояния входов..? т.е. если я на определенном шаге присуждаю переменной значение на входе, он ей присуждает то значение которое получил вначале опроса перед выполнением цикла..?

magirus
18.02.2010, 15:55
нет.
да.
а новое в следующем цикле будет.

TouchS
19.02.2010, 08:55
при такой схеме, допустим к плк подсоеденены три датчика...
а, в, с - состояния этих датчиков

если
а=110
в=101
с=000 логическое And тогда записываем в какую-то переменную, допустим Exit.

вопрос такой - как плк запомнит предудущее состояние. т.е. вот B=101, как он узнает что а до этого было A=110...?

magirus
19.02.2010, 10:11
что то я вас не понимаю, или вы не понимаете действие логического оператора And.
аb и с - булевы переменные и могут принимать только значения 0 и 1
соответтственно Exit - тоже булева переменная.

Николаев Андрей
19.02.2010, 10:52
думаю стоит начать с изучения базовых основ по программированию или сходить на семинар...

TouchS
19.02.2010, 14:51
если есть возможность напишите как работает принцип многозадачности, из примера мало что понятно..?

Николаев Андрей
19.02.2010, 16:37
Уважаемый Touch.
Начните с малого. Разберитесь с принципами работы ПЛК в принципе, опросом входов\выходов. Вызовом программы, языком программирования.
По многозадачности все описано в мануале по CoDeSys. Но это уже для сложных задач, где нужно вычисления разносить на несвязанные подзадачи.