Практическая работа №1 Разработка системы управления и программирование ПЛК на языке LD Постановка задачи Продукт с помощью загрузочного транспортера 1 попадает в бункер 2. Транспортер работает до тех пор, пока вес продукта в бункере не станет больше заданного. Затем транспортер 1 останавливается, срабатывает задвижка 3 и включается транспортер 4. После разгрузки бункера, задвижка закрывается, транспортер 4 останавливается и загрузка начинается вновь. Постановка задачи На основании заданной технологической схемы и описания технологического процесса разработать: • принципиальную электрическую схему автоматического управления технологической установкой; • прикладную программу для ПЛК. Схема и программа должна предусматривать: • запуск всех машин и механизмов в последовательности, направленной против движения продукта; • остановку всех машин и механизмов в последовательности, совпадающей с направлением движения продукта; • остановку поточных линий по команде «рабочий стоп» с целью очистки тракта; • режим пуско-наладочных работ; • звуковой или световой сигнал при пуске сложных технологических установок; • аварийное отключение (при аварийном отключении одной из машин, должны остановится без выдержки времени все машины, работающие на ее загрузку, а с выдержкой времени все машины работающие на отгрузку). Разработка принципиальной схемы Транспортеры будут приводится в движение нереверсивными асинхронными электроприводами (двигатели M1 и M2). Защита всех цепей осуществляется автоматическим выключателем SF1. Тепловая защита двигателей – тепловыми реле KK1 и КК2. Подача напряжения питания на двигатели производится магнитными пускателями KM1 и KM2. Контроль вращения роторов (и движения транспортеров) выполняется с помощью реле контроля скорости SR1 и SR2. Разработка принципиальной схемы Электропривод задвижки – реверсивный. Подача питания на двигатель осуществляется двумя магнитными пускателями КМ3 и КМ4. Привод снабжен концевыми выключателями SQ1 и SQ2, срабатывающими в положениях «закрыто» и «открыто» соответственно. Схема управления пускателями (ручное управление, пуско-наладочные работы) Автоматический выключатель SF2 защищает цепи управления. Переключатель SA1 – для выбора режима управления (ручн. – авт.). Пуск транспортеров производится кнопками SB2 и SB4. Команды на закрытие и открытие задвижки - кнопками SB5 и SB6. Все пусковые кнопки шунтируются контактами пускателей. Кнопки SB1, SB3 останавливают транспортеры. Задвижка останавливается в крайних положениях концевыми выключателями SQ1 и SQ2. Для пускателей KM3 и КМ4 предусмотрена взаимная блокировка для предотвращения одновременного срабатывания. Цепи пускателей включают контакты тепловых реле. Управление пускателями от контроллера Контроллер управляет пускателями через свои дискретные выходы релейного типа. Выходы сгруппированы. В автоматическом режиме управления напряжение фазы подается на общий группы. Сигнализация Дискретным выходом DO5 контроллер включает световую (лампа HL1) и звуковую (ревун) сигнализацию. Входные цепи Контроллер имеет встроенный источник питания для питания дискретных входов. Измерительный преобразователь (весы) – генераторного типа Полная схема Разработка программы Входные и выходные переменные в CoDeSys объявляются и «привязываются» к реальным входам контроллера во вкладке Resource, в пункте PLC Configuration. Типы и количество входов и выходов зависят от контроллера. Глобальные переменные Мы будем строить имитационную систему (которую, однако, очень легко переделать в реальную), поэтому входные и выходные переменные объявим как глобальные: (*Входы:*) shiber_opened: BOOL:=FALSE; (* «шибер открыт», дискретный вход 1 *) shiber_closed: BOOL:=FALSE; (* «шибер закрыт», дискретный вход 2 *) speed2: BOOL:=FALSE; (* сигнал с РКС привода второго транспортера, дискретный вход 3*) speed1:BOOL:=FALSE; (* сигнал с РКС привода первого транспортера, дискретный вход 4*) weight:REAL:=0; (* вес продукта 0…100%, аналоговый вход 4…20 мА *) (*Выходы:*) motor1:BOOL:=FALSE; (* включить привод первого транспортера, дискретный выход 1 *) motor2: BOOL:=FALSE; (* включить привод второго транспортера, дискретный выход 2 *) shiber_open: BOOL:=FALSE; (* включить привод шибера на открытие, дискретный выход 3 *) shiber_close: BOOL:=FALSE; (* включить привод шибера на открытие, дискретный выход 4 *) signal: BOOL:=FALSE; (* сигнализация, дискретный выход 5 *) Экран визуализации имитация срабатывания РКС (нефиксируемая кнопка), управляет переменной speed1_to имитация срабатывания РКС, управляет переменной speed2_to кнопка ввода заданного веса, управляет переменной ref_weight кнопка «быстрого» останова, управляет переменной Stop_now кнопка запуска-останова (с фиксацией) управляет глобальной переменной Start_process Экран визуализации подсветка первого транспортера управляется переменными motor1 и speed1 визуализация движения шибера, управляются переменными shiber_open и shiber_close шкала веса подсветка второго транспортера управляется переменными motor2 и speed2 имитация срабатывания концевиков «открыто» и «закрыто», управляют переменными shiber_opened_to и shiber_closed_to Экран визуализации визуализация светового и звукового оповещателей, используется при пусках транспортеров и при аварии, управляется переменной signal шкала веса «сброс» аварии, переменная ok управление шкалой веса посредством переменных weight_plus и weight_minus Глобальные переменные Итого, дополнительные глобальные переменные: ref_weight:REAL:=80; (*заданный вес (кнопка ввода) *) weight_plus:BOOL:=FALSE; (* увеличить вес (имитация) *) weight_minus: BOOL:=FALSE; (* уменьшить вес (имитация) *) speed1_to:BOOL:=FALSE; (* имитация срабатывания РКС первого транспортера *) speed2_to: BOOL:=FALSE; (* имитация срабатывания РКС второго транспортера *) shiber_opened_to: BOOL:=FALSE; (* имитация срабатывания концевика «открыто» *) shiber_closed_to: BOOL:=FALSE; (* имитация срабатывания концевика «закрыто» *) Start_process:BOOL:=FALSE; (* запуск цикла *) ok:BOOL:=FALSE; (* выход из аварии *) Stop_now: BOOL:=FALSE; (* немедленная остановка *) «Обслуживание» визуализации Обслуживание визуализации состоит в преобразовании «имитационных» сигналов в «реальные» и вызове программы управления. Разделение программ обслуживания и управления позволит легко перенести последнюю на целевую платформу. Выполним обслуживание в главной программе PLC_PRG, которую напишем на языке ST: (*Увеличение веса кнопками*) IF weight_plus=TRUE THEN weight:=weight+5; ELSIF weight_minus=TRUE THEN weight:=weight-5; END_IF «Обслуживание» визуализации (*Формирование сигналов РКС*) (*РКС замыкает контакт, когда попросили кнопкой и двигатель запущен*) IF (speed1_to AND motor1) THEN speed1:=TRUE; END_IF (*РКС размыкает контакт, когда двигатель выключен*) IF NOT motor1 THEN speed1:=FALSE; END_IF (*аналогично для второго РКС*) IF (speed2_to AND motor2) THEN speed2:=TRUE; END_IF IF NOT motor2 THEN speed2:=FALSE; END_IF «Обслуживание» визуализации (*Формирования сигналов концевых выключателей*) (*Сигнал формируется, если попросили кнопкой во время открытия*) IF (shiber_opened_to AND shiber_open) THEN shiber_opened:=TRUE; END_IF (*Сигнал снимается при движении шибера в обратную сторону*) IF shiber_close THEN shiber_opened:=FALSE; END_IF (*аналогично для сигнала о полном закрытии шибера*) IF (shiber_closed_to AND shiber_close) THEN shiber_closed:=TRUE; END_IF IF shiber_open THEN shiber_closed:=FALSE; END_IF rele; (*а это вызов программы управления!*) Разработка программы управления Система может находиться в трех активных состояниях: • загрузка; • разгрузка; • авария; и одном пассивном состоянии (покой). Покой Загрузка Разгрузка (закрытие шибера и запуск первого транспортера) (открытие шибера и запуск второго транспортера) Авария (аварийный останов и сигнализация) Запоминание состояний На LD запоминание состояний естественным образом производится с помощью отдельных битов (булевых переменных): PROGRAM rele VAR loading: BOOL:=FALSE; unloading: BOOL:=FALSE; alarm: BOOL:=FALSE; Одновременно может быть установлен только один из трех битов или неустановлен ни один (покой). Управление процессом кнопками Если в состоянии покоя нажата кнопка Start Process и не нажата STOP NOW!, начинаем загрузку. В любом случае при нажатии STOP NOW! переходим в режим «авария». Режим «загрузка» В режиме «загрузка» происходит счет времени. Результат заносится в переменную loading_time типа TIME. Таймер «срабатывает» по истечению 25 сек и обнуляет переменную to_load_t (разрешение на загрузку по времени). Таким образом в течение 25 сек. to_load_t=TRUE и загрузка может продолжаться. Если по каким-либо причинам загрузка затянулась более, чем на 25 сек., это свидетельствует об аварии. Режим «загрузка» Шибер нужно закрыть не более чем через 5 сек. после начала загрузки, после чего не более, чем за 5 сек., нужно запустить первый транспортер. Загрузка должна продолжаться, пока вес меньше заданного. Режим «загрузка» Шибер закрывается если не истекло 5 сек. после начала загрузки и пока он не закрыт. Для запуска двигателя требуется, чтобы 1) время загрузки не истекло; 2) вес был меньше заданного; 3) время на запуск не истекло, либо истекло и РКС сработал; 4) шибер был закрыт. Режим «загрузка» Если есть приказ (motor1_start), запустить двигатель через 1 сек. (в это время дается предупредительный сигнал). Когда вес достигнет заданного, сбросить состояние loading и установить состояние unloading (разгрузка). Режим «загрузка» Переход в режим «авария» (alarm) осуществляется если: 1) истекло максимально допустимое время загрузки; 2) прошло 10 сек. с момента начала загрузки, а РКС не сработал; 3) прошло 5 сек. с момента начала загрузки, а шибер не закрыт. Режим «разгрузка» В режиме «разгрузка» происходит счет времени. Результат заносится в переменную unloading_time типа TIME. Таймер «срабатывает» по истечению 25 сек и обнуляет переменную to_unload_t (разрешение на разгрузку по времени). Таким образом в течение 25 сек. to_unload_t=TRUE и разгрузка может продолжаться. Если по каким-либо причинам загрузка затянулась более, чем на 25 сек., это свидетельствует об аварии. Режим «разгрузка» Второй транспортер нужно запустить не более чем через 5 сек. после начала загрузки, после чего не более, чем за 5 сек., нужно открыть шибер. Загрузка должна продолжаться, пока вес больше нуля. Режим «разгрузка» Второй транспортер останавливается спустя 3 сек. после того, как вес снизится до нуля (для его очистки). Для запуска двигателя транспортера требуется, чтобы 1) время разгрузки не истекло; 2) не было приказа на его остановку (stop=FALSE); 3) время на запуск не истекло, либо истекло и РКС сработал. Режим «разгрузка» Если есть приказ (motor2_start), запустить двигатель через 1 сек. (в это время дается предупредительный сигнал). Открывать шибер нужно если: 1) второй транспортер работает; 2) время для открытия шибера (10 сек. с момента начала разгрузки) не истекло ; 3) шибер еще не открыт. Режим «разгрузка» Если сформирована команда остановить двигатель второго транспортера (stop2=TRUE) и есть команда продолжить процесс (кнопка Start Process нажата) установить режим «загрузка» и сбросить режим «разгрузка». Если кнопка Start Process не нажата сбросить режим «разгрузка» и перейти, тем самым, в режим ожидания. Режим «разгрузка» Переход в режим «авария» (alarm) осуществляется если: 1) истекло максимально допустимое время разгрузки; 2) прошло 5 сек. с момента начала разгрузки, а РКС не сработал; 3) прошло 10 сек. с момента начала разгрузки, а шибер не открыт. Режим «авария» Сброс режима «авария» производится кнопкой «OK». При переходе в режим «авария», мгновенно даются команды на остановку подающего транспортера и закрытие шибера и спустя 5 сек. – на остановку разгрузочного транспортера. Управление сигнализацией Сигнализация срабатывает в следующих случаях: 1) в режиме загрузки перед пуском подающего транспортера (когда дана команда на пуск, но выдержка времени перед пуском не закончена); 2) в режиме разгрузки перед пуском разгрузочного транспортера (когда дана команда на пуск, но выдержка времени перед пуском не закончена); 3) в режиме «авария». Полный список локальных переменных VAR loading: BOOL:=FALSE; (*режим загрузка*) unloading: BOOL:=FALSE; (*режим разгрузки*) alarm: BOOL:=FALSE; (*режим авария*) timer: TON; (*таймер загрузки*) loading_time: TIME; (*время загрузки*) to_load_t: BOOL; (*разрешение на загрузку по времени*) time_more_1: BOOL; (*время на закрытие шибера или запуск второго транспортера истекло*) time_more_2: BOOL; (*время на запуск первого транспортера или на открытие шибера истекло*) to_load_w: BOOL; (*разрешение на загрузку по весу*) motor1_start: BOOL; (*команда на пуск первого транспортера*) timer1: TON; (*таймер запуска первого транспортера*) Полный список локальных переменных timer2: TON; (*таймер разгрузки*) unloading_time: TIME; (*время разгрузки*) to_unload_t: BOOL; (*разрешение на разгрузку по времени*) to_unload_w: BOOL; (*разрешение на разгрузку по весу*) timer3: TON; (*таймер остановки второго транспортера*) stop2: BOOL; (*команда остановки второго транспортера*) motor2_start: BOOL; (*команда пуска второго транспортера*) timer4: TON; (*таймер пуска второго транспортера*) timer5: TON; (*таймер остановки второго транспортера при аварии*) END_VAR