PDA

Просмотр полной версии : ПЛК100 - Направте в "нужное русло"



igkondrat
26.07.2013, 18:10
Похоже я где-то не до конца уловил логику циклов и таймеров.(Язык ST)
Элементарная программа -
PROGRAM PLC_PRG
VAR
IN_0 AT %IX0.0.0:BOOL;
OUT_0 AT %QX1.0:BOOL;
TIME_OFF:TOF;
END_VAR
Программа -
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
При кратковременном сигнале на IN_0 - на 5 секунд загорается OUT_0
Но программа
IF IN_0 THEN
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
END_IF;
При замыкании IN_0 - OUT_0 и TIME_OFF.Q постоянно TRUE
Почему OUT_0 через 5 секунд не становится FALSE?
Работа с ПЛК для меня в новику и видимо где то туплю...

petera
26.07.2013, 18:42
Похоже я где-то не до конца уловил логику циклов и таймеров.(Язык ST)
Элементарная программа -
PROGRAM PLC_PRG
VAR
IN_0 AT %IX0.0.0:BOOL;
OUT_0 AT %QX1.0:BOOL;
TIME_OFF:TOF;
END_VAR
Программа -
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
При кратковременном сигнале на IN_0 - на 5 секунд загорается OUT_0
Но программа
IF IN_0 THEN
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
END_IF;
При замыкании IN_0 - OUT_0 и TIME_OFF.Q постоянно TRUE
Почему OUT_0 через 5 секунд не становится FALSE?
Работа с ПЛК для меня в новику и видимо где то туплю...
Почему? Да по тому, что ФБ TIME_OFF это программа(подпрограмма, если хотите). А так как в Вашей программе нет многозадачности, то и программный код подпрограммы ФБ TIME_OFF будет выполняться и соответственно будут обновляться его внутренние, входные и выходные переменные только в том случае, если в каждом цикле основной программы будет вызываться подпрограмма ФБ TIME_OFF.
А в варианте

IF IN_0 THEN
TIME_OFF(IN:=IN_0, PT:= T#5s);
OUT_0:=TIME_OFF.Q;
END_IF;
если переменная IN_0:=FALSE, то обращения к таймеру не происходят и он будет в "замороженном" состоянии.

З.Ы. Хотя IF IN_0 THEN... здесь вовсе не нужен, но если все таки хотите его использовать, то хотя бы так

PROGRAM PLC_PRG
VAR
TIME_OFF:TOF:=(PT:=T#5s);
IN_0: BOOL;
OUT_0: BOOL;
END_VAR
IF IN_0 THEN
TIME_OFF(IN:=1);
ELSE
TIME_OFF(IN:=0);
END_IF;
OUT_0:=TIME_OFF.Q;

igkondrat
29.07.2013, 17:54
Спасибо за ответ, некоторая ясность появилась, а "IF THEN" я взял как просто пример, на самом деле задача совсем другая, с которой без этих операций на мой взгляд не обойтись.
Если у кого есть время и желание помочь, опишу поставленную задачу, над которой и ломаю голову:
Есть паркинг, с одним "въездом/выездом", две машины (одна заезжает, другая хочет выехать) разъехаться не смогут . Для, того чтобы этой ситуации избежать, решил использовать ПЛК100.
Вот изначально НЕПРАВЕЛЬНЫЙ пример как я это хотел реализовать -
IF IN_0=TRUE (*Если подъехала машина на въезд и сработал датчик\кнопка\картоприемник принял карту и т.д.*)
THEN
OUT_0:=TRUE; OUT_5:=TRUE; (*включаем светофоры красным на въезд и выезд*)
TIME_OFF(IN:=IN_0, PT:= T#15s);
OUT_1:=TIME_OFF.Q; (*В течении 15 секунд подаем сигнал для открытия шлагбаума*)
WHILE IN_1 = FALSE (*Вход с фотоэлемента*)
DO (*Тут должно было что-то крутиться и ждать пока машина заедет на фотоэлемент*)
END_WHILE;
WHILE IN_1 = TRUE
DO .... (*Ждем выезда машины из фотоэлемента*)
END_WHILE;
OUT_1:=FALSE; (*Отключаем открытие шлагбаума (если не прошло 15 секунд по таймеру)*)
TIME_OFF(IN:=TRUE , PT:=T#15s);
OUT_2:=TIME_OFF.Q; (*Даем сигнал в течении 15 секунду на закрытие шлагбаума*)
(*Машина спускается едет к месту выезда*)
IF IN_2=TRUE (*Подъехала на выезд и сработал IN_2*)
THEN
TIME_OFF(IN:=IN_0, PT:= T#15s);
OUT_3:=TIME_OFF.Q; (*Открываем выездной шлагбаум*)
WHILE IN_3 = FALSE
DO (*Ждем наезда на светодиод как и для вьезда*)
END_WHILE;
WHILE IN_3 = TRUE
DO (*Ждем проезда светодиода*)
END_WHILE;
OUT_3:=FALSE; (*Выключаем открытие шлагбаума*)
TIME_OFF(IN:=TRUE, PT:=T#15s);
OUT_4:=TIME_OFF.Q; (*Подаем сигнал на закрытие шлагбаума в течении 15 секунд*)
END_IF;

(*Машина выехала*)
OUT_0:=FALSE; OUT_5:=FALSE; (*Выключаем светофоры, т.е. загорается зеленый*)
END_IF;
################################################## ##################
Далее идет похожий блок IF THEN, но только для выезда "в обратную сторону", единственное что похоже надо предусмотреть что, если пока идет "цикл" IF THEN на въезд, ни как не реагировать на, то что может подъехать машина на выезд (IN_4 станет TRUE) и наоборот.
Я прекрасно понимаю что описанное тут мной полная чушь, но это примерно как я это себе представлял, (да и написал бы php/perl/bash скрипт и запускал бы его раз в секунду :=) ), а как реализовать это на ПЛК - ума не приложу...
Буду признателен за любые советы.

Василий Кашуба
29.07.2013, 19:39
Если ещё не приобрели ПЛК, то могу помочь с написанием программы для ПР114.

Алексей Дмитриев
30.07.2013, 10:27
Ну очень сложно. Попробуйте написать алгоритм на Булевой алгебре. Ну очень простой. Потом реализацию на LD.

Sergey666
30.07.2013, 11:02
Сильно много операторов цикла - поймите цикл и так есть. Оператор цикла - единственный оператор , тормозящий выполнение до своего окончания.
Поэтому цикл в программе для ПЛК надо организовывать только когда НЕОБХОДИМО ВЫПОЛНИТЬ ВСЕ ОПЕРАЦИИ В ТЕКУЩЕМ "МЕСТЕ" ПРОГРАММЫ.
В вашем случае просто - опишите алгоритм словами . Дальше пишите текст в ST и все.(как-бы переводя из языка русского в язык ST) .

З.Ы Вашу задачу можно строк в 10-20 решить.

igkondrat
30.07.2013, 11:02
Если ещё не приобрели ПЛК, то могу помочь с написанием программы для ПР114.
Да этот ПЛК как год лежал без дела, вот и подумал что на нем можно реализовать...

igkondrat
30.07.2013, 11:25
Ну собственно в комментариях, к описанной мною "индуской" программы, я и попытался описал алгоритм своими словами. Единственное, что мне пришло в голову, это использовать промежуточные переменные и при дальнейшем использовании "IF THEN", так же сравнивать с их значениями. К примеру, машина въехала, присвоить переменной X значение один, и до тех пор пока она не выехала (X станет 0) не реагировать на сторонние сигналы...
По поводу "Оператор цикла - единственный оператор , тормозящий выполнение до своего окончания" - мне именно это и необходимо сделать, чтобы провести все операции от открытия шлагбаума на въезд и закрытие на выезд.

З.Ы Вашу задачу можно строк в 10-20 решить.
Если Вы считаете это элементарной задачей - с радостью приму Вашу помощь =)))

Sergey666
30.07.2013, 11:42
Если будет время баловатся...

Валенок
30.07.2013, 11:52
Ну Вам же предложили - опишите действия и состояния исполнителей во всех возможных ситуациях не думая о програмировании
Типа:
1.Нет машин нигде
2.Только на выезде подъехала машина1
3.Ждем карточку1 15сек
4.Машина1 в процесса выезда
5.Только на въезде подъехала машина2
6.Ждем карточку2 15сек
7.Машина2 в процесса въезда
8.Одновременно подошли машина1 и машина2
..

igkondrat
30.07.2013, 13:25
Ну Вам же предложили - опишите действия и состояния исполнителей во всех возможных ситуациях не думая о програмировании
Типа:
1.Нет машин нигде
2.Только на выезде подъехала машина1
3.Ждем карточку1 15сек
4.Машина1 в процесса выезда
5.Только на въезде подъехала машина2
6.Ждем карточку2 15сек
7.Машина2 в процесса въезда
8.Одновременно подошли машина1 и машина2
..
Да уж, по-моему я Ваш ник =) . Я не могу для себя уяснить как сделать весь цикл, с ожидание, т.е. у нас есть несколько ситуаций -
1. Нет ни одной машины = Все входы/выходы разомкнуты.
2. Машина подъехала на въезд (Прислонил карточку)
2.1. Даем сигнал 15 секунд на открытие шлагбаума
2.2. Замыкаем два выхода на включение красного сигнала светофора на въезде и на выезд
2.3. Ждем срабатывания фотоэлемента, что машина начала проезжать шлагбаум.
2.4. Ждем отключения фотоэлемента, что машина проехала шлагбаум.
2.5. Только если прошли пункты 2.1. 2.3. 2.4. даем сигнал 15 секунд на закрытие шлагбаума.
2.6. Ждем срабатывания датчика на выезд (петля)
2.7. В течении 15 секунд даем сигнал на открытие шлагбаума
2.8. Как и пункты 2.2. 2.3. но только с фотоэлементом на выезд.
2.9. Даем сигнал на закрытие шлагбаума.
2.10. Выключаем светофоры, т.е. размыкаем два выхода.
3. Машина подъехала на выезд
3.1 - 3.10. аналогично 2.1 - 2.10. в обратном порядке.
4. Обе машины подъехал одновременно - эта ситуация исключается, так как с точность в доли секунды этого произойти не может.
Ничего умнее как идти путем с переменными состояния я не придумал -
a:BOOL; (*Показатель въезда машины*)
b:BOOL; (*Показатель срабатывания фотоэлемента на въезд*)
TIME_OFF_vzd:TOF:=(PT:=T#15s);(*Задержка выключения*)
TIME_ON_vzd:TOF:=(PT:=T#15s);(* Задержка выключения *)
IN_0 AT %IX0.0.0:BOOL;(*Считыватель карт въезд*)
IN_1 AT %IX0.0.1:BOOL;(*Фотоэлемент въезд*)
IN_2 AT %IX0.0.2:BOOL;(*Датчик (петля на выезд) *)
OUT_0 AT %QX1.0:BOOL;(*Открытие шлагбаума*)
OUT_1 AT %QX2.0:BOOL;(*Закрытие шлагбаума *)
OUT_2 AT %QX3.0:BOOL; (*Красный светофор въезд *)
OUT_5 AT %QX6.0:BOOL;(*Красный светофор выезд *)
и т.д.
IF IN_0=TRUE AND a=FALSE THEN
TIME_OFF_vzd(IN:=1);
OUT_0:=1; OUT_5:=1; (*Зажигаем светофоры на вьезде и выеде*)
a:=TRUE; (*Состояния въезда машины *)
ELSE
TIME_OFF_vzd(IN:=0);
END_IF;
OUT_1:=TIME_OFF_vzd.Q; (*Открываем шлагбаум 15s*)

IF IN_1=TRUE AND b=FALSE (*Сработал фотоэлемент но ранее не срабатывал*)
THEN
IF a=TRUE THEN (*Машина на въезд*)
b:=TRUE; (*Сработал фотоэлемент*)
TIME_ON_vzd(IN:=0);
END_IF;
END_IF;

IF IN_1=FALSE AND b=TRUE (*если выключен фотоэлемент, но ранее он был включен, т.е. машина проехала *)
THEN
IF a=TRUE THEN
b:=FALSE; (*Машина выехала из фотоэлемента*)
TIME_ON_vzd(IN:=1);
END_IF;
END_IF;

OUT_2:=TIME_ON_vzd.Q; (Закрываем шлагбаум)
и т.д.
Но это все равно не работает (OUT_2 постоянно TRUE).

Sergey666
30.07.2013, 15:06
Если что-то включил , то надо не забыть выключить , а так ход мислей правильный.

Есть еще (так для справки ) оператор CASE.

Подъехал , сунул карточку , шлакбаум открылся - поехал - шлакбаум закрылся и при этом надо заблокировать "Встречку" можно выделить в функциональный блок или подпрограмму.
Таймер на OFF - зачем , условие включает флаг,переменная , флаг запустил таймер (ТОН) , таймер оттикал , включил или выключил и выключил "Запускающую" переменную .

Василий Кашуба
30.07.2013, 23:19
Если ещё не приобрели ПЛК, то могу помочь с написанием программы для ПР114.
Программа для ПР114 готова, проверял на эмуляторе. Для моего варианта нужны четыре сдвоенных фото датчика или восемь одинарных.

Алексей Дмитриев
30.07.2013, 23:32
Ну и что мешает тупо повторить алгоритм на CoDeSys?

Василий Кашуба
30.07.2013, 23:33
Ну и что мешает тупо повторить алгоритм на CoDeSys?
В СТ не силён.

amn
31.07.2013, 00:55
Написал в виде функционального блока. Программа работает для въезда машин. Для выезда немного не доделал. Там есть коментарии, думаю разберетесь. Есть простенькая визуализация.

Василий Кашуба
31.07.2013, 07:56
Программа для ПР114 готова, проверял на эмуляторе. Для моего варианта нужны четыре сдвоенных фото датчика или восемь одинарных.
Пример выложил в "Области применения ПР114" http://www.owen.ru/forum/showthread.php?t=12687&p=115839&viewfull=1#post115839

Алексей Дмитриев
31.07.2013, 09:08
В СТ не силён.
Не надо на ST, для этого в CoDeSys есть FBD или прямой его аналог - LD.
Зачем чисто булевский алгоритм описывать на ST. Не предназначен этот язык для таких целей.

Sergey666
31.07.2013, 09:49
ST среди МЭК языков программирования это как Русский язык , Великий и могучий . И предназначен он (ST) для всего .
Потуги на FBD,LD и прочем просто смешны...
Стартер на ST работает , а его на FBD , LD совращают , он просил "Направить в нужное русло" , так не направляйте не туда , еще ПРка эта , туды её в качель.

Валенок
31.07.2013, 11:11
Короче - нужно с начала.
Был большой огненный шар и такая схема ?

Василий Кашуба
31.07.2013, 11:21
Не надо на ST, для этого в CoDeSys есть FBD или прямой его аналог - LD.
Зачем чисто булевский алгоритм описывать на ST. Не предназначен этот язык для таких целей.
Прямой аналог CFC, LD это релейная логика.

Василий Кашуба
31.07.2013, 11:23
ST среди МЭК языков программирования это как Русский язык , Великий и могучий . И предназначен он (ST) для всего .
Потуги на FBD,LD и прочем просто смешны...
Стартер на ST работает , а его на FBD , LD совращают , он просил "Направить в нужное русло" , так не направляйте не туда , еще ПРка эта , туды её в качель.
Предложили бы свой вариант, хаять все могут.

amn
31.07.2013, 12:00
Исправленная версия. Теперь работает в двух направления. Для моего варианта нужны два фотодатчика один на въезде, другой на выезде. В визуализации входы расположены в левом столбце. В самом начале надо включить "фотоэлемент на въезде" и "фотоэлемент на выезде". При пересечении машиной луча фотодатчика он сработает после того, как машина проедет (для имитации работы фотоэлемента или карты надо на него нажать и отжать).

Василий Кашуба
31.07.2013, 12:17
Исправленная версия. Теперь работает в двух направления. Для моего варианта нужны два фотодатчика один на въезде, другой на выезде. В визуализации входы расположены в левом столбце. В самом начале надо включить "фотоэлемент на въезде" и "фотоэлемент на выезде". При пересечении машиной луча фотодатчика он сработает после того, как машина проедет (для имитации работы фотоэлемента или карты надо на него нажать и отжать).
Ещё нужно править, после проезда машины, светофор не переключается в исходное состояние.

amn
31.07.2013, 12:33
Все работает, Вы забыли нажать-отжать фотоэлемент после того как машина выедет. Да, там надо дождаться пока закроется шлагбаум. Надо будет поправить.

kolyan
31.07.2013, 13:56
ST среди МЭК языков программирования это как Русский язык , Великий и могучий . И предназначен он (ST) для всего .
Потуги на FBD,LD и прочем просто смешны...
Стартер на ST работает , а его на FBD , LD совращают , он просил "Направить в нужное русло" , так не направляйте не туда , еще ПРка эта , туды её в качель.

Согласен на 100%!

igkondrat
31.07.2013, 14:36
Всем огромное спасибо! Отдельное спасибо amn.
Я тоже написал рабочий алгоритм, правда в 210 строк =), но как оказалась мой, а так же алгоритм от amn, не до конца описывает все возможные варианты в реальной ситуации.
А именно -
1) Если машина проехала фотоэлемент быстрее чем открылся шлагбаум (15секунд), то шлагбаум не закроется.
2) Если человек передумал (прислонил карточку, но вспомнил, что забыл документы дома =) ) необходимо закрыть шлагбаум и сбросить все значение по timeout.
3) Так же необходима пожарная "кнопка" - включается красный светофор на въезд, зеленый на выезд, и открываются оба шлагбаумы.
И это только первые пункты в которые меня "ткнули носом"
Ну я думаю справлюсь с этим .
А вообще на будущее, на чем лучше реализовать такого рода задач? (В смысле ПЛК ПР и т.п.)

Sergey666
31.07.2013, 14:42
Шлакбаум надо открывать не на 15 сек , а до факта проезда автомобиля (независимо быстро или медленно).

Василий Кашуба
31.07.2013, 15:07
Всем огромное спасибо! Отдельное спасибо amn.
Я тоже написал рабочий алгоритм, правда в 210 строк =), но как оказалась мой, а так же алгоритм от amn, не до конца описывает все возможные варианты в реальной ситуации.
А именно -
1) Если машина проехала фотоэлемент быстрее чем открылся шлагбаум (15секунд), то шлагбаум не закроется.
2) Если человек передумал (прислонил карточку, но вспомнил, что забыл документы дома =) ) необходимо закрыть шлагбаум и сбросить все значение по timeout.
3) Так же необходима пожарная "кнопка" - включается красный светофор на въезд, зеленый на выезд, и открываются оба шлагбаумы.
И это только первые пункты в которые меня "ткнули носом"
Ну я думаю справлюсь с этим .
А вообще на будущее, на чем лучше реализовать такого рода задач? (В смысле ПЛК ПР и т.п.)
Реализовать можно и на ПР, и на ПЛК. Дешевле на ПР.

Алексей Дмитриев
02.08.2013, 10:38
Согласен на 100%!
Ребята, Вы вообще представляете что такое релейный (Булевский) алгоритм? Образование-то базовое какое у вас? А-то "как русский - великий и могучий"! Пафосно и смешно, право-слово. Для той задачи - LD - самое оно.
На бейсикоподобных языках могут писать даже домохозяйки, одно-но - оно почти всегда не работает так как должно, поэтому алгоритм обрастает жутко при отладке.

kolyan
02.08.2013, 11:57
Ребята, Вы вообще представляете что такое релейный (Булевский) алгоритм? Образование-то базовое какое у вас? А-то "как русский - великий и могучий"! Пафосно и смешно, право-слово. Для той задачи - LD - самое оно.
На бейсикоподобных языках могут писать даже домохозяйки, одно-но - оно почти всегда не работает так как должно, поэтому алгоритм обрастает жутко при отладке.

Даже отвечать не хочется, ей Богу!

Алексей Дмитриев
06.08.2013, 13:11
Прямой аналог CFC, LD это релейная логика.
Ошибаетесь - CFC в отличие от FBD редактор непрерывных функциональных схем не использует цепи, но дает возможность свободно размещать компоненты и соединения - и все!
Чем LD отличается от FBD кроме графического представления? В принципе - ничем. Кому, что нравится.
В принципе все они LD, CFC, FBD - одного поля ягоды.

Василий Кашуба
06.08.2013, 21:22
Ошибаетесь - CFC в отличие от FBD редактор непрерывных функциональных схем не использует цепи, но дает возможность свободно размещать компоненты и соединения - и все!
Чем LD отличается от FBD кроме графического представления? В принципе - ничем. Кому, что нравится.
В принципе все они LD, CFC, FBD - одного поля ягоды.
Это вы ошибаетесь, Овену Лоджику, как раз прямой аналог CFC.

Алексей Дмитриев
07.08.2013, 09:09
Да ничем они принципиально не отличаются. Программы транслируются как туда, так и сюда без проблем.

amn
08.08.2013, 01:15
Если кому-нибудь еще нужно. Выкладываю последнюю версию. Переделал все заново. Написано что-то на CFC, а что-то на ST. Использовал 8 датчиков. По два на каждом шлагбауме и по два перед выездами из тоннеля. Не доделана ситуация, когда машина застряла на шлагбауме, и пока нет пожарной кнопки.