Пример (упрощенный)

advertisement
Практическая работа №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
Download