Быстрый старт

_images/flash.png

В этом разделе приведен пример создания проекта для автоматизации, сопровождаемый пошаговыми инструкциями.

Пример - программирование системы управления автоматическим шлагбаумом

Начнем с постановки задачи. Будем выполнять работу небольшими и легкими в реализации частями. В зависимости от темпа работы, создание проекта с нуля займет от 30 до 60 минут.

Постановка задачи: Стрела шлагбаума имеет два конечных положения – полностью поднята (открыта) и полностью закрыта. Концевым датчикам соответствуют входы контроллера, которые мы поименуем как BarrierOpen и BarrierClosed.

Выходы контроллера BarrierUp и BarrierDown управляют двигателем подъема и опускания стрелы шлагбаума соответственно. Пользователь открывает, либо закрывает шлагбаум одной кнопкой (вход Action). Стрела либо поднимается, либо опускается, в зависимости от текущего положения. Нажатие кнопки при движении стрелы должно вызывать ее незамедлительную остановку.

Необходимо предусмотреть защиту. Движение должно быть остановлено при возникновении перегрузки привода (вход DriveOverload), например, при механическом заклинивании. Повторным нажатием кнопки управления пользователь также должен экстренно останавливать движение.

Контрольная лампа движения стрелы (Lamp) должна автоматически включаться в момент начала движения и выключаться через некоторое время после окончания движения. Должен вырабатываться флаг ошибки по перегрузке привода, а также, если процесс движения занимает недопустимо длительное время.

При любых проблемах движение должно прекратиться немедленно и контрольная лампа должна мигать до тех пор, пока кнопка управления не будет нажата еще раз.

Создание проекта

Запускаем редактор. Для начала, необходимо сориентироваться в среде программирования.

_images/14.png

В верхней части окна расположена панель переключения режимов программы. Она состоит из четырех вкладок:

  • Начало
  • Проекты
  • Редактор
  • Диспетчер

И две кнопки:

  • Справка
  • Настройки

При старте программы по умолчанию открывается вкладка Начало, в которой находится лента с последними новостями, последними видеоуроками и список недавно открытых проектов.

Все проекты по умолчанию хранятся в папке текущего пользователя. Для начала создадим новый проект. Для этого перейдем на вкладку Проекты и выберем команду ть Копировать Новый проект`:

_images/n_step2.png

В появившемся окне свойств проекта укажем его имя, разработчика (при необходимости),описание проекта и нажмем кнопку ОК. Новый проект появится в списке, и автоматически откроется вкладка Редактор:

_images/6.png

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

_images/n_step4.png

В появившемся окне выбираем тип контроллера, который мы хотим использовать для работы. Для этого проекта выберем контроллер Z400 и нажмем кнопку Добавить.

В ветке Программы появился новый контроллер. У этого контроллера присутствует подчиненный объект - FBD-программа. Именно в ней и происходит создание алгоритма работы. Для редактирования FBD-программы делаем на ней двойной клик или выбираем команду Открыть в контекстном меню:

_images/78.png

Объявление переменных

Теперь пора объявить входные и выходные переменные. Список переменных располагается в нижней части схемы в виде таблицы:

_images/89.png

Для добавления новой переменной нажмем кнопку + на панели инструментов, после чего откроется диалог редактирования свойств переменной:

_images/n_step5.png

Нам необходимы входные переменные BarrierOpen, BarrierClosed, DriveOverload для датчиков состояния шлагбаума и Action для кнопки управления шлагбаума. В качестве выходных переменных нам потребуются BarrierUp и BarrierDown для перемещения стрелы и Lamp для сигнальной лампы движения. Все эти переменные являются логическими.

Программирование привода стрелы шлагбаума

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

Для начала просто вставим блок, затем нарастим соответствующую логику управления. Выберем на панели Блоки функциональный блок RS-триггер и перетащим его на схему:

_images/910.png

Если необходимо добавить на схему несколько одинаковых блоков, то перетаскивать с панели блок необходимо с помощью правой кнопки мыши или удерживая одновременно кнопку Shift. В этом случае выбранный блок как бы «повиснет» на указатели мыши, и его можно вставлять неограниченное количество раз простым щелчком мыши на схеме. Для выхода из режима вставки блока надо нажать Esc или кнопку Режим выделения на панели рисования.

Дважды щелкнем по вставленному блоку и откроем редактор свойств. Установим имя блока RSBarrierUp , поставим галочку в окне Вывод заголовка, чтобы показывать название и нажмем кнопку ОК:

_images/5.png

Начнем добавлять логику управления. Переменную Action подадим на вход S. Для этого надо выделить её в списке переменных и «перетащить» на схему. На схеме добавится блок для управления переменной.

Логическая переменная Action имеет значение 1, если управляющая кнопка шлагбаума нажата и удерживается. Все действия в нашей программе должны происходить четко при нажатии кнопки, то есть по переднему фронту сигнала. Чтобы детектировать его, используем соответствующий блок Передний фронт. Находим его в панели блоков (группа Битовые операции) и вытаскиваем на схему. Далее соединяем соответствующие выходы связями. Для создания простой связи достаточно выделить нужный вход или выход блока и протянуть связь до нужного выхода или входа. Соединение выходов с выходами и входов с входами не допускается. После создания связей схема будет выглядеть следующим образом:

_images/step6.png

Поскольку одной и той же кнопкой стрела и поднимается и опускается, то нужно как-то различать текущее положение и что делать дальше. Введем вспомогательную логическую переменную NextUp. Если она имеет значение 1, то стрела будет открываться. Объединим ее по логике И (AND) с переменной Action. Выберем в панели блоков элемент И группы Битовые операции и перетащим его на схему. Соединим элементы связями, как показано на рисунке:

_images/step7.png

Следующим шагом мы подключим переменную BarrierUp привода стрелы к выходу Q блока RS. Для этого вытаскиваем нужную переменную на схему и так-как эта переменная должна записываться, меняем тип блока переменной на Запись. Для этого надо двойным щелчком мыши вызвать окно редактирования свойств блока и выбрать нужный параметр:

_images/n_step6.png _images/step9.png

В нашей задаче определены три возможных причины останова процесса открытия стрелы. Поставим оператор ИЛИ (OR) с тремя входами, перед входом R блока RS. Этот оператор соберет все три причины на свои входы: Датчик BarrierOpen сообщает о достижении стрелы шлагбаума верхнего положения. Эта переменная уже объявлена и может быть подключена к одному из входов оператора OR, так как мы уже делали ранее. Пользователем нажата кнопка управления во время работы привода BarrierUp. Эта логика будет реализована блоком И (AND) с двумя входами: переменной кнопки Action, детектором переднего фронта и переменной BarrierUp.

Ошибка движения. Она должна генерироваться при перегрузке привода стрелы, либо если процесс открытия/закрытия недопустимо затянулся. Переменная ошибки будет иметь название Error.

Наша первая цепь готова:

_images/step10.png

Вторая цепь будет отвечать за процесс закрытия ворот. Она будет сходна с первой. Давайте скопируем ее. Выделим ее, в меню редактирования выберем команду Копировать (или клавиши Ctrl`+:guilabel:`C), затем команду Вставить (или клавиши Ctrl`+:guilabel:`V). Вторая цепь появилась ниже первой. Переместим ее ниже первой и заменим переменные, отвечающие за открытие на переменные, отвечающие за закрытие. Замена переменных в блоках управления переменных делается в окне их свойств.

_images/step11.png

Обратите внимание на то, в этой цепи нужно применить инверсное значение переменной NextUp. Добавим инверсию. Для этого выделим нужный вход, откроем его свойства и установим флажок Инверсия. Инверсный вход будет отображаться с кружочком.

Третья цепь нужна для установки вспомогательной переменной NextUp, отображающей направление движения. Новую цепь вставим ниже существующих. Затем вставим уже знакомый нам RS и назовем его RSNextDirection. Подключим переменную NextUp на выход этого блока. Направление предстоящего движения может быть предсказано по предыдущему движению. Так, если переменная BarrierOpen, отвечающая за поднятие стрелы, имеет задний фронт (перепад сигнала с 1 в 0), мы знаем, что процесс открытия успешно завершен. Следовательно, в дальнейшем стрела будет опускаться. В свою очередь, этот процесс завершится задним фронтом переменной BarrierDown. Эти переменные надо подать на входы блока RS через детекторы фронтов Задний фронт.

_images/step12.png

Это все, что нам потребуется для управления шлагбаумом. Теперь осталось сделать управление лампой и контроль аварийных ситуаций.

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

В начале работы мы объявили переменную 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

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

Проверка и отладка программы

Для проверки программы необходимо выполнить команду Проверка из панели команд. Если при выполнении этой команды будет активно окно макросхемы, то проверка будет производиться только для этой схемы. Если будет активно окно FBD-программы контроллера, то проверка будет производиться для всего контроллера в целом.

В случае ошибок будет выдано соответствующее предупреждение. Ошибочный элемент (блок, связь, переменная) будет помечен красным цветом. В противном случае, в панели Вывод появится сообщение об успешном окончании проверки.

Если ошибок в проекте не обнаружено, можно запустить проект в режиме симуляции, чтобы проверить правильность алгоритма работы.

Для этого создадим виртуальную карту сети, где расположим контроллер. Нажмем правой кнопкой мыши на группе Сети в Обозревателе проекта и выберем пункт Добавить:

_images/1516.png

Далее необходимо выбрать объект Карта сети, ввести имя и нажать Добавить.

Добавить уже существующий контроллер на карту сети можно перетащив его из панели обозревателя непосредственно на схему Карта сети:

_images/1617.png

Теперь, щелкнув по контроллеру на Карте сети правой кнопкой мыши, в контекстном меню выберем пункт Симулятор. Редактор перейдет в режим симуляции. В этом режиме запрещено любое редактирование схемы и переменных. Управление режимом симуляции осуществляется с помощью команд Стоп, Запустить, Шаг, Пауза:

_images/n_step62.png

Команда Стоп немедленно останавливает симуляцию и переводит программу в режим редактирования. Команда Запустить стартует симуляцию. В процессе работы симулятора на экране отображаются значения входов и выходов блоков.

Подробнее узнать о загрузке программ в контроллер или режиме отладки можно в следующих разделах:

см. “Проверка и компиляция проекта”

см. “Отладка в режиме симуляции”

см. “Загрузка программ в контроллер и создание сети, режим моста”