Прежде всего отмечу, что эта заметка не рассчитана на домащних любителей — вряд ли у кого завалялся дома сименсовский контроллер, хотя бы S7-200. Заметка, возможно, поможет тем, кто начинает (как и я) осваивать программирование контроллеров Siemens для обучения или применения знаний в обслуживании контроллеров. Эти контроллеры стоят на самой разнообразной технике, и иметь хотя бы минимальное представление об их работе и программировании будет, несомненно, полезно.
Описываемая конструкция (пункт пропуска) базируется на стенде Festo, который оснащен контроллером CPU 1512C-1 PN, имеет набор датчиков и пневматических исполнительных механизмов, а также программное обеспечение TIA Portal V15 (Totally Integrated Automation Portal).
Начать, конечно, следует с создания проекта. Сделать это очень просто: в меню программы выбрать Progect -> New (рис. 1).
В открывшемся диалоговом окне заполнить соответствующие графы и нажать кнопку Create (см. рис. 2).
После этого проект будет создан и нам надо бы его чем-нибудь наполнить. Поэтому выберем в окне проекта gate_1500 строку Add new device (см. рис. 3.)
Первое устройство, которое надо вставить в проект — это собственно контроллер. Сначала внимательно прочитайте на корпусе имеющегося у вас контроллера его полное наименование (см. рис. 4).
Выбрав пункт Add new device в открывшемся диалоговом окне нажимаем (если надо) кнопку Controllers и в открывшемся списке ищем наш контроллер.
Искать надо по полному наименованию, включая article number (в нашем случае — 6ES7 512-1CK01-0AB0) (см. рис. 6).
После выбора контроллера в проект автоматически добавляются все дополнительные блоки, входящие в данную комплектацию (см. рис. 7).
В нашем случае это модуль аналогового ввода/вывода и два модуля цифрового ввода/вывода.
Для работы со схемой будем использовать цифровой модуль DI-16/DQ-16_2 (Module). Выделим его мышкой (рис. 8) и перейдем на вкладку IO tags (см. рис. 9).
Теперь можно начинать заполнение таблицы контроллера, однако перед тем, как перейти к занесению параметров, рассмотрим схему, которую будем программировать.
Нашей задачей является программирование пункта пропуска автотранспорта со шлагбаумом. Схема приведена на рис. 10.
Назначение элементов схемы следующее.
1. Оптический датчик S1 InBusy предназначен для определения наличия препятствия в полосе шлагбаума. Работает в цикле закрытия шлагбаума и при открытом по сработавшему сигналу InRfid или InBack. При срабатывании прекращается цикл закрытия шлагбаума, шлагбаум открывается и ждет освобождения проезда, после чего закрывается. Предназначен для предотвращения повреждения транспорта и шлагбаума и нанесения травм персоналу.
2. Магнитный датчик S2 InRfid предназначен для сканирования пропуска (в качестве "пропуска" используется любая металлическая деталь). При срабатывании датчика шлагбаум открывается, в течение 30 сек. ожидает проезда транспорта. Если транспорт за 30 сек. не пересек линию шлагбаума (не сработал датчик InBusy), то шлагбаум через 30 сек. закрывается. Если транспорт пересек линию шлагбаума раньше окончания этого интервала, то через 3 сек. после освобождения проезда шлагбаум закрывается.
3. Магнитный датчик S3 InBack работает аналогично датчику InRfid, только открывает проезд для выезда транспорта.
4. Выключатель сигнала пожарной тревого S4 InFire предназначен для обеспечения свободной эвакуации персонала, транспорта и прибытия спасательной техники. При срабатывании InFire шлагбаум открывается и остается в открытом положении до снятия сигнала.
5. Электромагнитный распределитель воздуха M1 предназначен для подачи воздуха на входы OPEN и CLOSE шлагбаума A1 в зависимости от того, что требуется сделать: закрыть или открыть шлагбаум. Электромагнит K1.1 и клапан M1.1 Qclose должны сработать при необходимости закрыть шлагбаум, а электромагнит K1.2 и клапан M1.2 Qopen должны сработать при необходимости открыть шлагбаум
6. Магнитный датчик S5.1 InClose фиксирует закрытое положение шлагбаума. Срабатывает, когда шлагбаум находится в закрытом положении.
7. Магнитный датчик S5.2 InOpen фиксирует открытое положение шлагбаума. Срабатывает, когда шлагбаум находится в открытом положении.
8. Пневматический дроссель V1 регулирует давление на открытие шлагбаума. Регулируется так, чтобы врема перехода шлагбаума из закрытого в открытое положение составляло 2-3 сек.
9. Пневматический дроссель V2 регулирует давление на закрытие шлагбаума. Регулируется так, чтобы врема перехода шлагбаума из открытого в закрытое положение составляло 2-3 сек.
10. Распределитель V3 предназначен для отвода воздуха на измеритель давления InPressure. Измерение производится при закрывании шлагбаума и служит для предотвращения поломки шлагбаума и транспорта в том случае, если шлагбаум при закрытии упрется в препятствие.
11. Датчик давления S6 InPressure измеряет давление воздуха при закрытии шлагбаума. Если давление будет выше установленного, шлагбаум должен открыться. Установка давления срабатывания должна составлять 2Pзакр.
12. Сигнальная лампа EL1 Qfire предназначена для индикации сигнала пожарной тревоги. Зажигается при срабатывании выключателя пожарной тревоги InFire.
13. Шлагбаум A1. Управляется подачей воздуха на пневмовходы OPEN и CLOSE. На шлагбауме установлены датчики крайних положений: закрытого InClose и открытого InOpen.
14. Распределитель воздуха V1 с электромагнитным управлением с помощью клапанов M1.1 и M1.2, которые определяют направление подачи воздуха.
Исходное положение шлагбаума, в которое он устанавливается при включении питания (при условии, что нет сработавших датчиков) — закрытое. Блок-схема программы приведена на рис. 11.
Лично мне больше нравится работать не с блок-схемой, которую довольно сложно составлять и в которую с легкостью закрадываются ошибки, а с таблицей истинности. Таблица истинности основного блока приведена в табл. 1.
Open | Close | Fire | Busy | Free | GateOpen | GateClose |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 | 0 | 1 | 0 |
0 | 0 | 0 | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 | 0 | 0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | Запрещенная комбинация |
|
1 | 1 | 0 | 0 | 1 | ||
1 | 1 | 0 | 1 | 0 | ||
1 | 1 | 0 | 1 | 1 | ||
1 | 1 | 1 | 0 | 0 | ||
1 | 1 | 1 | 0 | 1 | ||
1 | 1 | 1 | 1 | 0 | ||
1 | 1 | 1 | 1 | 1 |
В таблице 2. приведено описание сигналов.
Название сигнала OB1 |
Вход/выход CPU |
Описание функциональности |
— | %I12.0 (InRfid) | Сигнал разрешения на въезд |
Open | %I12.1 (InOpen) | Сигнал датчика открытых ворот |
Close | %I12.2 (InClose) | Сигнал датчика закрытых ворот |
Fire | %I12.3 (InFire) | Сигнал пожарного датчика |
Busy | %I12.4 (InBusy) | Сигнал наличия препятствия в проезде |
Free | — | Сигнал разрешения проезда на вход/выход |
— | %I12.5 (InBack) | Сигнал разрешения на выезд |
— | %I13.4 (InPressure) | Сигнал превышения давления при закрытии шлагбаума |
GateOpen | %Q6.1 (Qopen) | Сигнал на открытие шлагбаума |
GateClose | %Q6.2 (Qclose) | Сигнал на закрытие шлагбаума |
GateFire | %Q6.3 (Qfire) | Сигнал индикации пожарной тревоги |
Отдельно остановимся на сигнале Free, который отсутствует в описании датчиков.
Теперь вернемся к проекту. Первая задача — описать все используемые в схеме входы/выходы. Для этого на вкладке IO tags введем обозначения сигналов в соответствии с принципиальной схемой (рис. 12).
Кроме обозначений сигналов полезно в поле Comment ввести короткое описание сигнала (рис. 13).
Следующий шаг — описание сигналов функционального блока, который надо вставить в основной блок Main (OB1).
Добавление дополнительных блоков — операция необязательная, особенно в случае несложных схем. Однако в нашем варианте логику работы части схемы проще запрограммировать не элементами, а программным кодом. Поэтому займемся созданием нового блока.
Пока что наш основной блок и его цепь Network 1 совершенно пустые (рис. 14). Выбираем Add new block и в появившемся окне кнопкой Function block устанавливаем параметры блока (рис. 15).
Нажав кнопку OK мы увидим, что в списке Program blocks появилась строка Block_1 (FB1). В таблицу Block_1 необходимо занести имена входов/выходов блока FB1 (рис. 16), в соответствии с именами, которые ранее заносили при описании модуля DI-16/DQ-16_2 (Module).
Отличие заключается в том, что для блока цифрового ввода/вывода заносили имена для физических входов, которые будут соединяться с соответствующими датчиками и исполнительными механизмами, а для блока FB1 записываем логические имена, которые будут соединяться как с физическими, так и с программными входами или ячейками памяти контроллера с помощью соединений на схеме OB1.
Следует отметить, что формат блока зависит от выбора языка (Language). Если выбран язык не SCL, а LAD, предполагающий программирование функциональными блоками, то вид блока будет аналогичен блоку OB1 (см. рис. 17 и 18).
Теперь можно перетащить блок FB1 в цепь Network1, ухватив его мышкой. Если все сделано правильно, то на линии цепи Network1 появится зеленый квадратик, указывающий, куда можно поставить наш новый блок (см. рис. 19).
При установке блока FB1 в цепь Network1 блока OB1появляется окно, сообщающее о создании блока данных DB1 для функционального блока FB1 (см. рис. 20).
После подтверждения создания блока данных кнопкой OK в нашем проекте появляется блок данных DB1, а на схеме цепи Network1 — функциональный блок FB1 с привязанной к нему базой DB1 (см. рис. 21).
Красной линией на рисунке обведены элементы, которые мы будем устанавливать в нашу схему Network1. Это, так сказать, "часто используемые" элементы. Полный список возможных элементов схемы рассмотрим позже, а пока ознакомимся с тем, как "подключать" входы/выходы функционального блока к реальным входам/выходам контроллера.
На рис. 22 показано, как подключать входы. Для этого следует вписать обозначение входа контроллера в поле false с соответствующим наименованием.
При вводе в поле ввода входа/выхода начальных символов, совпадающих с существующим названием входа (выхода), выводится список имен (рис. 23) из которого можно выбрать нужное курсором.
Это имя (на рис. 24 это InFire) будет подставлено в поле ввода.
В процессе разработки программы контроллера может потребоваться добавить сигнал входа/выхода. Ввод нового сигнала производится на вкладке Block_1 (FB1) (см. рис. 25).
Для добавления новой строки в левой верхней части окна блока есть кнопка Add row (на рисунке обведена красной линией). На вкладке Block_1_DB (DB1) кнопка добавления строки для ввода неактивна (см. рис. 26).
Введем в схему дополнительный сигнал ввода/вывода Trigger1 (см. рис. 27).
Однако на вкладке Block_1_DB (DB1) этот сигнал не появился, потому что требуется обновить блок данных.
Для этого в меню, вызываемом по правой кнопке мышки следует выбрать пункт Update interface (см. рис. 28), после чего в списке блока данных DB1 появится сигнал Trigger1 (см. рис. 29).
Но и этого недостаточно. Необходимо обновить не только блок данных DB1, но и блок FB1, входящий в состав блока OB1. То, что это блок требует обновления можно увидеть по красному цвету окантовки блока FB1 на вкладке OB1 (рис. 30).
Также, как и при обновлении базы данных по правой кнопке мышки вызываем меню, в котором выбираем пункт Update block call (см. рис. 31).
При выполнении операции обновления на экран будет выведено состояние блока до и после синхронизации в виде формы Interface synchronization (см. рис. 32).
Если нас (а главное — компилятор) все устраивает, что видно по цвету формы в окне New interface, то нажимаем OK и смотрим на полученный результат (см. рис. 33).
То, что при программировании контроллера в разных блоках (и даже в одном блоке) можно использовать как программный код, так и логические элементы — огромное преимущество этого способа программирования. Рассмотрим, как можно устанавливать элементы на примере формирования сигнала Busy блока FB1.
Сначала опишем логику формирования сигнала Busy. Этот сигнал работает для предотвращения повреждения проезжающей через пункт пропуска техники, если шлагбаум начнет закрываться. Наличие помехи в полосе проезда фиксируется оптическим датчиком S1, который и формирует сигнал InBusy. Таким образом, сигнал Busy должен быть активен или в случае движения шлагбаума на закрывание, при этом при появлении сигнала InBusy шлагбаум должен менять направление движения на открывание, или тогда, когда шлагбаум находится в закрытом положении, при этом при появлении сигнала InBusy запрещается закрытие шлагбаума и он остается в закрытом положении.
Таблица истинности работы приведена в табл. 3, при этом используется промежуточный сигнал Trigger1.
InOpen | InClose | InBusy | Trigger1 | Busy |
0 | 0 | 0 | 0, если шлагбаум был закрыт 1, если шлагбаум был открыт |
0 |
0 | 0 | 1 | 0, если шлагбаум был закрыт 1, если шлагбаум был открыт |
0, если Trigger1 = 0 1, если Trigger1 = 1 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | Запрещенная комбинация | |
1 | 1 | 1 | Запрещенная комбинация |
Из таблицы видно, что сигнал Trigger1 сохраняет свое состояние в промежутке между появлением входных сигналов InOpen и InClose. Таким образом определяется направление движения шлагбаума на открытие или на закрытие. Такую комбинацию проще всего реализовать с помощью обычного RS-триггера, который будет вырабатывать сигнал Trigger1. А сигнал Trigger1 по схеме AND объединяется с сигналом InBusy для получения сигнала управления Busy.
Чтобы поместить на схеме блока OB1 RS-триггер, надо его найти. Для этого на вкладке Instructions открываем список Basic instructions и в нем открываем список Bit logic operations (см. рис. 34). И в открывшемся списке находим RS (см. рис. 35).
После этого, "ухватив" значок RS-триггера мышкой подключаем его ко входу Busy блока FB1. На вход R триггера заводим входной контакт, пока без обозначения (см. рис. 36).
Внутренний сигнал триггера на этом рисунке неправильный (InBusy) и его надо исправить на Trigger1. Для исправления в окошке параметра триггера в выпавшем списке выбираем строку "Block_1_DB" (см. рис. 37).
После выбора "Block_1_DB" появляется список сигналов блока FB1, где и выбираем сигнал Trigger1 (см. рис. 38).
Соответственно на схеме меняется внутренний сигнал триггера и, поставив последовательно с выходом триггера вход InBusy, организуем тем самым необходимую нам схему AND (см. рис. 39).
- Примечание
В TIA portal используется два типа RS-подобных триггеров: RS и SR. Отличие этих триггеров заключается в реакции на присутствие активных уровней на входах R и S одновременно. В RS-триггере собранном на реальных логических элементах такая комбинация считается недопустимой и состояние на выходе устанавливается случайным образом.
В контроллерах Siemens в этом случае у триггера RS на выходе устанавливается TRUE, а у триггера SR — FALSE. При "включении питания" у обоих типов триггеров состояние выхода — FALSE.
В процессе работы не следует забывать делать две вещи. Во-первых компилировать проект, для чего используется кнопка Compile (см. рис. 40).
И во-вторых, в случае отсутствия ошибок компиляции (см. рис. 41) сохранять проект.
Прежде всего следует убедиться в наличии установленной программы PLC SIM. Симулятор устанавливается отдельно, как правило после установки на рабочем столе присутствует как значок TIA portal, так и PLC SIM (см. рис. 42).
Если симулятор установлен, то в среде TIA portal его можно запустить кнопкой Start simulation (на рис. 43 кнопка обведена красной линией).
При запуске на экране появляется панель симулятора (рис. 44, слева вверху) и диалог поиска контроллера для загрузки в него проекта Extended download to device. И первый шаг — поиск нашего виртуального контроллера. Для запуска поиска надо нажать кнопку Start search (на рис. 44 отмечена стрелкой).
Обратите внимание, что на панели эмулятора контроллера отсутствует IP-адрес (рис. 45) и имя проекта. Дело в том, что симулятор использует свой собственный проект, который следует создать при запуске, а IP-адрес появится после того, как виртуальный контроллер будет "найден".
После нажатия кнопки Start search, если все сделано правильно, на экран выводится информация об обнаруженном контроллере и можно загружать в него проект, с помощью кнопки Load (на рис. 46. отмечена стрелкой).
Перед загрузкой выводится окно Load preview, где в очередной раз следует нажать кнопку Load (на рис. 47 обведена кружком).
После успешной загрузки проекта в контроллер (на рис. 48 подчеркнуто) можно выбрать вариант работы контроллера после загрузки — Start/Stop (на рис. 48 указан стрелкой). Пока не будем запускать контроллер, и, оставив режим No action, нажимаем кнопку Finish (на рис. 48 обведена).
Теперь приступим к созданию проекта симулятора, который необходим для получения доступа к физическим входам/выходам контроллера, что требуется при отладке проекта. Чтобы запустить проект симулятора на панели эмулятора контроллера надо нажать кнопку Switch to project view (на рис. 49 указана стрелкой).
Окно симулятора контроллера закрывается и вместо него открывается окно просмотра проекта PLC SIM, естественно, совершенно пустое (см. рис. 50). Как обычно, создаем новый проект (на рис. 50 указано стрелкой).
Чтобы не путаться, при создании проекта в стандартном диалоге (см. рис. 51) указываем имя проекта TIA portal. Проекты TIA portal и PLC SIM имеют разные расширения (.ap15_1 для TIA portal и .sim15_1 для симулятора), и хранятся в разных папках (в папке Automation для TIA portal и в папке Simulation для симулятора). Естественно, расширения указаны для версий 15.1.
В процессе создания проекта симулятор загружает в свой проект данные из проекта TIA portal и подключается к эмулятору контроллера. В строке состояния проекта симулятора выводится адрес подключения и индикатор, показывающий обмен данными между контроллером и проектом TIA portal (см. рис. 52).
Раскрываем окно Project tree, для чего нажимаем кнопку Expand (на рис. 53. указана стрелкой).
Чтобы получить доступ к сигналам контроллера нам следует заполнить таблицу SIM_table, которых может быть несколько. Для этого раскрываем список SIM_tables (см. рис. 54).
И в нем выбираем таблицу, имеющуюся по умолчанию — SIM_table_1 (см. рис. 55). Чтобы окну собственно таблицы на экране было доступно больше пространства, можем сложить окно Project tree кнопкой Collapse (на рис. 55 отмечена стрелкой).
В таблицу вписываем те сигналы, которые требуются для проверки работы проекта. В указанном примере это сигналы InClose и InOpen. Ввод имен сигналов ничем не отличается от работы в TIA portal. Их можно вводить вручную, либо выбирать из списка (см. рис. 56).
При необходимости можно вернуться к "компактному" виду, для этого следует нажать знак стрелки (на рис. 57 на него указывает красная стрелка) и затем выбрать значок Switch to compact view (на рис. 57 обведен красным кружком).
На появившемся окне контроллера теперь есть и IP-адрес и название проекта (см. рис. 58).
Остается перейти к мониторингу нашего проекта, для чего надо нажать кнопку Monitoring on/off (см. рис. 59).
При включенном мониторинге можно смотреть на прохождение сигналов по цепям схемы и блоков. Состояние FALSE показывается синей пунктироной линией, а TRUE — сплошной зеленой (см. рис. 60).
Чтобы управлять состоянием сигналов контроллера вернемся к таблице SIM_table_1 менеджера проектов PLC SIM. Для установки необходимого состояния сигнала есть два способа. Для установки постоянного уровня FALSE или TRUE в столбце Bits таблицы есть специальное поле, в котором можно установить/сбросить метку. Установленная метка соответствует состоянию TRUE, а сброшенная — состоянию FALSE. (стрелки на рис. 61).
Если требуется кратковременно изменять уровень с FALSE на TRUE, то для этого можно воспользоваться кнопкой в нижней части окна проекта (на рис. 61 обведена кружком). Название кнопки зависит от выбранного из списка SIM_table_1 параметра (на рисунке это InClose). Когда кнопка удерживается в нажатом состоянии соответствующий сигнал меняет свое состояние на TRUE.
Добавим в таблицу SIM_table_1 сигнал InBusy для проверки работы нашей схемы (см. рис. 62) и установим сигнал InOpen = TRUE (см. рис. 63).
Выход триггера установился в состояние TRUE, т. к. InOpen подается на вход S1 триггера. Но т. к. InBusy = FALSE на входе Busy блока FB1 по-прежнему остается состояние FALSE (см. рис. 63).
Теперь снимем сигнал InOpen, и убедимся, что выход триггера остался в состоянии TRUE, что соответствует логике работы RS-триггера (см. рис. 64).
Переведем сигнал InBusy в состояние TRUE и увидим, что на входе Busy FB1 появился уровень TRUE (см. рис. 65), таким образом при перемещении шлагбаума из открытого в закрытое положение появление помехи в полосе шлагбаума вызывает воявление TRUE на входе Busy.
Установим сигнал InBusy = FALSE, а сигнал InClose = TRUE (см. рис. 66, шлагбаум установлен в закрытое положение). Соответственно выход триггера стал равен FALSE.
Установив InBusy = TRUE можно убедиться, что при закрытом шлагбауме Busy = FALSE (см. рис. 67).
Если теперь сигнал InClose = FALSE (шлагбаум стал открываться, см. рис. 68), то Busy все равно останется FALSE даже при наличии InBusy = TRUE.
Слдедовательно логика работы схемы полностью соответствует таблице истинности из раздела 6. После проверки схемы остановим мониторинг кнопкой Monitoring on/off.
0001 IF (#Close = 0 AND #Fire = 0 AND #Busy = 0 AND #Free = 0) THEN
0002 // Statement section IF
0003 #GateClose:=TRUE;
0004 #GateOpen:=FALSE;
0005 ELSE
0006 #GateClose:=FALSE;
0007 IF ((#Open = 1) OR ((#Open = 0) AND (#Close = 1) AND (#Fire = 0) AND (#Busy
= 1) AND (#Free = 0)) OR ((#Open = 0) AND (#Close = 1) AND (#Fire = 0) AND
(#Busy = 0) AND (#Free = 0))) THEN
0008 // Statement section IF
0009 #GateOpen := 0;
0010 ELSE
0011 #GateOpen := 1;
0012 END_IF;
0013 END_IF;
0014 IF #Fire = 1 THEN
0015 // Statement section IF
0016 #GateFire := 1;
0017 ELSE
0018 #GateFire := 0;
0019 END_IF;