Да уж, по-моему я Ваш ник =) . Я не могу для себя уяснить как сделать весь цикл, с ожидание, т.е. у нас есть несколько ситуаций -
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).