Программирование мониторинга аварийных ситуаций и контрольной лампы

В начале работы мы объявили переменную Error. Она призвана индицировать ошибку работы шлагбаума и вызывать немедленный останов любого движения. Запрограммируем данную логику.

Основной причиной ошибки может быть перегрузка, о чем скажет вход DriveOverload. Второй причиной будем считать недопустимо долгое движение стрелы, продолжающееся более 20 секунд.

Для реализации такого алгоритма вставим новый блок ИЛИ ( OR ). Его выход должен только устанавливать (но не сбрасывать) Error. Чтобы получить такой эффект “залипания”, используем RS триггер. Заводим сигнал с выхода блока ИЛИ на вход триггера S. Пользователь обязан увидеть сигнал ошибки и подтвердить это нажатием кнопки Action. Только тогда ошибка сбрасывается. Для этого значение переменной Action заводим на вход RS триггера - R. На первый вход блока OR подадим переменную от датчика DriveOverload. На второй вход нужно подать сигнал о превышении времени. Для этого создадим Макрос, который реализует задержку (или возьмем готовый вариант). Для создания макроса нужно щелкнуть на ветке FBD-программа, выбрать команду Добавить:

_images/n_step13.png

Введем название и описание макросхемы. Открываем схему макроса двойным щелчком мыши в обозревателе проекта и приступаем к её редактированию:

_images/step14.png

В отличие от основной схемы, на схему макроса можно поместить блоки входов/выходов макроса (на рисунке они отрисованы зеленым цветом). Эти блоки задают количество входов и выходов и их тип данных. Тип данных входа PT нужно поставить Беззнак. целый 2-байт, так как далее поставим константное значение 20000. Название этих блоков, после вставки макроса на схему будут соответствовать названиям его ножек.

Кроме этих блоков добавлен новый блок Timer. Этот блок реализует выдачу сигналов на своем выходе с заданным периодом времени. Значение периода устанавливается на входе interval в миллисекундах. Сигнал разрешения работы таймера выставляется на вход en. В нашем случае в таймере выставлен дополнительный параметр – Однократное срабатывание. То есть таймер начинает отчет времени по приходу сигнала на ножку en. По истечении времени, заданного на входе interval, таймер выдает сигнал на выход и останавливается. Логическая единица 1, поданная на вход IN, пройдет на выход Q через интервал времени, заданный на входе PT. Если вход IN перейдет обратно в 0 раньше, то Q так и останется в 0.

Вставляем созданный макрос в основную схему. Для этого активируем окно программы контроллера и перетаскиваем макрос из Обозревателя проекта на схему:

_images/step15.png

Вставленный макрос будет иметь вид, представленный на рисунке. Вводим в свойства блока имя Monitor. Имя конкретного экземпляра макроса отображается над блоком. Имя схемы, которую он реализует, отображается внутри блока. На вход PT установим константное значение 20000 (20 сек). Для этого откроем окно свойств входа, выбрав команду Свойства в контекстном меню входа или двойным кликом мыши на нем.

Как только шлагбаум начнёт открываться или закрываться (эти действия управляются переменными BarrierUp/BarrierDown) блок Monitor начнет отсчет времени. При исправной работе один из двух датчиков BarrierOpen или BarrierClosed сработает до истечения 20 секунд. В случае неисправности, сработает аварийная защита по времени. Итак, если процесс движения ворот займет больше 20 секунд, то выход Q установится в 1, что будет означать наличие ошибки. Таймер мониторинга времени должен запускаться обоими переменным привода. Поэтому объединим их по логике ИЛИ оператором OR до входа IN блока Monitor :

_images/step16.png

Последняя цепь нашего приложения будет отвечать за лампу. Как описано выше, лампа должна гореть, когда шлагбаум открывается/закрывается, и затем через заданный промежуток времени (допустим, 10 сек.) выключаться. Это значит, что нужен еще один блок задержки. Поскольку мы хотим, чтобы логический сигнал отключался через заданный промежуток времени, то нам понадобится новый макрос (с задержкой выключения). Создадим новый макрос, так как это было описано выше и нарисуем в нем схему, приведенную ниже на рисунке:

_images/step17.png

Эта схема реализует следующий алгоритм: Если IN равен 1, то выход Q равен 1. Как только IN переходит в 0, начинается отсчет времени (в миллисекундах). При достижении заданной длительности отсчет останавливается. Выход Q равен 0, если IN равен 0, иначе - 1. Таким образом, выход Q сбрасывается с задержкой PT от спада входа IN.

Вставляем этот макрос в основную схему и добавляем логику управления лампой. Для отработки аварийного режима вставим еще один оператор OR перед переменной Lamp. Это позволит ввести еще одну ветвь цепи, которая будет выполняться в случае возникновения ошибки. Другая ветвь будет нужна при нормальной работе.

Теперь на каждый вход этого оператора OR добавим по оператору AND. Первый оператор AND просто вставляется в уже существующую ветвь, которая отвечает за работу лампы в нормальном режиме. На второй вход этого AND подадим инвертированную переменную Error. В итоге, вся эта ветвь сможет повлиять на переменную Lamp, только при отсутствии признака ошибки. На вход оператора AND “ошибочной” ветви снова подадим Error, но без инверсии. Эта ветвь сможет повлиять на переменную Lamp, только при наличии ошибки. Другой вход этого оператора AND будет отвечать за мигание лампы. Полученная цепь показана на рисунке:

_images/step18.png

Здесь появляется новая переменная, которая задает период мерцание лампы. Реализация цепи для управления этой переменной показана на рисунке. Частота мерцания установлена константой на входе таймера:

_images/step19.png

Программирование логики управление завершено. Теперь необходимо привязать внутренние переменные к реальным физическим входам и выходам контроллера. Для этого выбираем в Обозревателе проекта контроллер. В нижней части обозревателя расположен Навигатор, который отображает внутреннюю структуру выделенного в дереве проекта объекта. Для Контроллера это будет список физических входов, выходов и служебных переменных.

Вытаскиваем необходимые нам элементы: Дискретные входы и Дискретные выходы :

_images/step20.png

На этом программирование нашего приложения полностью завершено.