Если будет время баловатся...
Если будет время баловатся...
Ну Вам же предложили - опишите действия и состояния исполнителей во всех возможных ситуациях не думая о програмировании
Типа:
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).
Если что-то включил , то надо не забыть выключить , а так ход мислей правильный.
Есть еще (так для справки ) оператор CASE.
Подъехал , сунул карточку , шлакбаум открылся - поехал - шлакбаум закрылся и при этом надо заблокировать "Встречку" можно выделить в функциональный блок или подпрограмму.
Таймер на OFF - зачем , условие включает флаг,переменная , флаг запустил таймер (ТОН) , таймер оттикал , включил или выключил и выключил "Запускающую" переменную .
Ну и что мешает тупо повторить алгоритм на CoDeSys?
Ошибаетесь - CFC в отличие от FBD редактор непрерывных функциональных схем не использует цепи, но дает возможность свободно размещать компоненты и соединения - и все!
Чем LD отличается от FBD кроме графического представления? В принципе - ничем. Кому, что нравится.
В принципе все они LD, CFC, FBD - одного поля ягоды.
Написал в виде функционального блока. Программа работает для въезда машин. Для выезда немного не доделал. Там есть коментарии, думаю разберетесь. Есть простенькая визуализация.